一. 简介
哈喽,大家好。在使用LCD屏幕显示的时候,绝大部分情况下都是需要使用文字进行显示(中文或英文 ),所以就会面临一个问题: 如何制作字库。在字符种类比较少的情况下且单片机资源足够的情况下,一般使用软件直接生成对应字符的点阵就可以了(一般存储为C数组的方式),通过数组下标,或者索引进行获取,这样做的优点是比较简单,缺点就是对于想显示的字符,不够直观,容易混乱不清,不适合大程序使用;但其它情况下,则需要使用特定编码格式的字库文件进行存储。
今天将会给大家分享一下如何使用LvglFontTool软件制作unicode编码的字库,并且下载到STM32外部Flash进行使用。
本设计将基于AuroraFOC开发板 进行开发和演示,需要开发板的可以找我购买,289元包邮到家(将会为购买者提供技术交流群服务,大家一起学习一起成长 )。wx: WU1356742146
二. LvglFontTool生成字库
相信学过LVGL的朋友应该对这款软件并不陌生了,它是用来专门生成LVGL使用的字库的,不需要修改什么,可以直接使用。但是现在,它将为我所用。
软件的操作非常简单,就不作过多的介绍了,大家可以参考如下的配置,其中有一个地方需要注意的是: 抗锯齿这里要选择1,因为我选择4的时候,没有解析成功,但没有找到问题(能力有限哈)。
点击开始转换后,会生成两个文件,一个是.bin的字库文件,这个字库文件需要下载到单片机的外部Flash中;另外一个是.c文件,提供的函数接口,用来读取字符信息和字符的点阵数据。至此这个软件的使命就完成了。
三. QT 验证
这部分工作,主要是为了代替在单片机上的调试工作,电脑上开发调试肯定会比单片机方便得多(还是推荐一下大家学习一下相关的开发,在必要的时候,可以提升开发效率)。
1. 移植LvglFontTool软件生成的.c文件
将结构体定义copy到自己的文件中,不需要做任何修改
将这两个函数copy到自己文件中来,并且在__user_font_getdata函数中,添加文件读取的函数
另外还需要记住一下这个参数,后面在显示字符串的时候,会使用到
2.编写显示函数
这部分就比较简单了,只需要调用getFont16Data这个函数,然后将中文的unicdoe编码值传进去就可以了,就可以得到字库的显示数据了,
到这里,就成功的从字库文件读取数据,并且显示了,后面直接函数替换就可以直接在单片机上进行显示了。
四. 上板验证
这个部分主要是在qt的基础上进行一个函数的替换,以及一些相关事项需要注意。
将字库文件下载存储到外部Flash大家可以使用自己熟悉的方式,比如说串口,单片机接收到串口数据后,再将接收到的数据存储到外部Flash中去即可。
1. 读取字库函数替换
将qt中读取文件相关的函数,使用读取flash的函数替换
2. 获取字库数据添加
为了能够显示字符串(字符与字符之间的间隔以及字符的高度保持一致),需要将如下信息获取到
3. 字符串显示函数
这部分比较关键,需要对编码有一些相关的了解,不然就有一些坑需要你去踩。
我们知道ASCII码是对应的一个字节,而我们中文编码至少是两个字节,那么我们就需要对输入进来的数组进行判断,判断方式就需要去学习一下相关的编码方式了。
首先,我这里使用的UTF-8编码的文件,而UTF-8编码可以有1-4字节编码,那么首先需要确定我们使用的中文是使用的几个字节,这个简单,直接使用printf函数打印一下所占用的字节数就可以了(我这边中文是占用了三个字节)。
我们的字库文件是unicode编码的,我们还需要将UTF-8编码转换为unicode编码,可以根据下面这幅图进行转换。当UTF-8使用1字节编码的时候,最高位为0,而使用多字节编码的时候,最高字节的高位1的个数和编码字节个数相等。单字节的UTF-8编码和Unicode是一致的,不用转换。
假如现在是三字节的UTF-8编码,那么对应下表,需要将第一个字节的高四个bit去掉,然后将第二个字节的高两个bit去掉,最后将第三个字节的高两个bit去掉,也就是只保留表中的x,组成一个16bit的数据,这个数据即为UTF-8转换为unicode后的编码。
了解到这,就可以开始编码代码啦,编写的代码如下图所示,非常简介明了。中间使用的一些参数是用来控制每个字符的偏移值,用来确保字符与字符之间的间隔保持一定,字符高度保持一致。
最后显示效果如下
五. 小结
本次给大家分享了一下,如何使用LvglFontTool软件制作unicode编码的字库,并且下载到STM32外部Flash进行使用,相信大家也知道如何操作了,如果大家有更好更优雅的操作方式的话,非常希望能一起探讨。另外如果中间还有疑问的话,也可以与我交流。