775|3

41

帖子

1

资源

一粒金砂(中级)

用标准字库(HZK16,ASC16)在单色OLED屏和TFT彩屏显示文字的方法(framebuf方法) [复制链接]

本帖最后由 lemon1394 于 2022-9-29 08:57 编辑

在SSD1306等OLED屏上显示汉字

        首先要取得汉字的点阵,再用得到的点阵制作一个framebuf,SSD1306再把framebuf用blit方法绘制到屏幕上。HZK16是用的区位码,但是micropython只支持UTF-8编码,所以需要在PC机上制作一个转码表,通过读表的方法取得区位码。

        制作转码表

buf = bytearray()

for i in range(0x4e00, 0x9FA6): # 汉字的UTF—8编码范围从4E00到9FA5
    data = chr(i).encode('GBK') # 把每个汉字的转成GBK编码
    data[0] -= 160       # GBK转区位码,高低位都要-0xA0
    data[1] -= 160       
    buf += data

with open('uni2gbk', 'wb') as f:
    f.write(buf)

        读HZK16

with open('/font/uni2gbk', 'rb') as f:
    f.seek((ord('我') - 19968)*2) # 19968 = 0x4E00
    offset = f.read(2)

with open('/font/HZK16', 'rb') as f:
    f.seek((94*(offset[0]- 1) + (offset[1] - 1))*32) # 可以把这里的计算到要转码表里,提高效率
    buf = f.read(32)

         blit绘制

font = framebuf.FrameBuffer(bytearray(buf), 16, 16, framebuf.MONO_HLSB) 
# 创建字体的framebuf,buf是刚才取出的汉字点阵,后面是宽度,高度,点阵格式

oled.blit(font,0,0) # 用blit方法把font绘制到oled的0,0位置
oled.show()

        连续文字可以制作一个大的framebuf,把每个文字的frambuf用blit方绘制进去,再一起绘制到OLED。

        中英文的混合显示只要判断一下ord(),小于128就用ASC16,大于就用HZK16,只要注意ASC16的framebuf是8x16的,不是汉字的16x16.

 

 

在TFT彩屏上显示汉字

        第一步也获取点阵,还是一样的字库,一样的获取方法,只是framebuf的格式不一样,单色屏用的是MONO_HLSB格式,而TFT屏用的是RGB565,这个转换的方法我找遍全网,没有网友分享,我最后在micropython的官方Github上找到一个示例:

# Test blit between different color spaces
try:
    import framebuf, usys
except ImportError:
    print("SKIP")
    raise SystemExit

# Monochrome glyph/icon
w = 8
h = 8
cbuf = bytearray(w * h // 8)
fbc = framebuf.FrameBuffer(cbuf, w, h, framebuf.MONO_HLSB)
fbc.line(0, 0, 7, 7, 1)

# RGB565 destination
wd = 16
hd = 16
dest = bytearray(wd * hd * 2)
fbd = framebuf.FrameBuffer(dest, wd, hd, framebuf.RGB565)

wp = 2
bg = 0x1234
fg = 0xF800
pal = bytearray(wp * 2)
palette = framebuf.FrameBuffer(pal, wp, 1, framebuf.RGB565)
palette.pixel(0, 0, bg)
palette.pixel(1, 0, fg)

fbd.blit(fbc, 0, 0, -1, palette)

print(fbd.pixel(0, 0) == fg)
print(fbd.pixel(7, 7) == fg)
print(fbd.pixel(8, 8) == 0)  # Ouside blit
print(fbd.pixel(0, 1) == bg)
print(fbd.pixel(1, 0) == bg)

        这个示例先制作一个palette,bg是背景色,fg是前景色,就是字体颜色。

        制作一个接收彩色字体的framebuf,再用blit方法把刚才的字体绘制到接收framebuf里,再把接收framebuf绘制到TFT里可以了

palette = framebuf.FrameBuffer(bytearray(2*1*2), 2, 1, framebuf.RGB565) # 创建palette
palette.pixel(0, 0, bg) # 设置背景色
palette.pixel(1, 0, fg) # 设置字体颜色

buf_rgb565 = framebuf.FrameBuffer(bytearray(16 *16 * 2 ), 16, 16, framebuf.RGB565) # 接收framebuf
buf_rgb565.blit(font, 0, 0, -1, palette)

tft.blit(buf_rgb565, 0, 0)
tft.show()

用blit方法如果单片机反复重启,这时可能你获取到的点阵数据是空的。


回复

65

帖子

0

资源

一粒金砂(中级)

用标准字库(HZK16,ASC16)在单色OLED屏和TFT彩屏显示文字的方法(framebuf方法)


回复

41

帖子

1

资源

一粒金砂(中级)

一般都是pixel描点的,效率很低,单色屏还可以,彩屏就完了。


回复

1094

帖子

15

资源

版主

字库打点的方法,百试百灵

其实彩屏也是,像素级别的描点


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

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

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

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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