树莓派51/100 - Pico下用MicroPython在ssd1306上显示汉字
Pico下用MicroPython编程在ssd1306芯片上显示英文很方便,但如何显示中文呢?
直接用oled.text()函数是无法显示中文的,因为系统里没有中文字体的点阵字库,一种常用的办法就是利用framebuf把汉字的字模准备好,用blit()函数直接画出汉字。
如果你不怕麻烦,可以自己把汉字画出来,比如下面这个“龙”字,用16x16点阵表示出来,需要32个字节。
字模有了,用blit()函数直接把它显示出来即可。
import machine
import ssd1306
import framebufi2c = machine.I2C(1, sda=machine.Pin(14), scl=machine.Pin(15), freq=400_000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)pattern = [0x04,0x20,0x04,0x10,0x04,0x10,0x04,0x00,0xFF,0xFE,0x04,0x80,0x04,0x88,0x04,0x88,0x04,0x90,0x08,0xA0,0x08,0xC0,0x10,0x82,0x11,0x82,0x22,0x82,0x44,0x7E,0x80,0x00]
buf = framebuf.FrameBuffer(bytearray(pattern), 16, 16, framebuf.MONO_HLSB)
oled.blit(buf, 0, 0)
oled.show()
这里有一个参数 framebuf.MONO_HLSB 需要了解其含义,官方的函数说明在这里,H表示水平方向的(Horizontal),LSB应该对应着英文Least Significant Bit,指高位在左侧,即8个二进制位,b7位处于最左边。刚才的”龙“字,从上到下扫描,每个字节从b7到b0排列。
另外,还有HMSB(水平方向扫描,b7在右),VLSB(垂直扫描,高位在左)。
市面上有很多人已经写好了各种各样的取字模小软件,我试了好几款:
- TS4 点阵字库(字模)生成器V4
- PC2LCD2002
- HZDotReader V3
- 一个在线字模生成网站
- 点阵造字Makech V2.1
- 字模提取zimo V2.2
- ZIMOIII
如果你只用16x16或24x24的字体,用那个在线网站也挺方便,最后,我个人还是比较喜欢TS4,操作还算简洁,它可以直接生成字模的C代码,稍微修改一下就可以用于MicroPython。
我用字典fontlib把小字库保存起来,方便取字,最后的代码:
import machine
import ssd1306
import framebufi2c = machine.I2C(1, sda=machine.Pin(14), scl=machine.Pin(15), freq=400_000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)fontlib = {"申": [0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00],"龙": [0x04,0x20,0x04,0x10,0x04,0x10,0x04,0x00,0xFF,0xFE,0x04,0x80,0x04,0x88,0x04,0x88,0x04,0x90,0x08,0xA0,0x08,0xC0,0x10,0x82,0x11,0x82,0x22,0x82,0x44,0x7E,0x80,0x00],"斌": [0x00,0x10,0x20,0x14,0x11,0xD2,0x00,0x12,0xFC,0x10,0x0B,0xFE,0x08,0x10,0x48,0x90,0x28,0x90,0x12,0xD0,0x12,0x90,0x2A,0x90,0x2A,0x8A,0x4A,0xEA,0x87,0x06,0x02,0x02],"的": [0x10,0x40,0x10,0x40,0x20,0x40,0x7E,0x7C,0x42,0x84,0x42,0x84,0x43,0x04,0x42,0x44,0x7E,0x24,0x42,0x24,0x42,0x04,0x42,0x04,0x42,0x04,0x7E,0x04,0x42,0x28,0x00,0x10],"程": [0x08,0x00,0x1D,0xFC,0xF1,0x04,0x11,0x04,0x11,0x04,0xFD,0xFC,0x10,0x00,0x30,0x00,0x39,0xFE,0x54,0x20,0x54,0x20,0x91,0xFC,0x10,0x20,0x10,0x20,0x13,0xFE,0x10,0x00],"序": [0x01,0x00,0x00,0x80,0x3F,0xFE,0x20,0x00,0x23,0xF8,0x20,0x10,0x20,0xA0,0x20,0x40,0x2F,0xFE,0x20,0x42,0x20,0x44,0x20,0x40,0x40,0x40,0x40,0x40,0x81,0x40,0x00,0x80],"人": [0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x08,0x20,0x08,0x20,0x10,0x10,0x20,0x08,0x40,0x04,0x80,0x02],"生": [0x01,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x3F,0xFC,0x21,0x00,0x41,0x00,0x81,0x00,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00],
}def text_hz(hz, x, y):zm = bytearray(fontlib[hz])buf = framebuf.FrameBuffer(zm, 16, 16, framebuf.MONO_HLSB)oled.blit(buf, x, y)(x, y) = (0, 0)
for hz in "申龙斌的程序人生":text_hz(hz, x, y)x += 16
oled.show()
另外,我还试过把单线体的笔划坐标一笔一笔画出来,因为oled屏幕小,笔划字体的效果比点阵字体差不少,就不用了,代码如下:
import machine
import ssd1306i2c = machine.I2C(1, sda=machine.Pin(14), scl=machine.Pin(15), freq=400_000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)# 笔划坐标来自于下面这个网站
# https://github.com/LingDong-/chinese-hershey-font/tree/master/dist/json
strokes_lib = {"申": [[[0.02, 0.18], [0.02, 0.75]],[[0.48, 0.04], [0.48, 0.99]],[[0.02, 0.18], [0.98, 0.18], [0.96, 0.74]],[[0.02, 0.41], [1.0, 0.41]],[[0.02, 0.66], [1.0, 0.66]]],"龙": [[[0.02, 0.3], [0.98, 0.3]],[[0.56, 0.3], [0.56, 0.955], [0.97, 0.95]], [[0.67, 0.07], [0.83, 0.23]],[[0.37, 0.03], [0.38, 0.37], [0.325, 0.54], [0.215, 0.815], [0.02, 0.99]],[[0.98, 0.84], [0.93, 0.99]], [[0.84, 0.5], [0.525, 0.825], [0.29, 0.93]], [[0.37, 0.39], [0.23, 0.81]]],"斌": [[[0.4, 0.49], [0.4, 0.94]],[[0.43, 0.12], [0.68, 0.12]],[[0.02, 0.24], [0.35, 0.24]],[[0.38, 0.29], [0.98, 0.29]], [[0.56, 0.57], [0.72, 0.57]],[[0.14, 0.06], [0.25, 0.17]], [[0.83, 0.08], [0.96, 0.21]], [[0.07, 0.45], [0.19, 0.56], [0.3, 0.81]], [[0.26, 0.24], [0.265, 0.445], [0.17, 0.745], [0.06, 0.94]],[[0.76, 0.04], [0.765, 0.485], [0.77, 0.68], [0.88, 0.99]],[[0.98, 0.83], [0.92, 1.01]], [[0.56, 0.4], [0.565, 0.89], [0.33, 0.95]], [[0.72, 0.85], [0.51, 0.92]]],
}def draw_hz(hz, x0, y0, font_size=16):for stroke in strokes_lib[hz]:for i in range(1, len(stroke)):x1 = x0 + round(stroke[i-1][0] * font_size)y1 = y0 + round(stroke[i-1][1] * font_size)x2 = x0 + round(stroke[i][0] * font_size) y2 = y0 + round(stroke[i][1] * font_size) oled.line(x1, y1, x2, y2, 1)font_size = 16
(x0, y0) = (20, 20)
for hz in "申龙斌":draw_hz(hz, x0, y0, font_size) x0 += font_sizeoled.show()
参考文献:
http://bbs.eeworld.com.cn/thread-1176472-1-1.html
https://docs.micropython.org/en/latest/library/framebuf.html
https://github.com/jdhxyy/ssd1306py-micropython
https://github.com/LingDong-/chinese-hershey-font
推荐阅读:
树莓派Pico开发系列文章
树莓派51/100 - Pico下用MicroPython在ssd1306上显示汉字相关推荐
- 51单片机用c语言在液晶1602上显示汉字,lcd1602与单片机连接图,基于51单片机的lcd1602液晶显示屏连接电路图...
描述 LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符.LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示, ...
- 树莓派65/100 - Pico W初体验,点亮板载的LED灯
有一段时间没有折腾树莓派Pico,最近发现它又出新品了,树莓派Pico W,可以通过WIFI连接互联网了. Pico W的产品小册子可以从这里下载. 这篇文章介绍了Pico 和 Pico W的区别. ...
- 树莓派24/100 - Pico与1602显示屏相连输出2行文本
前面用8根引脚实现了七段数码管的显示,你没看错,不算正极的那根线,还用了8根连线,分别接到了Pico的8个GPIO接口上. 如果想显示更多的内容,这种办法肯定是不行了,Pico虽然有20多个GPIO接 ...
- 树莓派下利用opencv在图片上画汉字点阵(写一句话)
一. 点阵字库的原理 一. 汉字编码 1. 区位码 在国标 GD2312-80 中规定,所有的国标汉字及符号分配在一个 94 行.94 列的阵中,方阵的每一行称为一个"区",编号为 ...
- 树莓派32/100 - Pico连接温湿度传感器
DHT11是一个廉价的温湿度传感器,它只有1平方厘米大小,加上一个小转接板,也没多大,接线也简单,除了正负极之外,只需再接一根信号线. 我一开始以为它要用到ADC,所以把信号线接到了Pico的GP26 ...
- 树莓派40/100 - Pico控制WS2812B,一根信号线实现多种LED灯光效果(1)
从某多平台花了15元钱买了一米长的WS2812B彩灯,用于我的Pico编程试验,这种灯的神奇之处在于只需一根信号线,能够控制串联在一起的30颗LED灯珠(好像能长达1024颗灯),实现各种彩灯效果. ...
- 树莓派53/100 - Pico小车v4版本,蓝牙、陀螺仪之后,再加上OLED显示屏
我的树莓派Pico小车接上了蓝牙.陀螺仪之后,今天再把OLED显示屏接上,OLED的电源是3.3V,SDA/SCL分别接GP4/GP5,代码增加一些.对于OLED的SSD1306显示模块不熟悉的,可以 ...
- 树莓派22/100 - Pico入侵检测报警器
入侵检测器 这一节需要一个HC-SR501的小元件,大概3~5元钱,某多非常给力,5元钱的东西也包邮. 中文说明书称之为人体感应模块,产品介绍是这样说的: HC-SR501是基于红外线技术的自动控制模 ...
- 树莓派20/100 - Pico板载的温度传感器
树莓派Pico板子里有一个内置的温度传感器,它与一个模数转换器(ADC)相连,通道编号为4,Pico里模数转换器的数值范围为12位整数,但MicroPython把范围映射到16位,也就是从0到6553 ...
- 树莓派26/100 - Pico控制RGB三色灯
RGB三色LED灯,相当于把三种颜色的LED灯组合在一起,它有4条腿,最长的那条腿是阴极或阳极,根据这个灯是共阴的,还是共阳的而定. 与以前接LED灯的情况类似,不过这次要接三个电阻,我把它们分别接到 ...
最新文章
- java怎么将前端的数据存到关联的表中_MySQL数据库性能优化
- html浏览器影响js问题,js 浏览器兼容性问题
- jQuery 获取屏幕高度、宽度
- 存储过程中用到的年,月,周的函数
- uniapp-登录界面风格-001
- redis持久化底层原理-RDB与AOF
- OAuth2四种不同的标准模式
- Flyme patchrom项目笔记
- 数据治理之主数据管理MDM
- 程序员哑巴英语修炼指南
- Opencv:如何调用IP摄像头
- 从零开始学习前端JAVASCRIPT — 1、JavaScript基础
- 使用高德地图服务获取全部行政区划与各个省市的地理坐标
- SQLite sqlite_master
- 网页设计期末结课作业 2022最后的作业 用Dw div+css 做网页设计
- IDEA运行Java Applet程序
- 【电子产品】联想ku0989 启用Fn键或屏蔽Fn键
- html 框线设置颜色,css怎么设置边框颜色?
- linux setsockopt
- 太原理工大学数据结构H算法内容知识点
热门文章
- 潇洒郎:Python开发 邮件群发助手:定时发送
- Google Earth Engine(GEE)——美国俄勒冈大学制作的可视化土地分类下载器
- Win7+IE8页面兼容性问题解决之DOCTYPE声明
- react实现markdown编辑器
- c语言vc绘图,VC++绘图编程教程
- JavaWeb实训项目案例开发之在线图书网站开发【非常适合初学者】
- 一篇让小百彻底搞懂性能调优
- linux fedora 24 使用 ibus 智能拼音 输入 补全 英文
- springSecurity之http Basic认证
- 语音识别平台_语音识别 平台_微信语音识别开放平台 - 云+社区 - 腾讯云