找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1375|回复: 0
打印 上一主题 下一主题
收起左侧

基于SC95F8616单片机的中文字库文件生成与验证

[复制链接]
跳转到指定楼层
楼主
为进行中文字库文件的生成与验证,其硬件的基本构成如图1所示。
在前面曾介绍过以通讯方式传送字库文件来构建中文字库,但要生成一个字库文件也需要做一些基本工作。

1 硬件的基本构成

我们知道汉字的字模在字库中是按区位码的顺序来排放的,因此在制作时也需要按此来处理,下面以16区的汉字为例来进行说明。

16区的汉字共有94个字,依次是:
啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥。
然后在字库提取软件PCtoLCD2002完美版的生成文本文件界面,添加16区的汉字,并按图2加以设置。点击“开始生成”即可生成命名的文件K16.font,使用WinHex软件可查看该文件的内容,其内容如图3所示。
2 字库文件生成工具

3 查看字库文件

有了字库文件后,我们就可以使用下面的程序将16区的字模转存到W25Q16存储模块中。

转存与查验主程序:
  1. void main(void)
  2. {
  3.         BitStatus f;
  4.         uint8_t j,x,no;
  5.         uint16_t i;
  6.         uint32_t Z;
  7.         mdelay(500);
  8.         GPIO_Init(GPIO0, GPIO_PIN_4,GPIO_MODE_OUT_PP);
  9.         GPIO_WriteLow(GPIO0, GPIO_PIN_4);
  10.         GPIO_Init(GPIO0, GPIO_PIN_5, GPIO_MODE_IN_PU);        
  11.         GPIO_Init(GPIO0, GPIO_PIN_6, GPIO_MODE_IN_PU);
  12.         GPIO_Init(GPIO0, GPIO_PIN_7, GPIO_MODE_IN_PU);
  13.         SPIInit();
  14.         Uart0Init();
  15.         enableInterrupts();
  16.         printf("W25Q16 TEST: \n\r");
  17.         printf("K3:WR  K4:RD\n\r");
  18.         while(GPIO_ReadPin(GPIO0, GPIO_PIN_7));
  19.         while(1)
  20.         {
  21.           if(GPIO_ReadPin(GPIO0, GPIO_PIN_7)==0)
  22.           {
  23.           printf("WR\n\r");
  24.           W25_SectorErase(0);
  25.           Z=0;
  26.           i=0;
  27.           j=0;
  28.           while(Z<3008)   //  3008=32*94字
  29.           {
  30.             if(Uart0ReceiveFlag)
  31.             {
  32.               Send_DATA[0]=u;
  33.               SPI_Flash_Write_NoCheck(Send_DATA,Z,1);
  34.               Z++;
  35.               Uart0ReceiveFlag=0;
  36.             }
  37.           }
  38.         }

  39.         if(GPIO_ReadPin(GPIO0, GPIO_PIN_6)==0)
  40.         {
  41.            printf("RD\n\r");
  42.            Z=0;
  43.            for(j=0;j<188;j++)    //  188=3008/16行
  44.            {
  45.                SPI_Flash_Read(Rec_DATA,Z,16);
  46.                for(i=0;i<16;i++)
  47.                {
  48.                        printf("%c",Rec_DATA[i]);
  49.                }
  50.                Z=Z+16;
  51.            }
  52.         }
  53.    }
  54.    while(1);
  55. }
复制代码

K3键后,其转存结果如图4和图5所示。

4 转存结果1

5 转存结果2

K4键后,其读取结果如图6和图7所示,由此证明转存是成功的。

6 读取结果1

7 读取结果2

使用下面的显示验证函数,可得到图8所示的效果,说明显示验证也正确。

显示验证主程序:
  1. void main(void)
  2. {
  3.         BitStatus f;
  4.         uint8_t j,x,no;
  5.         uint16_t i;
  6.         uint32_t Z;
  7.         
  8.         mdelay(500);
  9.         GPIO_Init(GPIO0, GPIO_PIN_4,GPIO_MODE_OUT_PP);
  10.         GPIO_WriteLow(GPIO0, GPIO_PIN_4);
  11.         GPIO_Init(GPIO0, GPIO_PIN_5, GPIO_MODE_IN_PU);        
  12.         GPIO_Init(GPIO0, GPIO_PIN_6, GPIO_MODE_IN_PU);
  13.         GPIO_Init(GPIO0, GPIO_PIN_7, GPIO_MODE_IN_PU);
  14.         SPIInit();
  15.         Uart0Init();
  16.         enableInterrupts();
  17.    
  18.         OLED_Init();
  19.         OLED_Clear();
  20.         OLED_ShowString(0,0,"SC95F8616",16);
  21.         OLED_ShowCHineset(0,6,0);
  22.         while(GPIO_ReadPin(GPIO0, GPIO_PIN_7));
  23.         OLED_ShowCHinese(0,2,0);
  24.         OLED_ShowCHinese(16,2,1);
  25.         OLED_ShowCHinese(32,2,2);
  26.         OLED_ShowCHinese(48,2,3);
  27.         OLED_ShowCHinese(64,2,4);

  28.         OLED_ShowCHinese(0,4,5);  
  29.         OLED_ShowCHinese(16,4,6);
  30.         OLED_ShowCHinese(32,4,7);
  31.         OLED_ShowCHinese(48,4,8);
  32.         OLED_ShowCHinese(64,4,9);

  33.         OLED_ShowCHinese(0,6,10);  
  34.         OLED_ShowCHinese(16,6,11);
  35.         OLED_ShowCHinese(32,6,12);
  36.         OLED_ShowCHinese(48,6,13);
  37.         OLED_ShowCHinese(64,6,14);

  38.         while(1);
  39. }
复制代码

显示验证功能函数:
  1. void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no)
  2. {
  3.           unsigned char t;
  4.           uint32_t p=0;
  5.          
  6.           OLED_Set_Pos(x,y);
  7.           p=p+no*32;
  8.           SPI_Flash_Read(Rec_DATA,p,16);
  9.          
  10.           for(t=0;t<16;t++)
  11.           {
  12.                           OLED_WR_Byte(Rec_DATA[t],OLED_DATA);
  13.           }
  14.          
  15.           OLED_Set_Pos(x,y+1);
  16.           p=p+16;
  17.           SPI_Flash_Read(Rec_DATA,p,16);
  18.          
  19.           for(t=0;t<16;t++)
  20.           {
  21.                           OLED_WR_Byte(Rec_DATA[t],OLED_DATA);
  22.           }
  23. }
复制代码

8字库显示验证


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表