打印
[技术问答]

单片机,字库文件是怎么调用的?

[复制链接]
5100|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如果做好了一个16×16的字库文件,那么怎么调用呢。比如我弄个printf_to_lcd("一二三四五");
沙发
598330983|  楼主 | 2017-2-24 18:47 | 只看该作者

使用特权

评论回复
板凳
598330983|  楼主 | 2017-2-24 18:53 | 只看该作者
原来是上图那样的,终于找到个靠谱的了。
就是这个GBK字库的字形是按照GBK的编码存放的,通过字符串的编码确定这些字符串字符元素的GBK编码,确定好了这个编码通过一个读取函数,取这个编码数组对应的字形,然后通过for循环将读到的字形显示出来。

使用特权

评论回复
地板
598330983|  楼主 | 2017-2-24 19:00 | 只看该作者
字符编码原理:英文字母带各种符号等共有95个,都有自己的ascii码,一个字母或者符号就是一个ascii码。汉字以及汉字的符号是需要2个字节来存储,在keil等主流编译器中,一般都是以GBK编码方式存储。
GBK编码:每个GBK码由2个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,一是0X40~0X7E,二是0X80~0XFE。例如汉字“瑞”的GBK编码为C8 F0,第一字节C8,位于0X81~0XFE之间,第二字节F0,位于0X40~0XFE之间。第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE-0X81+1=126);第二个字节代表的意义就是每个区内有多少个汉字,算了一下,一共有190个(0XFE-0X80+0X7E-0X40+2=190)。那么,GBK一共存储了126X190=23940个汉字。
我们仔细看GBK编码第二个字节两部分,0X40~0X7E 0X80~0XFE,也就是说它是从0X40~到0XFF,中间的0x7F和最后的0xFF没有用到。但是为了能够线性查找,我们暂且认为这两个字节也存在,就是我们强制把每个区190个汉字当做每个区192个汉字,不过0X7F和0XFF上没有汉字。
定义GBKH代表第一个字节,GBKL代表第二个字节,字库的偏移量offset,放入W25Q16的字库从0x100地址开始存储,那么获取某个汉字的字模的函数就可以写成:

使用特权

评论回复
5
598330983|  楼主 | 2017-2-24 19:01 | 只看该作者
void Get_GBK_DZK(uint8_t *code, uint8_t *dz_data)
{
    uint8_t GBKH,GBKL;                 
    uint32_t offset;        

    GBKH=*code;
    GBKL=*(code+1);     
    if(GBKH>0XFE||GBKH<0X81)return;
    GBKH-=0x81;
    GBKL-=0x40;
    offset=((uint32_t)192*GBKH+GBKL)*32;
    W25Q16_Read(dz_data,offset+0x100,32);           
    return;
}
函数中,参数*code带入汉字的两字节编码,*dz_data是一个32个字节的数据,带入函数中,就可以得到任何一个汉字的字模了。例如:
 uint8_t buf[32];
    Get_GBK_DZK("瑞", buf);


使用特权

评论回复
6
598330983|  楼主 | 2017-2-24 19:07 | 只看该作者
上面看似有点糊涂,刚开始。我觉得别人也会糊涂的,我这里就讲清楚
那个return;就是返回空,直接返回到调用处。
调用处在哪儿呢?

  Get_GBK_DZK("瑞", buf);
也就是那个W25Q16_Read(dz_data,offset+0x100,32);       这个函数执行后,退回到调用处。而这里的dz_data,刚好是buf,也就是要显示的缓存区,buf。
完成了这一部,我就就直接推送buf的内容到显示器就行了。

使用特权

评论回复
7
734774645| | 2017-2-24 19:32 | 只看该作者
虽然不长,但是是讲的最明白的一个。

使用特权

评论回复
8
拐拐| | 2017-12-20 20:39 | 只看该作者
598330983 发表于 2017-2-24 19:00
字符编码原理:英文字母带各种符号等共有95个,都有自己的ascii码,一个字母或者符号就是一个ascii码。汉字 ...

之前还迷迷糊糊的,现在清楚了很多。但是还有一个问题,GBK字库生成24*24的子库存入flash后,我要显示一个字就要提取72字节数据,原本两个字节数据表示一个汉字,现在却要用72个字节来表示,是不是GBK生成点阵字库后表示方法就不一样了?

使用特权

评论回复
9
xinpian101| | 2017-12-20 22:49 | 只看该作者
存储的顺序应该跟编码一致。

使用特权

评论回复
10
heisexingqisi| | 2017-12-21 09:06 | 只看该作者
网上也有教程,学习下楼主的方法。

使用特权

评论回复
评论
heisexingqisi 2018-4-11 17:29 回复TA
@展0113 :字库文件是按照文字的编码顺序做的一个数组。你使用这个文字的时候实际上是在用他对应编码下的点阵 
展0113 2018-4-1 20:41 回复TA
请问一下教程在哪啊 
11
heisexingqisi| | 2018-4-11 17:27 | 只看该作者
按照字码的顺序给点阵数组。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

249

主题

5397

帖子

22

粉丝