5125|10

53

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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

随手画了一个图片

 

实际效果

总结一下 使用起来感觉还不错,就是反映的速度慢了一点,后期的话我再去优化,想要源码的话就下载附件吧。今天就到这里啦,再见各位。

最新回复

图片怎么弄啊   详情 回复 发表于 2023-11-11 20:34
点赞 关注
 
 

回复
举报

53

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

这个是附件

ssd1306.py

7.07 KB, 下载次数: 56

 
 
 

回复

7159

帖子

2

TA的资源

版主

板凳
 

microPython代码是真的简洁!!!

 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

4
 

好耶,学习学习

 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

5
 

请问汉字取模又该如何进行呢?

点评

阴码 行列式 顺向  详情 回复 发表于 2021-11-22 08:26
 
 
 

回复

1658

帖子

0

TA的资源

五彩晶圆(初级)

6
 

用的是啥开发板呢

点评

microPython  esp32     详情 回复 发表于 2021-11-22 08:26
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

7
 
storm-wind 发表于 2021-11-19 09:02 请问汉字取模又该如何进行呢?

阴码 行列式 顺向

点评

我试了很久,发现应该是列行式吧?  详情 回复 发表于 2021-12-7 17:21
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

8
 
se7ens 发表于 2021-11-19 14:46 用的是啥开发板呢

microPython  esp32   

 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

9
 

我试了很久,发现应该是列行式吧?

 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

10
 

确实可以用咯,感谢。

另外,请教一下楼主是用啥取模软件?

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 

图片怎么弄啊

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表