汉字点阵字模生成
把文字转成单色点阵并打包成 C 语言数组,直接贴进单片机工程。取模顺序和字节位序可以切换,对不上显示效果就调这两项。
字形是用系统字体画出来再取点阵的,所以笔画取决于本机字体,和标准 HZK16 字库不会逐位相同。 如果要和现成字库严格兼容,应该直接用 HZK16 数据。
取模设置
列行式(逐列纵向取模,HZK16 风格),高位在前(最高位对应最左/最上的像素)。 列行式天然是每个像素列占一个字节的整数倍,高度不足 8 的倍数时最后补空行。
点阵预览
点阵字模的常见坑
取模顺序和显示库必须一致。行列式是「从左到右、一行一行」取,列行式是「从上到下、一列一列」取,两者出来的字节完全不同。常见的 SSD1306 OLED 是列行式,很多 LCD 字库用行列式。顺序接错时显示出来是些条纹或者斜着的花,看到这种现象先怀疑取模顺序而不是数据错了。
字节内的高低比特也可能反。就算取模顺序对了,还有「一个字节里哪一位对应最左边的像素」这个问题。有的驱动把最高位当最左像素,有的把它当最右。两处都反的话图像会水平镜像,只反一处就是交错的黑白点。这里提供按字节还原成图的功能,对着显示效果调最快。
这里出的字形不等于 HZK16。页面上是把字用系统字体画出来再取点阵,因此字形取决于本机字体,和标准 HZK16 字库的笔画不会逐位相同。做嵌入式的产品如果要和现成字库兼容,应该直接用 HZK16 数据;如果是自己配字模给 TFT 屏显示,这里的输出可以直接用。
字号越大占用成平方增长。16×16 点阵一个字是 32 字节,24×24 是 72 字节,32×32 就是 128 字节。汉字数量乘上去很快就到几百 KB,而小容量 MCU 的 Flash 可能只有 64 KB。实际做法是只把界面用到的那几十个字做进字库,而不是整套两千多字。
阈值决定笔画的粗细。灰度转黑白时的阈值相当于调笔画粗细:阈值取大得到的笔画更粗更明显,取小则更细。小字号(12 到 16)笔画密集,阈值太低会把笔画断掉,看起来像缺笔;大字号可以取低一些让字形更清爽。上屏前先在点阵预览里看一眼。