[RISC-V MCU 创新应用比赛]

沁恒 CH32V103 读取内存卡字库显示

[复制链接]
15028|43
手机看帖
扫描二维码
随时随地手机跟帖
gtbestom|  楼主 | 2021-8-11 17:58 | 显示全部楼层 |阅读模式
本帖最后由 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米左右即可拥有。

714766113914f111b7.png



  怎么点亮屏幕这篇**就不说了,买屏送的资料就够亮屏了。
  本次主要实现内存卡字库的读取,显示。
  由于内存卡存放的文件,文件名可能是各种各样的,如果要显示任意中文字符,就需要对所有 汉字 进行取模,生成字库。
  那把所有汉字打出来,再一一取模不就好了?
853746113945e903ad.png

  这里涉及2个问题:

  1、汉字有上万个,常见的也有几千个,一一取模再转换未免太费神。

  2、这么多汉字,如何一一对照,例如我想在这一堆字模中,快速找到“我”这个字的字模。


  什么?忘记取模的时候“我”的字模排在第几位了。


  对于第一个问题,感谢一些前辈大佬,已经有很多生成字库的软件了。

  第二个问题,汉字编码有很多种,例如 GB2312(收录6763汉字)、GBK(收录21886汉字)、Unicode(收录6万多字)、UTF-32则收录了12万字。

  已经有以上多种编码了,编码就代表着文字的排序,直接对照就好。

  这里取GBK和Unicode为例。GBK中出现的第一个汉字为“丂”,编码为16进制的8140,一个汉字用2个字节表示。
  如何获取汉字GBK编码?这里提供一种土办法,串口助手!
  将RX和TX短接,发送设置为字符GBK编码,接收设置为16进制,发送后接收到的就是字符编码:
306396113985c2417b.png

  获取 Unicode 同理,发送切换到 Unicode 编码,接收为16进制:

9389961139b65b6073.png

  取模不管对照GBK编码,还是Unicode编码,都是能实现我们这个功能的。直接选个编码开始取模:

9781461139c96a3041.png

  生成字库二进制文件:
6796061139cf968d44.png

  再放入内存卡即可,然后使用 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;    // 得到字库中的字节偏移量
  得到字模后显示即可,就不多说了,上图:
微信图片_20210811175754.jpg





使用特权

评论回复

相关帖子

ccook11| | 2021-8-12 20:19 | 显示全部楼层
读取的速度快吗?        

使用特权

评论回复
评论
gtbestom 2021-8-15 16:47 回复TA
SPI速度比不上SDIO,能达到几百KB/S,用DMA能再快一点 
sheflynn| | 2021-8-12 20:21 | 显示全部楼层
生成的软件在哪里下载呢   

使用特权

评论回复
linfelix| | 2021-8-12 20:21 | 显示全部楼层
为什么不使用外部的flash呢        

使用特权

评论回复
jtracy3| | 2021-8-12 20:21 | 显示全部楼层
spi的速度能够到多少?         

使用特权

评论回复
评论
gtbestom 2021-8-15 16:49 回复TA
几百KB/S,使用DMA应该能在1M左右 
pentruman| | 2021-8-12 20:21 | 显示全部楼层
以前测试过,效果不是很好。   

使用特权

评论回复
tabmone| | 2021-8-12 20:22 | 显示全部楼层
这个使用系统了吗?      

使用特权

评论回复
juliestephen| | 2021-8-12 20:22 | 显示全部楼层
iic的oled吗?         

使用特权

评论回复
wilhelmina2| | 2021-8-12 20:23 | 显示全部楼层
字库的软件是哪个?      

使用特权

评论回复
belindagraham| | 2021-8-12 20:23 | 显示全部楼层
编码方式时什么?怎么对应的   

使用特权

评论回复
评论
gtbestom 2021-8-15 16:53 回复TA
编码方式一般用GBK,因为代码编辑器一般也是设置GBK编码,如果读取文件系统的长文件名,可以使用Unicode编码的字库直接显示,就省的Unicode再转GBK这个过程了 
phoenixwhite| | 2021-8-12 20:23 | 显示全部楼层
这个可以,非常优秀了。   

使用特权

评论回复
gtbestom|  楼主 | 2021-8-15 16:48 | 显示全部楼层
linfelix 发表于 2021-8-12 20:21
为什么不使用外部的flash呢

板子上没带flash,刚好读取文件用到内存卡,就一并放入内存卡了

使用特权

评论回复
gtbestom|  楼主 | 2021-8-15 16:49 | 显示全部楼层
pentruman 发表于 2021-8-12 20:21
以前测试过,效果不是很好。

看要做什么,普通需求也够用了

使用特权

评论回复
gtbestom|  楼主 | 2021-8-15 16:50 | 显示全部楼层
tabmone 发表于 2021-8-12 20:22
这个使用系统了吗?

没有跑操作系统,但是加了文件系统读取文件。

使用特权

评论回复
gtbestom|  楼主 | 2021-8-15 16:51 | 显示全部楼层

是iic的oled屏,小巧便宜

使用特权

评论回复
pixhw| | 2022-10-9 22:04 | 显示全部楼层
带的闪存实在太小了                 

使用特权

评论回复
suzhanhua| | 2022-10-9 22:19 | 显示全部楼层
如何把中文字库通过Fat文件系统放入SD卡

使用特权

评论回复
ingramward| | 2022-10-9 22:39 | 显示全部楼层
使用外部 FLASH 来存储字库     

使用特权

评论回复
jtracy3| | 2022-10-10 17:52 | 显示全部楼层
SD卡字库文件需要放在根目录              

使用特权

评论回复
cehuafan| | 2022-10-10 20:35 | 显示全部楼层
  找到该汉字在字库中的偏移位置,然后读取  

使用特权

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

本版积分规则

17

主题

98

帖子

0

粉丝