欢迎光临散文网 会员登陆 & 注册

自己动手做OLED字库

2022-06-29 13:54 作者:会整活的剑人  | 我要投稿

完整字符集合太长了,视频只节选了一部分


为什么要做这个东西

如何用OLED屏幕显示中文是困扰着前C猪脚,仪光废物cbj很长时间的一个问题.

比如说我们上CSDN去搜索怎么做OLED字模,找到一篇博客大概是这样的,上来先给了这个取字模软件的下载链接然后使用他,like this.

但是cbj打开这个软件的时候是这个样子的

且不说界面长的丑,一种上古软件的感觉扑面而来,而且还有乱码(因为在区域里面开了使用utf-8,懒得改回去了),所以我看他很不爽啊,此外,现在这个东西的源代码是根本找不到的.


搞清楚原理,先把汉字转换成图像,然后根据OLED的驱动造字库

下面先简单介绍下OLED屏幕.他是个啥东西不是重点,就略过了,上网能搜到.

为方便叙述,在128乘64的OLED屏幕上建立坐标系如下图,x的正方向为右,y的正方向为下,并规定坐标从0开始,则列号的值域为[0,127],行号的值域为[0,63]

因为OLED屏幕只能显示二值图像,所以确定屏幕上的(x,y)坐标是亮还是暗只用1位来表示就足够了,所以一个完整屏幕的OLED图像可以有128*64/8=1024个字节来表示,比如说下面这个char buffer[1024]数组.

下面把数组和OLED屏幕上的点建立对应关系.一共128列,64行,把64行可以合并成8排数据,下标为0到127的字节对应第一排(也就是第0行到第7行)的亮暗情况,下标为128到255的字节对应第二排(也就是第8行到第15行),以此类推把全部的1024个字节排满.

OLED的驱动程序实现的功能是在屏幕上指定位置显示字符或者图像.目前实现了以下功能

1:显示大小不超过128列64行的矩形图像

2:显示大小为8行6列的ASCII字符

3:显示大小为16行8列的ASCII字符

这个专栏重点讨论的是显示大小为16行16列的中文字符.

下面说如何造字模,翻译翻译就是把字符转换为OLED要显示的图像,但是因为OLED显示的图像格式和计算机里面的数字图像不太一样,所以要分步骤进行转换.

于是就有了下面的python代码.至于为什么用的python,因为如果要用纯C语言就需要掌握Windows GDI 相关的API,奈何我翻了好久微软的文档也没有成功造出来,然后现学python的pillow图像库去造字模.

新建一个叫im的16行16列的图像,在里面写一个16px的宋体"曹"字,对应的unicode为0x66f9

然后就有了下面这个图像,根据im图像和OLED图像的对应关系,做做位运算,

字模就造出来了,就是下面那个长度为32的列表,对应了OLED里面的2排16行,每行有16列的一个"方块".

有了这个代码下面写个for循环,根据unicode编码表的汉字区域(0x4e00到0x9fff)造常用字的OLED字库了,生僻字(0x3400到0x4dbf)目前还没有施工.

然后就有一个二进制字库文件了,算下大小,(0xa000-0x4e00)*(0x20)=(0xa4000)刚好是671744字节.

对于二进制文件,现在是在windows上用CH341连接IIC接口的OLED屏幕调试,直接一个fopen打开文件,然后对于指定的unicode字符,直接用fseek把文件指针挪到相应的位置然后从那里读32字节进来就ok了,剩下的事情就是调用俺基于CH341的驱动库实现的OLED驱动去显示了.(别忘了最后fclose),大概这样.

剩下的就是,洗洗睡了

自己动手做OLED字库的评论 (共 条)

分享到微博请遵守国家法律