这一章在干嘛?
汉字显示实验:汉字编码(GB2312/GBK/Unicode)、点阵字库生成、取模工具(PCtoLCD2002)、在 LCD 上显示「你好世界」。
43.1 汉字显示介绍
43.1.1 汉字编码
| 编码 | 说明 |
|---|---|
| GB2312 | 1980 国标,6763 个汉字 |
| GBK | 1995 扩展,21003 个汉字 |
| Unicode | 国际统一,70000+ |
字符 UTF-8|Unicode 传输编码
原书图 43.1.1.1:常用汉字编码对比
C 字符串中汉字常用 GBK(2 字节):高字节 0x810xFE,低字节 0x400xFE。
43.1.2 点阵字库
汉字显示有两种方法:
- 小字库:仅生成用到的汉字点阵(省 Flash);
- 大字库:完整 GBK 字库(占 ~1 MB)。
点阵大小:12×12 / 16×16 / 24×24 / 32×32。
43.2 硬件设计
TFTLCD + 外部 Flash(W25Q64)存字库。
43.3 程序设计
43.3.1 字库制作
工具:PCtoLCD2002。
- 字符模式:阴码 / 阳码;
- 取模方式:逐行 / 逐列;
- 输出格式:C51 格式 / 标准 C 格式。
导出:
unsigned char hz_16x16[] = { 0x02,0x00,0x01,0x00, ... };
43.3.2 关键代码
void LCD_ShowChinese(uint16_t x, uint16_t y, uint8_t *s, uint16_t fc, uint16_t bc) {
while (*s) {
if (*s < 0x80) { // ASCII
LCD_ShowChar(x, y, *s, 16, fc, bc);
x += 8;
s++;
} else { // GBK 汉字
// 算出字库偏移
uint32_t offset = ((*s - 0x81) * 190 + (*(s+1) - 0x40)) * 32;
// 从字库读 32 字节
W25Qxx_ReadData(buf, offset, 32);
// 画点到 LCD
...
x += 16;
s += 2;
}
}
}
原书图 43.3.2.1:汉字取模与显示流程图
43.4 下载验证
LCD 显示「你好,世界!STM32 真好玩!」字符串 → 汉字清晰无乱码。
原书图 43.4.1:LCD 显示汉字效果
原书图 43.4.2:字库生成工具界面
注意:MDK 编译器默认按 UTF-8 处理源码,汉字会乱码。解决:用 GBK 编码源码或用 u8"" 字符串前缀 + Unicode 字库。
GBK 汉字编码每个字几个字节?
2 字节。
16×16 点阵一个汉字多少字节?
32 字节(1 位 = 1 像素 → 16×16/8 = 32)。
ASCII 与汉字判断?
ASCII < 0x80,汉字 ≥ 0x81。