Micropython_Python_SSD1306_OLED显示汉字之4

Micropython_Python_SSD1306_OLED显示汉字之4

00零基础7-4

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

OLED显示汉字之3.py得到了新的字模数据
现在就按字体各行拼接的思路,一次显示一个完整的行,试一试


from machine import I2C, Pin
from ssd1306 import SSD1306_I2C
import time
oled = None

def check():
    global oled
    while True:
        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)
            break
        else:
            print("连接128*64的OLED屏不成功,当前代码的管脚要求GPIO2和GPIO14")
            return

'''
=======================================
使用了重新拼接的新字模数据!!
=======================================
'''
fontsLine = {
"科":#字号=32 行列式扫描,适合:行合并、整行显示
[32,0x00000000,0x00000000,0x00000080,0x000C00E0,0x003C00C0,0x07E000C0,0x38C000C0,0x00C060C0,0x00C030C0,0x00C018C0,0x00C018C0,0x00C400C0,0x3FFE00C0,0x00C000C0,0x00C040C0,0x01C060C0,0x01F030C0,0x03DC10C0,0x02CC00CC,0x06C400FC,0x04C40FC0,0x08C1F0C0,0x10C600C0,0x20C000C0,0x40C000C0,0x00C000C0,0x00C000C0,0x00C000C0,0x00C000C0,0x00C000C0,0x00800080,0x00000000,],
"学":#字号=24 行列式扫描,适合:行合并、整行显示
[24,0x000000,0x002040,0x043060,0x0218C0,0x031880,0x011880,0x010100,0x1FFFFC,0x10000C,0x100010,0x37FFC0,0x000180,0x000200,0x000400,0x000808,0x7FFFFC,0x000800,0x000800,0x000800,0x000800,0x009800,0x007800,0x001000,0x000000,],
# M 字模数据有错!数据长度: 48
"中":#字号=16 行列式扫描,适合:行合并、整行显示
[16,0x0100,0x0100,0x0100,0x0100,0x3FF8,0x2108,0x2108,0x2108,0x2108,0x2108,0x3FF8,0x2108,0x0100,0x0100,0x0100,0x0100,],
"心":#字号=14 行列式扫描,适合:行合并、整行显示
[14,0x0000,0x0300,0x0180,0x0180,0x0600,0x3638,0x3618,0x760C,0x660C,0x6600,0x0630,0x0630,0x07F0,0x0000,],
"K":#字号=48 行列式扫描,适合:行合并、整行显示
[48,0x000000000000,0x000000000000,0x000000000800,0x000010000E00,0x000078000F00,0x0001FC000C00,0x001FF0000C00,0x01FE00000C00,0x0E0600000C00,0x000600600C00,0x000600380C00,0x0006001E0C00,0x0006000E0C00,0x0006000E0C00,0x000600060C00,0x000608000C00,0x00061C000C00,0x1FFFFE000C00,0x000E00000C00,0x000E00000C00,0x000E00600C00,0x001E00300C00,0x001F003C0C00,0x003EC01C0C00,0x0036700E0C00,0x0076780C0C20,0x0066380C0C30,0x00E61C000C78,0x00C618000DF8,0x018608003E00,0x03060007EC00,0x070601F80C00,0x06061F000C00,0x0C0600000C00,0x180600000C00,0x300600000C00,0x000600000C00,0x000E00000C00,0x000E00000C00,0x000E00000C00,0x000E00000C00,0x000E00000E00,0x000E00000E00,0x000E00000E00,0x000E00000E00,0x000800000800,0x000000000000,0x000000000000,],
}


def ShowCN4(ch_str, x_axis, y_axis):    
    global oled
    words = 0 
    for k in ch_str: 
        byte_data = fontsLine[k]#换了字模数据
        ch_size=byte_data[0] #优化:已经在数据0元素里直接指示了字号大小,不必再通过计算得到字号
        num=int((ch_size-1)/8)+1#扫描总轮数
        
        for y in range(0,ch_size):
            tem=byte_data[y+1]#多次读取数组同一个元素时,可以赋值到变量,减少数组操作,能提升速度,注意,数据从y+1开始
            if(tem!=0):
                a = bin(tem) ##都保留原来的优化之处
                ss=len(a)
                for x in range(2,ss): 
                    if(int(a[x])):
                        oled.pixel(num*8-ss+ words + x + x_axis, y + y_axis, 1)#优化:这种方法少了求余数的运算 % ch_size 
                        # 注意描点位置的变化,直达亮点的位置描点。想想为什么是:num*8-ss ?ch_size-ss行不行?
        words += ch_size
    oled.show()
    

'''
==============================================================================
调用函数,显示汉字,看看显示速度。有没有提升?!
==============================================================================
'''
check()

oled.fill(0)#熄屏
print('请观察OLED屏,等待结果....')

starttime = time.ticks_us() #开始计时,统计时间,看看程序的效率
for i in range(4):#测试多次,求平均值
    ShowCN4("心学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()



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值