[技术问答] 单片机,字库文件是怎么调用的?

[复制链接]
5544|12
 楼主| 598330983 发表于 2017-2-24 18:40 | 显示全部楼层 |阅读模式
如果做好了一个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地址开始存储,那么获取某个汉字的字模的函数就可以写成:
 楼主| 598330983 发表于 2017-2-24 19:01 | 显示全部楼层
  1. void Get_GBK_DZK(uint8_t *code, uint8_t *dz_data)
  2. {
  3.     uint8_t GBKH,GBKL;                 
  4.     uint32_t offset;        

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


 楼主| 598330983 发表于 2017-2-24 19:07 | 显示全部楼层
上面看似有点糊涂,刚开始。我觉得别人也会糊涂的,我这里就讲清楚
那个return;就是返回空,直接返回到调用处。
调用处在哪儿呢?

  Get_GBK_DZK("瑞", buf);
也就是那个W25Q16_Read(dz_data,offset+0x100,32);       这个函数执行后,退回到调用处。而这里的dz_data,刚好是buf,也就是要显示的缓存区,buf。
完成了这一部,我就就直接推送buf的内容到显示器就行了。
734774645 发表于 2017-2-24 19:32 | 显示全部楼层
虽然不长,但是是讲的最明白的一个。
拐拐 发表于 2017-12-20 20:39 | 显示全部楼层
598330983 发表于 2017-2-24 19:00
字符编码原理:英文字母带各种符号等共有95个,都有自己的ascii码,一个字母或者符号就是一个ascii码。汉字 ...

之前还迷迷糊糊的,现在清楚了很多。但是还有一个问题,GBK字库生成24*24的子库存入flash后,我要显示一个字就要提取72字节数据,原本两个字节数据表示一个汉字,现在却要用72个字节来表示,是不是GBK生成点阵字库后表示方法就不一样了?
xinpian101 发表于 2017-12-20 22:49 | 显示全部楼层
存储的顺序应该跟编码一致。
heisexingqisi 发表于 2017-12-21 09:06 | 显示全部楼层
网上也有教程,学习下楼主的方法。

评论

@展0113 :字库文件是按照文字的编码顺序做的一个数组。你使用这个文字的时候实际上是在用他对应编码下的点阵  发表于 2018-4-11 17:29
请问一下教程在哪啊  发表于 2018-4-1 20:41
heisexingqisi 发表于 2018-4-11 17:27 | 显示全部楼层
按照字码的顺序给点阵数组。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

267

主题

5575

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部