0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用采用SPI Flash存储中文字符库的方法说明

单片机爱好者 2018-12-15 10:59 次阅读

嵌入式系统中,有时候需要中文字符来表示我们的某些信息,但是中文字符库本身占据空间比较大,因此有时候仅仅对系统中需要的字符进行编码,其它的则省掉,但是这样对于编程调用字符时是比较麻烦的,只能一个一个进行调用然户显示。然而,有时候在比较大的系统中需要很多的中文字符,如果还是对需要的进行一个个编码将显得非常费时,此时有必要采用一个字库来完成我们的工作。

嵌入式系统中,用得比较多的是GBK2312B编码的字库(还有一个是Unicode编码),编码后得到的是一个字符数组,每一个中文字符对应多个字节(具体字节数看取模的大小),需要显示某个字符只需取得该字符的GBK内码,然后找到该字符对应数组中的地址,最后将这个字符对应的所有字节按照预定的格式写入液晶屏即可。这样操作带来的简便就是,你想显示某个字符只需以字符串的格式输入该字符然后调用显示函数就行了。这时有个问题出现了,7千多个字符编码后得占用多大空间啊?

大概有200KB,但是对于现在的MCU,本身自带的rom就很宝贵,另外MCU的ROM越大其成本就越高。所以,如果将200kb的字库写入MCU将不太划算。不将字库存入MCU,就得存入另外一种介质中,这种介质可能是SD卡, SPI Flash。对于SD卡我没有试过,虽然容量大,但据说读取速度比较慢,另外封装较大,占板子面积,感觉适用与大的系统吧,比如MP3;而SPI flash, 体积小,容量也还可以,我所了解的也有8M的,可能还有更大容量的。好了,废话了这么多,那么本文接下来就绍如何用SPI flash做中文字库:

第一步,当然需要你将你所用的SPIflasn的初始化以及读写函数写好(我使用的W25X16,2M,传输速率最大74MHZ,很快的;板子主芯片STM32F103RBT6)。写函数:void W25X_Write_Bytes(uint32_t addr,u8* pBuffer, u16 nBytes) 注:W25X16写时,需要先擦除。读函数:void W25X_Read_Bytes(uint32_t addr, u8* pBuffer, u16 nBytes)第二步,编写串口传输函数,采用串口中断的方式,波特率设置为115200(测试没有问题),接收外部输入的一个字节后立马将其写入SPI FLASH。与之前两个字符表示一个字节的方法速度提升一倍。代码:

u8 result;

u32 pAddr=0;

void USART1_IRQHandler(void)

{

if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)

{

result= USART_ReceiveData(USART1);

W25X_Write_Bytes(pAddr++,&result,1);

USART_ClearITPendingBit(USART1,USART_IT_RXNE);// 清除串口接受中断

}

}

第三步,设置一个按键进行擦除操作,通过串口或者LCD进行交互,以提示是否擦除完成。可以进行写FLASH。第四步,制作中文字库,GB3212库包含6768个简体中文,首先打开“取点阵.exe”软件,然后在软件中打开“字符库.txt”文件。

然后选择取模方式,可以设置字体样式、大小和方向设置等。注意“方向设置“选项,这里为了对应工程中的显示程序,选择——横向取模,高位在坐。其它选项只要适当修改显示程序就可以。

然后点击“输出“按钮,将在该目录下得到字模数组文件(temp.txt)。第五步,整理字库文件。上一步得到的字模数组文件还不能直接使用,需要进行整理以适合串口发送,去除各种注释符和标点字符,只保留两位字符组成的十六进制格式。接着将“temp.txt”改名为“HzLib.txt”,然后运行“整理字库.exe”,此时将得到整理好的字库“OutHzLib.txt”然后就可以直接将该字库通过串口发送到MCU了。

第六步,串口发送数据。推荐用附件中的串口调试软件,因为有些软件在对于文件发送这个功能做得似乎有些问题。本人也测试了两款串口调试软件,均不能得到结果,如果有其它好的也可以,反正只要达到目的就行。设置串口参数,然后在发送区设置中勾选“按十六进制发送”,点击“启动文件数据原”选项,选择制作好的字库“OutHzLib.txt”,不要点击“文件载入”。

第七步,打开串口,将板子接通电源,首先对Flash进行擦除操作,提示擦除结束后,点击串口发送,然后就慢慢等着字库写入FLASH。测试在波特率为115200下,取模大小为16*16,耗时为70s,似乎也不太久,如果取模越大,耗时就越长。写好字模后,就可以在工程中调用字库进行中文显示了(取GBK内码操作见工程)。另外如果flash容量够大的话,还可以写入其它字体样式和大小的字库,做一个专属的字库芯片。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1547

    浏览量

    146626
  • 嵌入式系统
    +关注

    关注

    40

    文章

    3397

    浏览量

    128185
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1610

    浏览量

    89539

原文标题:采用SPI Flash存储中文字符库

文章出处:【微信号:gh_dae0718828df,微信公众号:gh_dae0718828df】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于定义中文字符串的问题

    本人使用的是pic18f25k20,想要定义一些中文字符串,结果定义的时候发现了一些问题,无法理解,请各位大神帮忙。直接上图吧,定义了两个中文字符串,第二个后面多了一些方框,不知道是什么意思,编译的话都通过了。是不是这种定义方式对中文字
    发表于 11-06 11:34

    扩展ASCII打印中文字符而不是美国

    缺陷报告:扩展ASCII打印中文字符,而不是美国StAMTF(TSTR),“%LD V”,IVILTS;LCD-PrimtStand(TSTR);应给予“1234567 V”但给出“12345×6XYV”X和Y是汉字,见图像微量PNG8 K
    发表于 09-20 10:27

    如何在multiedit中对中文字符进行删除操作?

    在multiedit中利用MULTIEDIT_AddKey(hMulti, GUI_KEY_BACKSPACE)可以很好的删除光标上一个8为ascii字符,但是对于16位的中文字符就不好使,大家用的是什么办法来删除中文字符的呀?
    发表于 09-25 04:25

    C语言关于中文字符串的使用误区在哪

    C语言关于中文字符串的使用误区背景前几天在写c语言代码进行文件读写的时候,在处理文件中的中文诗句的过程中发现了c语言txt文本文件的中文读取到char数组中的一些不同寻常之处,因此做一个总结。c语言
    发表于 07-14 07:54

    C语言中文字符串的使用误区有哪些?

    c语言汉字的存储方式和特点是什么?C语言中文字符串的使用误区有哪些?
    发表于 10-15 06:24

    使用printf去打印中文字符的时候出现乱码是为什么?

    使用printf去打印中文字符的时候出现乱码是为什么?
    发表于 12-02 07:12

    Arduino发送中文字符为什么需要转码?

    Arduino IDE支持GB编码之前,有没有一种简便的方法,来解决中文汉字输出的问题?答案就是:ATFC043串口智能屏。Arduino IDE编译中文字符这是Arduino IDE自带串口监视器的显示
    发表于 12-17 11:23

    STM32程序printf打印中文字符到串口出现乱码的解决方法

    STM32程序printf打印中文字符到串口出现乱码解决方法作者但也请保留上面这段声明。 谢谢! (以上两个链接均是我个人的博客,只是在不同的平台上面)前言:相信同我一样,有一部分同学在写单片机程序的...
    发表于 02-21 07:08

    如何在终端上使用UART输出中文字符

    应用程序: 演示如何在终端上使用 UART 输出中文字符 BSP 版本:M451系列BSP CMSIS V3.01.003 硬件: NuTiny-EVB-M451 LQFP100 V1.3 序列
    发表于 08-23 06:46

    如何使用M051驱动LCD显示中文字符

    应用程序: 此代码使用 M051 驱动 LCD 显示中文字符 。 BSP 版本: M051系列 BSP CMSIS v3.01.001 硬件: Nu-LB_004 v1.0 The sample
    发表于 08-23 08:07

    M451如何在终端上使用UART输出中文字符

    应用程序: 演示如何在终端终端上使用 UART 输出中文字符 BSP 版本:M451系列BSP CMSIS V3.01.003 硬件: NuTiny-EVB-M451 LQFP100 V1.3
    发表于 08-30 07:23

    如何使用M051驱动LCD显示中文字符

    应用程序: 此代码使用 M051 驱动 LCD 显示中文字符 。 BSP 版本: M051系列 BSP CMSIS v3.01.001 硬件: Nu-LB_004 v1.0 The sample
    发表于 08-30 06:52

    IAR中UTF-8中文字符串不显示怎么解决?

    界面使用的是ucGUI原本使用GB2312编码的中字符串可以直接读取显示,字库也用FontCvt做了初始化的时候也添加了GUI_UC_SetEncodeutf8();函数 后面换成UTF-8的中文字符
    发表于 10-07 07:11

    使用FPGA驱动LCD显示中文字符年的VHDL程序

    本文档的主要内容详细介绍的是使用FPGA驱动LCD显示中文字符年的VHDL程序。
    发表于 12-18 16:44 10次下载

    如何遍历中文字符

    今天和大家分享下如何遍历中文字符串,主要是如何打印中文字符,因为中文字符串每个字符占用不只一个字节的空间,如果我们逐个字节遍历,会出现奇怪的结果。而UTF-8编码写的
    的头像 发表于 07-03 09:15 377次阅读
    如何遍历<b class='flag-5'>中文字符</b>串