5. 显示乱码或字形不对
5.1 先分清是编码问题还是排置问题
"字不对"有两类,原因完全不同:
| 现象 | 层次 | 去哪查 |
|---|---|---|
| 显示成了别的字、方框、问号 | 编码:发进芯片的内码不对 | Q11 / Q12 |
| 字对但形状变形:左右镜像、上下翻转、旋转、条纹碎乱 | 字模:排置 / 位序 / 每行字节数不匹配 | Q15 |
快速判断方法:读字母 A 的点阵,与各型号字库芯片数据验证表比对——数据本身对,是显示函数的问题(排置);数据本身错,是编码或地址的问题。
5.2 Q11 字库芯片支持用 Unicode 编码调用中文吗
现象
想直接用 Unicode 编码调用中文字模,不确定芯片是否支持。
原因分析
是否支持取决于型号和库:部分型号内置 Unicode 索引 / 转码表,部分只支持 GB2312 / GBK / Shift-JIS 等当地编码内码直接调用。
解决办法
- 查型号手册 / 选型表的内容表中"转码表"部分(见字库芯片规格书)。
- 型号支持 Unicode → 直接用 Unicode 接口或库转码表。
- 型号不支持 → 换支持 Unicode 转 GBK / GB2312 转码表的字库芯片型号,或在 MCU 侧先完成转码(见下一节)。
5.3 Q12 UTF-8 怎么转 GB,3 字节汉字代码怎么找到字模
现象
从上位机 / 文件拿到的字符串是 UTF-8 编码,汉字是 3 个字节,不知道怎么在字库芯片里找到对应字模。
原因分析
UTF-8 是变长编码(汉字通常 3 字节),GBK 是双字节内码,必须经过 Unicode 码点中转;UTF-8 的三字节不是字库索引,不能直接拿来取模。
UTF-8 直接发芯片 vs 先转码再发送的显示差异对比
解决办法
- 转换链路:UTF-8 解码 → Unicode → 查表转 GBK → 双字节内码 → 取模。
- 使用 SDK 转码表函数;不要跨型号混用转码表。
- ASCII(0x00—0x7F)通常直通,无需转换。
- 注意 GB2312 / GBK / GB18030 收录范围差异。
- 预留缓冲区,处理转换失败(查不到的字会得到 0x3F 即"?")。
UTF-8 → Unicode 的第一步解码参考:
/*
功能: UTF-8 编码转 UTF-16(Unicode 码点)
pUTF8: UTF-8 编码数据
pUTF16:UTF-16 编码数据
return:UTF-8 字符的字节长度
*/
unsigned char UTF8toUTF16(unsigned char *pUTF8, unsigned short *pUTF16)
{
unsigned char bytes[3];
unsigned short unicode16;
bytes[0] = *pUTF8++;
if (bytes[0] < 0x80) {
*pUTF16 = bytes[0]; // ASCII 直通
return 1;
}
bytes[1] = *pUTF8++;
if (bytes[0] >= 0xC0 && bytes[0] < 0xE0) {
// 2 字节 UTF-8
unicode16 = (bytes[0] & 0x1F) << 6;
unicode16 |= (bytes[1] & 0x3F);
*pUTF16 = unicode16;
return 2;
}
bytes[2] = *pUTF8++;
if (bytes[0] >= 0xE0 && bytes[0] < 0xF0) {
// 3 字节 UTF-8(汉字常见)
unicode16 = (bytes[0] & 0x0F) << 12;
unicode16 |= (bytes[1] & 0x3F) << 6;
unicode16 |= (bytes[2] & 0x3F);
*pUTF16 = unicode16;
return 3;
}
return 0;
}
Unicode 再转 GBK 内码需查转码表,流程与代码见字库芯片开发资料 · UTF8 转 Unicode,转码表按型号在库文件中提供。
字符串经字库芯片内置转码表转换后正确显示
验证方法
打印转换前后的十六进制链路:UTF-8 E4 B8 AD → Unicode 4E2D → GBK D6 D0,再取模显示"中"。
5.4 Q15 读出的点阵值和预期不符、图像不对
现象
读点阵时图像不对,读出的点阵值与预期不符。
原因分析
按概率排序:排置不匹配、地址算错、字节 / 位序错、宽高 / 步长错、显示函数坐标错、通信数据错。
解决办法
- 通信层:读字母
A的 8×16 点阵,确认 16 字节且与数据验证表一致。 - 排置层:横置 / 竖置是否与显示函数匹配。
- 位序层:MSB / LSB、字节内位反转。
常见现象对照
| 现象 | 可能原因 |
|---|---|
| 左右镜像 | 位序 / 横置方向反 |
| 上下翻转 | 扫描方向反 |
| 旋转 90° | 横置 / 竖置选错 |
| 条纹 / 斜纹 | 地址步长错、每行字节数错 |
| 整屏乱码 | 编码 / 地址完全错 |
| 部分字正常 | 字符集范围 / 生僻字 |
同一点阵数据在不同排置 / 位序下的表现(点阵数据取自数据验证表 GT21L16S2W 字母 A,渲染为示意):
排置与位序错误对照示意:位序反显左右镜像、行序反显上下翻转、转置显旋转 90°(点阵数据取自数据验证表,渲染为示意)
字节内位反转的修法:
/*
p:需要逆置的数据地址
len:需要逆置的数据长度
*/
void byte_cov(unsigned char *p, unsigned long len)
{
unsigned long i;
unsigned char tem;
for (i = 0; i < len; i++)
{
tem = p[i];
p[i] = ((tem & 0x01) << 7) | ((tem & 0x02) << 5) | ((tem & 0x04) << 3) | ((tem & 0x08) << 1) \
| ((tem & 0x10) >> 1) | ((tem & 0x20) >> 3) | ((tem & 0x40) >> 5) | ((tem & 0x80) >> 7);
}
}
排置定义、横竖转换与字节逆序的完整说明见字库芯片开发资料 · 屏幕显示资料。
验证方法
十六进制打印点阵数据 + 手工画点,先确认数据本身正确,再查显示函数。
5.5 Q13 字符编码和字模地址怎么换算
现象
想知道字符编码和字库芯片内字模地址如何换算,或需要字符点阵字库地址表、各字体存储基地址的算法公式。
说明
目前字库芯片以库文件方式提供取数接口,不公开地址表换算方式。字模数据的正确获取路径:
- 使用库文件接口取模(推荐):流程见字库芯片详细使用指南,库文件获取与使用见字库芯片开发资料 · 字库 API 使用。
- 有特殊自定义需求(自做库)→ 通过 FAE 人工支持。
想验证读回数据是否正确,用各型号字库芯片数据验证表比对即可,无需自行换算地址。

