Micropython_Python_SSD1306_OLED显示汉字之3

Micropython_Python_SSD1306_OLED显示汉字之3

00零基础7-3

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

前面的ShowCN2函数,速度提升明显!在一般的场合已经满足要求,但是显示4个混合字,约需1秒钟。
有没有更好的优化方法呢?
慢的原因有很多,大量的数组操作,大数组还占用了更多的内存,大量的字符串操作,大量的循环嵌套,等等

依然从原始数据入手!
当前取模显示汉字是采用的是“行列式”扫描,如果采用整行扫描,一次显示一个整行,这样的速度会不会快一点呢?
这是个好想法!

可惜!!该取模软件“每次取8个点作为一个字节,存为一个数据”,无法扫描整行得到一个多字节数据。
如果能把一整行的像素点保存为一个数据,这样就减少了很多循环,是个可以尝试的思路。

那么如何得到这样的字模数据呢?
一种方法,有兴趣的同学可以自己做一个整行扫描的软件!
另一种方法,估计同学们也能想到:拿原始的数据进行拼接,形成新的字模数据!
当然,如果在显示汉字的主程序里实时拼接原始数据,耗时肯定会更长!因为增加了更多的数组和字符串的操作。

可行的方法是:新写一个程序,通过该程序,将原始字模数据重新处理,形成新数据后,直接拿来用,这就避免了在主程序内的耗时。
重新写一个程序是值得的!

为了便于原始数据的处理,改变一下字模软件的取模参数:
输出数制:十六进制
取模方式:行列式
取模方向:顺向
输出数制16进制
自定义格式:
注释前缀:#
数据前缀:"
数据后缀:"
其余内容全部清空。数据的样子,其实与前面的数据没有太大区别,只是格式变了一下,
存为字符串作为尝试,当然原来的数据格式也是可以处理的,怎么简单怎么来。

依然要求是正方形字体的数据!

内联代码片

fonts = {
 "科": # 32号,宋体
    ["00","00","00","00","00","07","38","00","00","00","00","00","3F","00","00","01","01","03","02","06",
    "04","08","10","20","40","00","00","00","00","00","00","00","00","00","00","0C","3C","E0","C0","C0",
    "C0","C0","C0","C4","FE","C0","C0","C0","F0","DC","CC","C4","C4","C1","C6","C0","C0","C0","C0","C0",
    "C0","C0","80","00","00","00","00","00","00","00","00","60","30","18","18","00","00","00","40","60",
    "30","10","00","00","0F","F0","00","00","00","00","00","00","00","00","00","00","00","00","80","E0",
    "C0","C0","C0","C0","C0","C0","C0","C0","C0","C0","C0","C0","C0","C0","CC","FC","C0","C0","C0","C0",
    "C0","C0","C0","C0","C0","C0","80","00"],#不要忘记这里的逗号

"学": # 24号宋体
    ["00","00","04","02","03","01","01","1F","10","10","37","00","00","00","00","7F","00","00","00","00",
     "00","00","00","00","00","20","30","18","18","18","01","FF","00","00","FF","01","02","04","08","FF",
     "08","08","08","08","98","78","10","00","00","40","60","C0","80","80","00","FC","0C","10","C0","80",
     "00","00","08","FC","00","00","00","00","00","00","00","00"],
"中":#16号宋体
    ["01","01","01","01","3F","21","21","21","21","21","3F","21","01","01","01","01","00","00","00","00",
     "F8","08","08","08","08","08","F8","08","00","00","00","00"],
"心":#12号字,黑体,加粗
    ["00","03","01","01","06","36","36","76","66","66","06","06","07","00",
     "00","00","80","80","00","38","18","0C","0C","00","30","30","F0","00"],
"K":# “科”,大号,48号字,黑体,加粗
    ["00","00","00","00","00","00","00","01","0E","00","00","00","00","00","00","00","00","1F","00","00",
     "00","00","00","00","00","00","00","00","00","01","03","07","06","0C","18","30","00","00","00","00",
     "00","00","00","00","00","00","00","00","00","00","00","00","00","01","1F","FE","06","06","06","06",
     "06","06","06","06","06","FF","0E","0E","0E","1E","1F","3E","36","76","66","E6","C6","86","06","06",
     "06","06","06","06","06","0E","0E","0E","0E","0E","0E","0E","0E","08","00","00","00","00","00","10",
     "78","FC","F0","00","00","00","00","00","00","00","00","08","1C","FE","00","00","00","00","00","C0",
     "70","78","38","1C","18","08","00","01","1F","00","00","00","00","00","00","00","00","00","00","00",
     "00","00","00","00","00","00","00","00","00","00","00","00","00","60","38","1E","0E","0E","06","00",
     "00","00","00","00","60","30","3C","1C","0E","0C","0C","00","00","00","07","F8","00","00","00","00",
     "00","00","00","00","00","00","00","00","00","00","00","00","00","00","08","0E","0F","0C","0C","0C",
     "0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C",
     "0D","3E","EC","0C","0C","0C","0C","0C","0C","0C","0C","0C","0C","0E","0E","0E","0E","08","00","00",
     "00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00",
     "00","00","00","00","00","20","30","78","F8","00","00","00","00","00","00","00","00","00","00","00",
     "00","00","00","00","00","00","00","00"],
"M":#“科”,拉长的,长24,宽16,非正方形,本程序将无法显示
    ["00","00","02","0E","78","08","08","08","0A","7C","08","08","1E","1A","2A","28","29","48","08","08",
     "08","08","08","00","00","00","08","08","08","48","48","08","08","08","88","48","48","4A","0E","38",
     "C8","08","08","08","08","08","08","00"]
 }


'''
这些是比较规整的数据,都是两位十六进制数。
如果数据不规整,直接拼接数据,会出现问题。
比如:1和1拼接,1和01拼接,结果显然是不一样的:
按16进制算,16(11)=00010001,而16(101)=000100000001,发光的点位置完全不同。
如果数据不规整,可以左侧补0为两位十六进制:'{:0>2x}'.format(..),想想为什么是两位?

规整的数据,写拼接函数,拼接数据的思路:
假如一个汉字分为左右两块来扫描,那么左块首行数据和右块首行数据拼接在一起,2行与2行接……
从面形成新的字模数据,按取模软件特点,高度的方向连续扫描,不分块进行。
如果文字高度是24像素,每行1像素,那么就有24行完整的数据,即24个数据,比起原始的数据量少多了!
原来的24号字有72个数据。
'''
def con_line_data(ch_str):#数据拼接函数
    print("fontsLine = {") #方便形成新的数据格式
    for k in ch_str: 
        datas=""
        datasLine=""
        byte_data=fonts[k]
        data_len=len(fonts[k]) #原数据个数        
        ch_size=0 #字号初值=0
        
        for i in range(8,65): #i=字号
            num=int((i-1)/8)+1 #num=横向分为多少块来扫描
            if((data_len/num)==i):
                ch_size=i
                break
        
        if ch_size==0:
            print("#",k,'字模数据有错!数据长度:',data_len)
        else:
            print('"%s%s%s%d'%(k,'":#',"字号=",ch_size),'行列式扫描,适合:行合并、整行显示')
            for i in range(0, ch_size):#拼接的行数i
                datas=""#每次拼接前
                for j in range(num):#共扫描了num块
                    datas +=byte_data[i+ ch_size*j]#都是定长字符串,直接拼接,数值转换后是正确的
                    # 想一想,为什么是:i+ ch_size*j ??
                datasLine += "0x"+datas+","#以十六进制形式保存
            datasLine ="["+str(ch_size)+","+datasLine+"],"#输出新字模数据,在0维标明字号,省去计算的麻烦
            print(datasLine)
    print("}")
    

#调用函数,在shell界面打印输出字模数据,直接复制来使用即可
con_line_data("科学M中心K")

'''
直接复制,得到如下形式的数据,供使用。M字模,非正方体,直接跳过了。
对于非正方形字体,留给同学自己来搞。

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,],
}

'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值