本帖最后由 gtbestom 于 2021-8-11 18:08 编辑
#申请原创# @21小跑堂
再次感谢沁恒官方寄送的这块 CH32V103 开发板,集成了仿真下载器,集成了USB转串口,还兼容了Arduino接口,使用起来很方便。
上一篇说到 CH32V103 读取内存卡根文件目录,并通过串口打印显示到串口助手。
CH32V103 FATFS实现中文长文件名读取 https://bbs.21ic.com/icview-3154440-1-1.html
显示到串口助手显然不太方便,我看目录还要带个电脑?再说有电脑我还需要这样看目录?
这次我们换个地方显示。
说干就干。
从杂物堆里找来了一个12864显示屏,非常mini的那种,0.96寸,某宝上也有很多哦,10米左右即可拥有。
怎么点亮屏幕这篇**就不说了,买屏送的资料就够亮屏了。
本次主要实现内存卡字库的读取,显示。
由于内存卡存放的文件,文件名可能是各种各样的,如果要显示任意中文字符,就需要对所有 汉字 进行取模,生成字库。
那把所有汉字打出来,再一一取模不就好了?
这里涉及2个问题:
1、汉字有上万个,常见的也有几千个,一一取模再转换未免太费神。
2、这么多汉字,如何一一对照,例如我想在这一堆字模中,快速找到“我”这个字的字模。
什么?忘记取模的时候“我”的字模排在第几位了。
对于第一个问题,感谢一些前辈大佬,已经有很多生成字库的软件了。
第二个问题,汉字编码有很多种,例如 GB2312(收录6763汉字)、GBK(收录21886汉字)、Unicode(收录6万多字)、UTF-32则收录了12万字。
已经有以上多种编码了,编码就代表着文字的排序,直接对照就好。
这里取GBK和Unicode为例。GBK中出现的第一个汉字为“丂”,编码为16进制的8140,一个汉字用2个字节表示。
如何获取汉字GBK编码?这里提供一种土办法,串口助手!
将RX和TX短接,发送设置为字符GBK编码,接收设置为16进制,发送后接收到的就是字符编码:
获取 Unicode 同理,发送切换到 Unicode 编码,接收为16进制:
取模不管对照GBK编码,还是Unicode编码,都是能实现我们这个功能的。直接选个编码开始取模:
生成字库二进制文件:
再放入内存卡即可,然后使用 FATFS 读取字库文件信息:
f_open(&gd_FileFontLib16, path, FA_READ);
偏移文件读取指针:
f_lseek(&gd_FileFontLib16, foffset);
读取字模信息:
f_read (&gd_FileFontLib16, Buff, 32, &cout);
使用 Unicode 编码的字库时,foffset偏移就是汉字编码,使用 GBK 编码的字库时,foffset偏移按照以下计算方法:
qh = *Str;
ql = *(++Str);
if(qh<0x81 || ql<0x40 || ql==0xff || qh==0xff) // 非常用汉字
{
for(i=0; i<(Size<<1) ;i++)
*Buff++ = 0x00; // 填充
return 0;
}
if(ql < 0x7f)
ql-=0x40;
else
ql-=0x41;
qh -= 0x81;
foffset = ((u32)190 * qh + ql) * (Size&0x07 ? (Size>>3)+1 : Size>>3) * Size; // 得到字库中的字节偏移量
得到字模后显示即可,就不多说了,上图:
|