完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
还记得通常在MCU驱动LCD,OLED是怎样显示汉字的吗?采用取字模工具,生成字模数组,然后要显示某个字符,直接索引这个字符的数组,然后对这个数组数据进行显示就行了,就像这样:
最近有开发一个物联网项目,将网络端的发过来的汉字显示到屏幕上,但问题来了,我还不知道网络端要发送具体哪些汉字,我是无法对具体的汉字取模,因此,得想办法先对所有汉字进行取模,或使用字库,于是就有了下文。 1 字符编码 先从字符编码说起:参考阮一峰博客字符编码
由于我采用的液晶屏是逐行显示的,不同的液晶屏采用不同的显示模式,需根据具体情况选择字模。 取出“你”字模后,将字模数据复制到notepad++,调整成设置好的16列,21行的样式,在将16进制数据转换成2进制数据,然后将0替换成空格,即可找出汉字“你”的原型。
上面讲到了字符显示的原理,接下来将讲解字符显示的实现,相关代码不依赖于底层,具有很好的移植性,且在文章最后放出了Github链接,要实现该代码的功能,需要以下前提条件:
for 此代码简单地实现了索引字模数组中的一个unsigned char类型的元素中的8位,将该8位绘制成像素点,此为字符显示的基本实现, 4 任意汉字显示的实现(采用取模法) 本节将讲述如何实现任意汉字的显示。 需要准备以下工具:
具体操作步骤如下:
打开temp.txt文件可知, 该文件包含了所有字库的点阵,且采用GBK编码排序:
该bin文件的检验程序如下所示(相关程序均已上传文章末尾的Github): #include 将以上程序保存为:fontTest.c,gcc编译,执行,结果如下图所示: 由执行结果可见,程序能够从二进制bin文件中提取有用信息,并且,该bin文件保存了GBK编码的所有汉字,将“你好”替换成其他任意汉字也是可从bin文件中提取出子模的,生成的bin文件是有效的。 接下来讲解程序中的几个注意事项:
第一个字节为0X81~0XF: 第二个字节分为两部分:例如汉字“瑞”的GBK编码为C8 F0,第一字节C8,位于0X81-0XFE之间,第二字节F0,位于0X40-0XFE之间 第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE-0X81+1=126) 第二个字节代表的意义就是每个区内有多少个汉字,算了一下,一共有190个(0XFE-0X80+0X7E-0X40+2=190)。那么,GBK一共存储了126X190=23940个汉字。 仔细看GBK编码第二个字节两部分中,0X40-0X7E和0X80-0XFE,也就是说它是从0X40~到0XFF,中间的0x7F和最后的0xFF没有用到。定义GBKH代表第一个字节,GBKL代表第二个字节,字库的偏移量offset,那么其计算方法如下: GBKH 实现了在控制台窗口打印汉字字模,那么在TFTLCD,OLED,墨水屏等屏幕上,只要先实现了画点功能,那么,显示任意汉字也可以实现的了。 5 任意汉字显示的实现(采用字库法) 最后再介绍一种显示汉字的方法,该方法采用Python实现,直接调用字体库,仅在Linux系统上可实现,下面将以树莓派为例,相关的操作如下: 首先安装好Pillow库以及必要液晶屏显示必要的SPI库,GPIO库等: sudo apt-get install python3-pip sudo apt-get install python-imaging sudo pip3 install spidev sudo pip3 install RPi.GPIO sudo pip3 install Pillow 安装 Pillow 如果报错: ImportError: libopenjp2.so.7: cannot open shared object file: No such file or directory,则先执行如下指令: sudo apt-get install libopenjp2-7-dev 安装必要的字体: sudo apt-get install ttf-wqy-zenhei ttf-wqy-microhei 接下来是调用微软雅黑字体进行显示的部分示例(python3),详情代码参考文章末尾留下的 #!/usr/bin/python # -*- coding:utf-8 -*- import epd7in5b import time from PIL import Image,ImageDraw,ImageFont import traceback try: epd = epd7in5b.EPD() epd.init() print("Clear...") epd.Clear(0xFF) # Drawing on the Horizontal image HBlackimage = Image.new('1', (epd7in5b.EPD_WIDTH, epd7in5b.EPD_HEIGHT), 255) HRedimage = Image.new('1', (epd7in5b.EPD_WIDTH, epd7in5b.EPD_HEIGHT), 255) # Horizontal print("Drawing") drawblack = ImageDraw.Draw(HBlackimage) drawred = ImageDraw.Draw(HRedimage) font24 = ImageFont.truetype('/usr/share/fonts/truetype/wqy/wqy-microhei.ttc', 24) drawblack.text((10, 0), 'hello world', font = font24, fill = 0) drawblack.text((10, 20), '7.5inch e-Paper B', font = font24, fill = 0) drawblack.text((150, 0), u'微雪电子', font = font24, fill = 0) drawblack.line((20, 50, 70, 100), fill = 0) drawblack.line((70, 50, 20, 100), fill = 0) drawblack.rectangle((20, 50, 70, 100), outline = 0) drawred.line((165, 50, 165, 100), fill = 0) drawred.line((140, 75, 190, 75), fill = 0) drawred.arc((140, 50, 190, 100), 0, 360, fill = 0) drawred.rectangle((80, 50, 130, 100), fill = 0) drawred.chord((200, 50, 250, 100), 0, 360, fill = 0) epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRedimage)) epd.sleep() except: print('traceback.format_exc():n%s',traceback.format_exc()) exit() 该代码的精髓在于,先创建一段缓存,然后采用pillow库的相关方法通过字符串获取对应字库中字符的字模,将字模数据存入缓存中,然后将缓存数据显示到屏幕上,详情参考pillow库中的Image,ImageDraw,ImageFont方法对应的手册。 注意,代码中的中文采用UTF-8编码,保存的时候,为防止乱码,必须以UTF-8编码保存(可采用notepad++工具保存为UTF-8编码) |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
2433 浏览 0 评论
3341 浏览 9 评论
3021 浏览 16 评论
3514 浏览 1 评论
9118 浏览 16 评论
1242浏览 3评论
635浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
627浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2373浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1936浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-23 06:01 , Processed in 1.083442 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号