×

STM32F103ZET6------点阵字库以及寻址显示

zxjy辉 zxjy辉 发表于2022-12-22 17:37:02 浏览345 评论0

抢沙发发表评论

前几天弄好了片外的flash下载算法,打算通过算法直接将字库文件存入到外部的flash中,这样就不需要专门对字库文件进行其他操作(例如将数据从SD卡在复制到片外flash中或者是单独将数据写入到flash),这个点阵字库,弄了挺久的,上网查找了很多的生成软件,都有所限制,最后找到了FontMaker

  1. 需求

    1. 需要将对应的汉字显示到lcd屏幕上,由于在很多情况下会用到GB2312字库文件,它占据的空间是比较大的,并且是字号越大,字体的数据也就越多,这样就会导致一个问题,stm32的内部空间是不够用的,必须要外扩外部的flash来达到存储的目的

  2. 取得字模,利用工具FontMaker,将所需要的字体取出

    图片.png

    在这里可以选择生成.c文件和.bin文件,这两者的区别就在与生成的大小的问题,使用二进制文件会小很多,可以大大节省flash的空间

    图片.png

    需要注意的是:

    1. 生成的c文件的内容是这样的,和自己使用的寻址格式是不一样的(采用GBK内码寻址),所以需要修改

      图片.png

      修改为:其他的两个数组没有用,并且将字模数组改为一维的

      图片.png

    2. 同样要注意的是:对应的bin文件也要进行修改,这里就要用到一个新的工具将C文件转为bin文件的工具(正点原子的c2b),并且数组的位数要选择8位,并且是高字节在前

      图片.png

  3. GBK内码寻址

    这个内码,就是对这个数组进行编组,内码是由2个字节决定的,高字节表示区号,低字节表示对应的哪个位置;

    例如:“辉”这个汉字的GBK内码是BBD4(通过串口直接打印这个字,在16进制下显示的也是0xBBD4),这个就表示了对应的位置是在BB区的第D4个,这个BBD4也就是对应的偏移地址

    上一幅图中的u+3000这个是unicode码,需要转为GBK码

    图片.png

    1. 寻址方式:GBK2312的汉字个数是8836个,这个要区别与GBK,这个编码的汉字有23940个汉字,所以这两个编码的寻址是不一样的
      GBK2312编码中,每一个区是94个汉字,而GBK不是
      csize=(size/8+((size%8)?1:0))*(size);                        //得到字体一个字符对应点阵集所占的字节数    一个16号汉字 32个字节 
      foffset=((unsigned long)94*(qh-161)+(ql-161))*csize;    //得到字库中的字节偏移量
      qh:内码的高字节
      ql:内码的低字节
      减去161,就是减去A1,因为实际的偏移地址是从0开始的,而不是A1A1,A1A1是gbk的编号,所以需要自己减去

#好好学习!

群贤毕至

访客