ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

树莓派51/100 - Pico下用MicroPython在ssd1306上显示汉字

2021-11-20 17:34:36  阅读:323  来源: 互联网

标签:MicroPython 树莓 0x08 0x04 0x20 下用 0x00 0x01 0x10


Pico下用MicroPython编程在ssd1306芯片上显示英文很方便,但如何显示中文呢?

直接用oled.text()函数是无法显示中文的,因为系统里没有中文字体的点阵字库,一种常用的办法就是利用framebuf把汉字的字模准备好,用blit()函数直接画出汉字。

如果你不怕麻烦,可以自己把汉字画出来,比如下面这个“龙”字,用16x16点阵表示出来,需要32个字节。
在这里插入图片描述
字模有了,用blit()函数直接把它显示出来即可。

import machine
import ssd1306
import framebuf

i2c = 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(垂直扫描,高位在左)。

市面上有很多人已经写好了各种各样的取字模小软件,我试了好几款:

如果你只用16x16或24x24的字体,用那个在线网站也挺方便,最后,我个人还是比较喜欢TS4,操作还算简洁,它可以直接生成字模的C代码,稍微修改一下就可以用于MicroPython。
在这里插入图片描述
我用字典fontlib把小字库保存起来,方便取字,最后的代码:

import machine
import ssd1306
import framebuf

i2c = 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()

在这里插入图片描述

参考文献:
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

标签:MicroPython,树莓,0x08,0x04,0x20,下用,0x00,0x01,0x10
来源: https://blog.csdn.net/slofslb/article/details/121440994

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有