LVGL字体实战:如何用lv_font在嵌入式设备上显示中文(附图标字体教程)
最近在做一个智能家居中控屏的项目,UI框架选用了LVGL,功能跑起来都挺顺,直到产品经理要求在界面上显示“温度:25℃”和“客厅”这几个中文。我像往常一样用lv_label_set_text设置,结果屏幕上要么是空白,要么是一堆乱码。那一刻我才意识到,在嵌入式世界里,让一块小小的屏幕“说中文”,远没有在电脑上打几个字那么简单。这不仅仅是编码问题,还涉及到字体文件从哪里来、怎么放进去、会不会把宝贵的Flash空间撑爆等一系列现实挑战。如果你也正在LVGL项目中为中文显示头疼,或者想优雅地使用图标字体来美化界面,那么这篇从实际项目里摸爬滚打总结出来的经验,或许能帮你少走些弯路。
1. 理解核心:LVGL字体系统是如何工作的
在动手解决中文显示之前,我们得先搞明白LVGL的字体系统到底在干什么。这能帮你理解后续所有操作背后的逻辑,而不是机械地照搬步骤。
简单来说,LVGL的字体渲染是一个“查字典”的过程。当你调用lv_label_set_text(label, “你好”)时,LVGL会遍历字符串中的每一个Unicode字符(比如“你”字的Unicode码点是U+4F60),然后去当前标签所关联的字体“字典”里查找这个码点对应的“字形描述”。这个描述,就是我们通过工具生成的.c文件里那一大堆数组数据,它精确地定义了每个像素点是黑是白(对于1bpp)或是灰度等级(对于抗锯齿字体)。
这里有几个关键概念直接影响你的选择和后续操作:
- bpp (Bits Per Pixel): 这决定了字体的“细腻”程度。
1bpp就是纯粹的黑白,没有灰色过渡,边缘会有明显的锯齿感。4bpp则意味着每个像素可以用16个灰度等级来表示,从而实现平滑的抗锯齿效果。数值越高,显示效果越好,但每个字符占用的存储空间也成倍增加。对于大多数彩色LCD屏,4bpp是效果和资源消耗的甜蜜点。 - 字体范围 (Range): 这是字体生成工具里最重要的设置之一。你不可能、也不应该把整个GB2312或GBK字符集(六七千个字)全部打包进固件。你需要根据产品实际用到的文字,精确地指定一个字符范围。比如,你的UI只显示“设置”、“返回”、“温度”、“湿度”等几十个固定词汇,那么只生成这些字即可,能节省大量空间。
- 字体文件格式: LVGL不直接使用
.ttf或.otf这类桌面系统常见的字体文件。它需要一种高度优化、适合嵌入式系统直接访问的格式——即C语言源文件(.c和.h)。生成工具的工作,就是将.ttf中的特定字符,按照指定的bpp和尺寸,转换成两个巨大的静态数组(glyph_bitmap存储像素数据,glyph_dsc存储字符的度量信息),并封装成可直接编译的C模块。
注意:LVGL v7.x及以后版本移除了对
8bpp抗锯齿的支持,主要因为其资源消耗与显示提升不成正比。所以现在通常只在1bpp、2bpp、4bpp之间选择。
理解了这个“查字典”模型,你就会明白,所谓“显示中文”,本质上就是:1)制作一本包含所需中文字符的“字典”(字体C文件);2)告诉LVGL去使用这本“字典”(声明并引用字体);3)确保你传递的字符串和“字典”的索引方式能对上(UTF-8编码)。
2. 手把手生成你的第一个中文字体文件
理论清楚了,我们进入实战环节。我将以目前最常用的LVGL官方在线字体转换工具为例,演示如何生成一个包含特定中文和符号的字体文件。
第一步:准备与访问工具 你需要一个TrueType格式(.ttf)的字体文件作为源。系统自带的字体通常有版权限制,用于商业产品需谨慎。这里我们可以使用开源免费的字体,例如“思源黑体”(Source Han Sans)。你可以从开源字体仓库获取其.ttf文件。 工具地址是:https://lvgl.io/tools/font-converter。这是一个网页工具,无需安装,但需要联网。
第二步:配置关键参数 打开网页后,你
315



被折叠的 条评论
为什么被折叠?



