这一章在干嘛?

汉字显示实验:汉字编码(GB2312/GBK/Unicode)、点阵字库生成、取模工具(PCtoLCD2002)、在 LCD 上显示「你好世界」。

43.1 汉字显示介绍

43.2 硬件设计

43.3 程序设计

43.4 下载验证

43.1 汉字显示介绍

43.1.1 汉字编码

编码说明
GB23121980 国标,6763 个汉字
GBK1995 扩展,21003 个汉字
Unicode国际统一,70000+

字符 UTF-8|Unicode 传输编码

原书图 43.1.1.1:常用汉字编码对比原书图 43.1.1.1:常用汉字编码对比

C 字符串中汉字常用 GBK(2 字节):高字节 0x810xFE,低字节 0x400xFE。

43.1.2 点阵字库

汉字显示有两种方法:

  1. 小字库:仅生成用到的汉字点阵(省 Flash);
  2. 大字库:完整 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.3.2.1:汉字取模与显示流程图

43.4 下载验证

LCD 显示「你好,世界!STM32 真好玩!」字符串 → 汉字清晰无乱码。

原书图 43.4.1:LCD 显示汉字效果原书图 43.4.1:LCD 显示汉字效果

原书图 43.4.2:字库生成工具界面原书图 43.4.2:字库生成工具界面

注意:MDK 编译器默认按 UTF-8 处理源码,汉字会乱码。解决:用 GBK 编码源码或用 u8"" 字符串前缀 + Unicode 字库。