找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于SC95F8616单片机的W25Q16中文字库构建及使用

[复制链接]
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2020-7-17 19:13 编辑

1. 串行通讯传送字库文件
首先制作一个测试文件HEX.TXT


然后编写主程序,其代码如下:
  1. extern bit Uart0SendFlag;
  2. extern bit Uart0ReceiveFlag;

  3. uint8_t  Send_DATA[16];
  4. uint8_t  Rec_DATA[16];

  5. void main(void)
  6. {
  7.           uint8_t j
  8.          Uart0Init();
  9.          enableInterrupts();
  10.          while(1)
  11.          {
  12.              if(Uart0ReceiveFlag)
  13.              {
  14.                              Uart0ReceiveFlag = 0;
  15.                               u=UART0_ReceiveData8();
  16.                               printf("%c",u);
  17.                               j++;
  18.             }
  19.             if(j==16)
  20.             {
  21.                j=0;   
  22.            }
  23.        }
  24. }
复制代码

辅助函数为:
  1. void Uart0Init(void)
  2. {
  3.          GPIO_Init(GPIO2, GPIO_PIN_1, GPIO_MODE_IN_PU);
  4.          UART0_Init(32000000, 9600, UART0_Mode_10B, UART0_CLOCK_TIMER1, UART0_RX_ENABLE);
  5.          UART0_ITConfig(ENABLE, LOW);
  6. }

  7. char putchar(char c)
  8. {
  9.          UART0_SendData8(c);
  10.          while(!Uart0SendFlag);
  11.          Uart0SendFlag = 0;
  12.          return c;
  13. }
复制代码

通讯中断复位程序为:
  1. void UART0Interrupt()              interrupt 4
  2. {
  3.          if(UART0_GetFlagStatus(UART0_FLAG_TI))
  4.          {
  5.                    UART0_ClearFlag(UART0_FLAG_TI);
  6.                    Uart0SendFlag = 1;
  7.          }
  8.          else if(UART0_GetFlagStatus(UART0_FLAG_RI))
  9.          {
  10.                    UART0_ClearFlag(UART0_FLAG_RI);
  11.                    Uart0ReceiveFlag = 1;   
  12.                    UART0_SendData8(UART0_ReceiveData8());
  13.          }
  14. }
复制代码

在下载程序后,首先打开串口调试器并设好通讯参数。然后按“读取文件”按钮,以载入发送文件。再将发送方式选为16进制,点击“发送”按钮加以发送,则获得图示的结果,说明收发数据项一致是可行的。
串口收发效果

将下面的字库文件发送给存储模块并保存,以便后续测试。


2.以区位码进行汉字显示
在使用自建字库,由于规模小,一般是使用顺序号来调用字模,但要使用一个完整的字库,则要参照区位码来调用字模。
本打算以这种方式来进行OLED_ShowCHineseh(0,2,''),无奈编译系统不支持,只好直接采用区位码的方式OLED_ShowCHineseh(0,2,0xB0A1),其运行效果如图所示。

以区位码显示中文

显示显示效果的主程序如下:
  1. void main(void)
  2. {
  3.          OLED_Init();
  4.          OLED_Clear();
  5.          OLED_ShowCHineseh(0,2,0xB0A1);   //啊
  6.          OLED_ShowCHineseh(16,2,0xB0A2);  //阿
  7.          OLED_ShowCHineseh(32,2,0xB0A3);  //埃
  8.          OLED_ShowCHineseh(48,2,0xB0A4);  //挨
  9.          OLED_ShowCHineseh(64,2,0xB0A5);  //哎
  10.         
  11.          OLED_ShowCHineseh(0,4,0xB0A6);   //唉
  12.          OLED_ShowCHineseh(16,4,0xB0A7);  //哀
  13.          OLED_ShowCHineseh(32,4,0xB0A8);  //皑
  14.          OLED_ShowCHineseh(48,4,0xB0A9);  //癌
  15.          OLED_ShowCHineseh(64,4,0xB0AA);  //蔼
  16.          while(1);
  17. }
复制代码

按区位码显示中文函数为:
  1. void OLED_ShowCHineseh(unsigned char x,unsigned char y,unsigned int no)
  2. {                                
  3.            unsigned char t,q,w,u;
  4.            // 暂未添加区码处理
  5.            // q=(unsigned char) (no&0xff00)>>8;
  6.            // w=(q-176)*94+w
  7.            w=(unsigned char) no&0xff;
  8.            w=(w-0xA1)*2;
  9.            if(w>9)
  10.            {
  11.                                OLED_ShowChar(16,0,w/10+'0',16);
  12.            }
  13.            OLED_ShowChar(24,0,w%10+'0',16);
  14.            OLED_Set_Pos(x,y);   
  15.            for(t=0;t<16;t++)
  16.            {
  17.                                OLED_WR_Byte(Hzk[w][t],OLED_DATA);
  18.            }  
  19.            q=q+1;
  20.            OLED_Set_Pos(x,y+1);         
  21.            for(t=0;t<16;t++)
  22.            {  
  23.                               OLED_WR_Byte(Hzk[w][t],OLED_DATA);
  24.            }
  25. }
复制代码

这样在具备完整中文字库的情况下,我们就可以按汉字的编码从字库中读取字模来显示中文信息。

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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