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上显示汉字相关推荐

  1. 51单片机用c语言在液晶1602上显示汉字,lcd1602与单片机连接图,基于51单片机的lcd1602液晶显示屏连接电路图...

    描述 LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符.LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示, ...

  2. 树莓派65/100 - Pico W初体验,点亮板载的LED灯

    有一段时间没有折腾树莓派Pico,最近发现它又出新品了,树莓派Pico W,可以通过WIFI连接互联网了. Pico W的产品小册子可以从这里下载. 这篇文章介绍了Pico 和 Pico W的区别. ...

  3. 树莓派24/100 - Pico与1602显示屏相连输出2行文本

    前面用8根引脚实现了七段数码管的显示,你没看错,不算正极的那根线,还用了8根连线,分别接到了Pico的8个GPIO接口上. 如果想显示更多的内容,这种办法肯定是不行了,Pico虽然有20多个GPIO接 ...

  4. 树莓派下利用opencv在图片上画汉字点阵(写一句话)

    一. 点阵字库的原理 一. 汉字编码 1. 区位码 在国标 GD2312-80 中规定,所有的国标汉字及符号分配在一个 94 行.94 列的阵中,方阵的每一行称为一个"区",编号为 ...

  5. 树莓派32/100 - Pico连接温湿度传感器

    DHT11是一个廉价的温湿度传感器,它只有1平方厘米大小,加上一个小转接板,也没多大,接线也简单,除了正负极之外,只需再接一根信号线. 我一开始以为它要用到ADC,所以把信号线接到了Pico的GP26 ...

  6. 树莓派40/100 - Pico控制WS2812B,一根信号线实现多种LED灯光效果(1)

    从某多平台花了15元钱买了一米长的WS2812B彩灯,用于我的Pico编程试验,这种灯的神奇之处在于只需一根信号线,能够控制串联在一起的30颗LED灯珠(好像能长达1024颗灯),实现各种彩灯效果. ...

  7. 树莓派53/100 - Pico小车v4版本,蓝牙、陀螺仪之后,再加上OLED显示屏

    我的树莓派Pico小车接上了蓝牙.陀螺仪之后,今天再把OLED显示屏接上,OLED的电源是3.3V,SDA/SCL分别接GP4/GP5,代码增加一些.对于OLED的SSD1306显示模块不熟悉的,可以 ...

  8. 树莓派22/100 - Pico入侵检测报警器

    入侵检测器 这一节需要一个HC-SR501的小元件,大概3~5元钱,某多非常给力,5元钱的东西也包邮. 中文说明书称之为人体感应模块,产品介绍是这样说的: HC-SR501是基于红外线技术的自动控制模 ...

  9. 树莓派20/100 - Pico板载的温度传感器

    树莓派Pico板子里有一个内置的温度传感器,它与一个模数转换器(ADC)相连,通道编号为4,Pico里模数转换器的数值范围为12位整数,但MicroPython把范围映射到16位,也就是从0到6553 ...

  10. 树莓派26/100 - Pico控制RGB三色灯

    RGB三色LED灯,相当于把三种颜色的LED灯组合在一起,它有4条腿,最长的那条腿是阴极或阳极,根据这个灯是共阴的,还是共阳的而定. 与以前接LED灯的情况类似,不过这次要接三个电阻,我把它们分别接到 ...

最新文章

  1. java怎么将前端的数据存到关联的表中_MySQL数据库性能优化
  2. html浏览器影响js问题,js 浏览器兼容性问题
  3. jQuery 获取屏幕高度、宽度
  4. 存储过程中用到的年,月,周的函数
  5. uniapp-登录界面风格-001
  6. redis持久化底层原理-RDB与AOF
  7. OAuth2四种不同的标准模式
  8. Flyme patchrom项目笔记
  9. 数据治理之主数据管理MDM
  10. 程序员哑巴英语修炼指南
  11. Opencv:如何调用IP摄像头
  12. 从零开始学习前端JAVASCRIPT — 1、JavaScript基础
  13. 使用高德地图服务获取全部行政区划与各个省市的地理坐标
  14. SQLite sqlite_master
  15. 网页设计期末结课作业 2022最后的作业 用Dw div+css 做网页设计
  16. IDEA运行Java Applet程序
  17. 【电子产品】联想ku0989 启用Fn键或屏蔽Fn键
  18. html 框线设置颜色,css怎么设置边框颜色?
  19. linux setsockopt
  20. 太原理工大学数据结构H算法内容知识点

热门文章

  1. 潇洒郎:Python开发 邮件群发助手:定时发送
  2. Google Earth Engine(GEE)——美国俄勒冈大学制作的可视化土地分类下载器
  3. Win7+IE8页面兼容性问题解决之DOCTYPE声明
  4. react实现markdown编辑器
  5. c语言vc绘图,VC++绘图编程教程
  6. JavaWeb实训项目案例开发之在线图书网站开发【非常适合初学者】
  7. 一篇让小百彻底搞懂性能调优
  8. linux fedora 24 使用 ibus 智能拼音 输入 补全 英文
  9. springSecurity之http Basic认证
  10. 语音识别平台_语音识别 平台_微信语音识别开放平台 - 云+社区 - 腾讯云