microPython oled显示中文汉字和图片
[复制链接]
本帖最后由 是最帅的啊 于 2021-11-18 16:41 编辑
昨天在家里打扫卫生的时候无意间找到了我上学的时候买的oled12864这块小的显示屏,就想用microPython来点亮它,翻了翻官网的例程,找到了ssd1306这个文件。连到板子上,发现它只能输入英文字符串而且字体还特别的小。所以我就想给它稍微的改一下,让它支持中文输入。
操作很简单将下列代码插入到ssd1306的class SSD1306下面就能用啦 代码我就不讲解啦,直接看注释就好。这里特别备注一下 代码中的font.font 是一个字典,里面存放的是我汉字取的模。
def chinese(self,str_cn,x,y): #输入中文字符串和xy坐标
seat = 0 #类似指针,指向汉字的位置。每写完一个字时,seat+16 指向下一个汉字的位置
for i in str_cn : #每一个中文字符
code = 0x00
data_code = i.encode('utf-8') #转换成utf-8的编码
code |= data_code[0] << 16
code |= data_code[1] << 8
code |= data_code[2]
code_cn = font.font[code] #与font里面的字典值做对应
for u in range(16): #每个汉字有16列 每一列里面分为上8行和下8行,8行为一页
a = code_cn[u] #第一列的上8行
a = bin(a).replace('0b','') #把a 转换成二进制的8位数 且把字首的'0b'转换为空 例a =27 ,bin后为 0b11011, replac后为 11011
while len(a) < 8 :#如果a的长度不够8为则在前面补0
a = '0' + a
b = code_cn[u+16] #第一列的下8行
b = bin(b).replace('0b','') #转换成二进制的8位数 且把字首的'0b'转换为空 例b =27 ,bin后为 0b11011, replac后为 11011
while len(b) < 8 :#如果长度不够8为则在前面补0
b = '0' + b
#在这个时候一个汉字的一列分别为 a b 写入屏幕
for c in range(8):#循环写入个位
pixel(x+seat+u,y+c,int(a[c]))
pixel(x+seat+u,y+c+8,int(b[c]))
seat = seat + 16
font.py文件
font ={
14990752:
[0x00,0x01,0x06,0x1F,0xE0,0x02,0x04,0x18,0xF0,0x10,0x13,0x10,0x10,0x14,0x18,0x00,
0x80,0x00,0x00,0xFF,0x00,0x08,0x30,0xC0,0x02,0x01,0xFE,0x00,0x80,0x60,0x18,0x00],#你2
15050173:
[0x08,0x08,0x0F,0xF8,0x08,0x0F,0x00,0x01,0x41,0x41,0x47,0x49,0x51,0x61,0x01,0x00,
0x02,0x44,0xA8,0x10,0x68,0x86,0x00,0x00,0x02,0x01,0xFE,0x00,0x00,0x00,0x00,0x00],#好3
15044992:
[0x00,0x3F,0x20,0x20,0x3F,0x00,0x43,0x5D,0x41,0x41,0x41,0x7F,0x41,0x41,0x01,0x00,
0x00,0xF0,0x20,0x20,0xF0,0x04,0x08,0x10,0x20,0x42,0x81,0xFE,0x00,0x00,0x00,0x00],#呀4
}
运行一下代码
from machine import I2C,Pin
from ssd1306 import SSD1306_I2C
import time
i2c = I2C(scl = Pin(22),sda = Pin(21),freq = 10000) #软件I2C
oled = SSD1306_I2C(128, 64, i2c) #创建oled对象
oled.chinese('你好呀',0,0)
#oled.picture()
oled.show() #显示
我顺便也把图片显示函数也做了
def picture(self,pic=0):
y = 0
for i in range(8):
code = Picture.picture[pic][128*i,128*i+127]
for u in range(128):
a = code[u]
a = bin(a).replace('0b','')
while len(a) < 8 :
a = '0'+a
for b in range(8):
pixel(u,b+y,int(a[b]))
y = y + 8
随手画了一个图片
实际效果
总结一下 使用起来感觉还不错,就是反映的速度慢了一点,后期的话我再去优化,想要源码的话就下载附件吧。今天就到这里啦,再见各位。
|