1. 为什么需要点阵字库?
在嵌入式设备上显示汉字,最常见的方案就是使用点阵字库。我刚入行时也试过用矢量字体,但在STM32这类资源有限的MCU上,矢量字体解析需要大量计算资源,显示速度慢到让人抓狂。点阵字库的优势在于预渲染——所有汉字都以像素矩阵的形式预先存储,显示时直接读取数据往屏幕上"戳点"就行。
举个例子,16x16的汉字点阵,每个字只需要32字节存储(1位表示1个像素)。实测在STM32F103上,这种方案刷屏速度能达到矢量字体的5倍以上。不过点阵字库也有明显缺点:字体大小固定。想要显示12pt、16pt、24pt三种字号?那就得存三套字库,非常占空间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. GBK编码的奥秘
2.1 GBK编码规则解析
国内项目基本都用GBK编码,它向下兼容GB2312,同时支持繁体字和生僻字。GBK的编码规则特别有意思——每个汉字用2个字节表示,这两个字节可以看作坐标系:
- 区码(第一个字节):0x81~0xFE,共126个区
- 位码(第二个字节):0x40~0x7E 或 0x80~0xFE,每区190个位
这样组合能表示126×190=23,940个汉字。我在实际项目中验证过,用下面这个公式可以快速计算汉字在字库中的位置:
c复制// 计算GBK字库偏移量
uint32_t Get_GBK_Offset(uint8_t high, uint8_t low, uint8_t fontSize) {
uint16_t zone = high - 0x81; // 区号转换
uint16_t pos = (low < 0x7F) ? (low - 0x40) : (low - 0x41);
uint8_t bytesPerChar = (fontSize * fontSize) / 8;
return (zone * 190 + pos) * bytesPerChar;
}
2.2 编码实战技巧
遇到过一个坑:某些GBK字符的第二个字节可能是0xFF(比如某些特殊符号)。如果不做校验直接计算偏移量,会导致数组越界。后来我在代码里加了防护:
c复制if(high<0x81 || low<0x40 || high==0xFF || low==0xFF) {
// 返回空白字符
memset(buffer, 0, sizeof(buffer));
return;
}
3. 制作点阵字库
3.1 工具选择与配置
推荐用PctoLCD2002这个老牌工具(虽然界面复古但很稳定)。关键配置参数:
| 参数项 | 推荐值 | 说明 |
|---|
