Micropython_Python_SSD1306_OLED显示汉字之7

Micropython_Python_SSD1306_OLED显示汉字之7

00零基础7-7

为第十届广东科学中心创意机器大赛,写了一系列的零基础入门代码,进行了详细注释。实在没有太多时间,如果有错,请指出,以后会少写点注释了,比写代码花的时候还要多。by傅20210828
希望对于热爱编程的学生有所帮助。

前面提到了一种新的技术:framebuf,帧缓冲区类,并且得到合适的数据格式,数据依然是
多次扫描时,字体各块同一行的数据拼接在一起。这种数据格式,数组元素极少。下面实现汉字显示。

from machine import I2C, Pin
from ssd1306 import SSD1306_I2C
import time
import framebuf #帧缓冲区的类

i2c = I2C(scl=Pin(2), sda=Pin(14))#检测硬件的代码,直接写在函数外面了
addr = i2c.scan()
if len(addr):
    oled = SSD1306_I2C(128, 64, i2c, addr=addr[0])
    oled.write_cmd(0xA0)
    oled.write_cmd(0xC0)
    oled.text("OLED OK!",10,10)
    oled.show()
    time.sleep_ms(300)
else:
    print("连接128*64的OLED屏不成功,查GPIO2和GPIO14")


#复制OLED显示汉字之6.py生成的数据格式
fonts_buf = {
"科":#字号=32 本字模适合framebuf方式
[32,b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x0C\x00\xE0\x00\x3C\x00\xC0\x07\xE0\x00\xC0\x38\xC0\x00\xC0\x00\xC0\x60\xC0\x00\xC0\x30\xC0\x00\xC0\x18\xC0\x00\xC0\x18\xC0\x00\xC4\x00\xC0\x3F\xFE\x00\xC0\x00\xC0\x00\xC0\x00\xC0\x40\xC0\x01\xC0\x60\xC0\x01\xF0\x30\xC0\x03\xDC\x10\xC0\x02\xCC\x00\xCC\x06\xC4\x00\xFC\x04\xC4\x0F\xC0\x08\xC1\xF0\xC0\x10\xC6\x00\xC0\x20\xC0\x00\xC0\x40\xC0\x00\xC0\x00\xC0\x00\xC0\x00\xC0\x00\xC0\x00\xC0\x00\xC0\x00\xC0\x00\xC0\x00\xC0\x00\xC0\x00\x80\x00\x80\x00\x00\x00\x00'],
"学":#字号=24 本字模适合framebuf方式
[24,b'\x00\x00\x00\x00\x20\x40\x04\x30\x60\x02\x18\xC0\x03\x18\x80\x01\x18\x80\x01\x01\x00\x1F\xFF\xFC\x10\x00\x0C\x10\x00\x10\x37\xFF\xC0\x00\x01\x80\x00\x02\x00\x00\x04\x00\x00\x08\x08\x7F\xFF\xFC\x00\x08\x00\x00\x08\x00\x00\x08\x00\x00\x08\x00\x00\x98\x00\x00\x78\x00\x00\x10\x00\x00\x00\x00'],
# M 字模数据有错!已经忽略。数据长度: 48
"中":#字号=16 本字模适合framebuf方式
[16,b'\x01\x00\x01\x00\x01\x00\x01\x00\x3F\xF8\x21\x08\x21\x08\x21\x08\x21\x08\x21\x08\x3F\xF8\x21\x08\x01\x00\x01\x00\x01\x00\x01\x00'],
"心":#字号=14 本字模适合framebuf方式
[14,b'\x00\x00\x03\x00\x01\x80\x01\x80\x06\x00\x36\x38\x36\x18\x76\x0C\x66\x0C\x66\x00\x06\x30\x06\x30\x07\xF0\x00\x00'],
"K":#字号=48 本字模适合framebuf方式
[48,b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x10\x00\x0E\x00\x00\x00\x78\x00\x0F\x00\x00\x01\xFC\x00\x0C\x00\x00\x1F\xF0\x00\x0C\x00\x01\xFE\x00\x00\x0C\x00\x0E\x06\x00\x00\x0C\x00\x00\x06\x00\x60\x0C\x00\x00\x06\x00\x38\x0C\x00\x00\x06\x00\x1E\x0C\x00\x00\x06\x00\x0E\x0C\x00\x00\x06\x00\x0E\x0C\x00\x00\x06\x00\x06\x0C\x00\x00\x06\x08\x00\x0C\x00\x00\x06\x1C\x00\x0C\x00\x1F\xFF\xFE\x00\x0C\x00\x00\x0E\x00\x00\x0C\x00\x00\x0E\x00\x00\x0C\x00\x00\x0E\x00\x60\x0C\x00\x00\x1E\x00\x30\x0C\x00\x00\x1F\x00\x3C\x0C\x00\x00\x3E\xC0\x1C\x0C\x00\x00\x36\x70\x0E\x0C\x00\x00\x76\x78\x0C\x0C\x20\x00\x66\x38\x0C\x0C\x30\x00\xE6\x1C\x00\x0C\x78\x00\xC6\x18\x00\x0D\xF8\x01\x86\x08\x00\x3E\x00\x03\x06\x00\x07\xEC\x00\x07\x06\x01\xF8\x0C\x00\x06\x06\x1F\x00\x0C\x00\x0C\x06\x00\x00\x0C\x00\x18\x06\x00\x00\x0C\x00\x30\x06\x00\x00\x0C\x00\x00\x06\x00\x00\x0C\x00\x00\x0E\x00\x00\x0C\x00\x00\x0E\x00\x00\x0C\x00\x00\x0E\x00\x00\x0C\x00\x00\x0E\x00\x00\x0C\x00\x00\x0E\x00\x00\x0E\x00\x00\x0E\x00\x00\x0E\x00\x00\x0E\x00\x00\x0E\x00\x00\x0E\x00\x00\x0E\x00\x00\x08\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'],
}

def buf_CN(ch_str,x,y):
    word=0
    old_size=0
    for k in ch_str:
        datas=""
        ch_size=fonts_buf[k][0]#只用于正方形字体方块字,得到字号
        fbuf = framebuf.FrameBuffer(bytearray(fonts_buf[k][1]),ch_size,ch_size,framebuf.MONO_HLSB)#前面的参数是宽,后面是高
        oled.blit(fbuf,x+old_size,y)#最重要的语句之一。后面两参数指显示的位置
        word+=1
        old_size+=ch_size
        del fbuf #清理内存
    oled.show()

'''
==============================================================================
调用函数,显示汉字,看看显示速度。有没有提升?!
==============================================================================
'''
oled.fill(0)
print('请观察OLED屏,等待结果....')

starttime = time.ticks_us() #开始计时,统计时间,看看程序的效率
for i in range(4):#测试多次,求平均值
    buf_CN("心学K科", 0, 0)
endtime=time.ticks_diff(time.ticks_us(), starttime)/4000
print("ShowCN1显示4个字的平均时间:", endtime, "毫秒")

oled.text("OK!"+str(endtime)+"ms",0,52)
oled.show()

'''OLED屏显示汉字的一系列文字和代码,写完了,供玩耍,by傅20210828'''
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值