前几天做个小屏幕项目,结果被那锯齿字体虐得不要不要的。LCD、OLED各种显示,看上去就像老电视信号差。搜索半天,发现好多方案要么打不开源、要么体积大到 MCU 根本装不下。要不就只能将就,用最粗糙的点阵字。心想:总有办法吧?
MCUFont 到底是啥?
MCUFont 是一个专门给微控制器系统准备的字体压缩、解压和渲染库。它的亮点就是:
-
• 支持 16 级抗锯齿,文字平滑不生硬
-
• 解码库超小,编译后只要几 KB,不会拖垮你的闪存
-
• 完全用 C 写的回调接口,你想怎么画点就怎么画
-
它解决了哪些尴尬?
-
1. 只能单色字:以前只能黑白两个等级?MCUFont 给你 0~15 级灰度,显示效果直接上档次。
-
2. 无字距、无行距:传统 ad-hoc 方案多是“瞎写”的,字跟字贴一起,谁也挤不下。它内置高级字距调整和自动换行。
-
3. 只能等宽:想用漂亮的比例字体?没问题,导入 ttf 后自动帮你生成 RLE 压缩位图。
安装和上手:一气呵成
-
1. 准备依赖:
-
• libfreetype
-
• cxxtest
-
2. 下载源码:
git clone https://github.com/mcufont/mcufont.git
cd mcufont
3. 一键编译:
make
这步会生成 encoder、示例字体和 render_bmp demo。
4. 导入字体:
-
• 在 PC 上运行 encoder,把 .ttf/.bdf 转成 .c/.h
5. MCU 端调用:
-
• 引入
fonts.h和mcufont.h -
• 实现两个回调:像素级绘图和字符渲染
-
• 调用
mf_render_aligned一句代码,Hello World 就能跳屏了
实战演示:几行代码炫起来
#include "fonts.h"
#include <mcufont.h>
static void pixel_cb(int16_t x, int16_t y, uint8_t count, uint8_t alpha, void *st) {
while (count--) {
drawPixel(x++, y, alpha); // 自己实现的画点函数
}
}
uint8_t char_cb(int16_t x0, int16_t y0, mf_char c, void *st) {
return mf_render_character(&mf_rlefont_DejaVuSans12.font,
x0, y0, c, &pixel_cb, st);
}
void main() {
mf_render_aligned(&mf_rlefont_DejaVuSans12.font,
0, 0, MF_ALIGN_LEFT, "Hello, MCUFont!", 15,
&char_cb, NULL);
}
一次编译,多平台通用,省心又省事。
优缺点一览
|
优点 |
缺点 |
|
小巧:解码库仅 1~5 KB |
不支持运行时缩放 |
|
高质量抗锯齿(16 级灰度) |
暂无子像素抗锯齿 |
|
支持 TTF/BDF,自动 hinting |
动态效果(旋转、拉伸)需自己搞 |
|
完全抽象回调,兼容各类显示硬件 |
不如 FreeType 功能全面 |
小结
总的来说,MCUFont 就像给微控制器量身定做的一套高质感文字解决方案。安装简单,代码量少,效果就像“换壳”一样,一秒让你的 LCD/OLED 颜值翻倍。适合各种嵌入式项目,DIY 小玩意,甚至工业级人机界面都能用。
心动不如行动,赶紧拉下来试试吧!
项目地址:https://github.com/mcufont/mcufont