OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 482|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第四十八章 汉字显示实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-5-20 15:24:00 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-5-17 16:43 编辑

第四十八章 汉字显示实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章将介绍正点原子提供的字库管理库的使用,通过使用字库能够在LCD或其他显示设备上显示中文字符,对应中文应用的开发,是一个很有用的工具。通过本章的学习,读者将学习到正点原子字库管理库的使用。
本章分为如下几个小节:
48.1 硬件设计
48.2 程序设计
48.3 下载验证

48.1 硬件设计
48.1.1 例程功能
1. 自动检查并在无字库时自动更新字库
2. LCD上不断刷新显示汉字
3. LED0闪烁,提示程序正在运行

48.1.2 硬件资源
1. LED
       LED0 - PB5
2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块
3. 按键
       WKUP - PA0
4. NOR Flash
       SPI2_SCK - PB13
       SPI2_MISO - PB14
       SPI2_MOSI - PB15
       SPI2_CS - PB12
5. SD
       SDIO_D0 - PC8
       SDIO_D1 - PC9
       SDIO_D2 - PC10
       SDIO_D3 - PC11
       SDIO_SCK - PC12
       SDIO_CMD - PD2

48.1.3原理图
本章实验使用的字库管理库为软件库,因此没有对应的连接原理图。

48.2 程序设计
48.2.1 字库管理库的使用
正点原子提供的字库管理库包含了四个文件,分别为:fonts.c、fonts.h、text.c和text.h,本章实验配套实验例程中已经提供了这四个文件,并且已经针对正点原子M144Z-M3最小系统板STM32F103版软硬件进行了移植适配,用户在使用时,仅需将这四个文件添加到自己的工程中即可,如下图所示:
3.png
图48.2.1.1 正点原子字库管理库文件
字库管理库中fonts.c和fonts.h两个文件提供了字库更新和初始化的函数,test.c和test.h文件中提供了在LCD上显示中文字符的函数。
字库管理库在显示中文字符至LCD上时会使用NOR Flash中的中文字库,因此需要确保NOR Flash中的中文字库无误,若NOR Flash中没有中文字库的数据,那么在进行字库初始化时就会提示失败,这时就需要使用字库管理库中提供的字库更新函数更新NOR Flash中的中文字库数据,更新字库是读取SD卡中的字库文件将其写入NORFlash,因此需确保SD卡中有对应的中文字库文件。
本章实验所需的中文字库文件可在A盘à5,SD卡根目录文件àSYSTEMàFONT中找到,建议将A盘à5,SD卡根目录文件中的所有文件按照该目录的目录结构复制到SD卡中,方便后续实验的使用。

48.2.2 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     uint8_t t = 0;
  4.     uint8_t key;
  5.     uint8_t res;
  6.     uint32_t fontcnt;
  7.     uint8_t i;
  8.     uint8_t j;
  9.     uint8_t fontx[2];
  10.    
  11.    HAL_Init();                         /* 初始化HAL库 */
  12.    sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
  13.    delay_init(72);                     /* 初始化延时 */
  14.    usart_init(115200);                 /* 初始化串口 */
  15.    led_init();                         /* 初始化LED */
  16.    key_init();                         /* 初始化按键 */
  17.    lcd_init();                         /* 初始化LCD */
  18.    my_mem_init(SRAMIN);                /* 初始化内部SRAM内存池 */
  19.    exfuns_init();                      /* 为exfuns申请内存 */
  20.    f_mount(fs[0], "0:", 1);            /* 挂载SD卡 */
  21.    f_mount(fs[1], "1:", 1);            /* 挂载NOR Flash */
  22.    
  23.     /* 检查字库 */
  24.     while (fonts_init() != 0)
  25.     {
  26. UPD:
  27.          lcd_clear(WHITE);
  28.          lcd_show_string(30, 30, 200, 16, 16, "STM32", RED);
  29.          
  30.          /* 初始化SD卡 */
  31.          while (sd_init() != 0)
  32.          {
  33.              lcd_show_string(30, 30, 200, 16, 16, "SD CardError!", RED);
  34.              delay_ms(500);
  35.              lcd_show_string(30, 30, 200, 16, 16, "PleaseCheck! ", RED);
  36.              delay_ms(500);
  37.              LED0_TOGGLE();
  38.          }
  39.          
  40.          lcd_show_string(30, 50, 200, 16, 16, "SD CardOK", RED);
  41.          lcd_show_string(30, 70, 200, 16, 16, "FontUpdating...", RED);
  42.          
  43.          /* 更新字库 */
  44.          res = fonts_update_font(30, 90, 16, (uint8_t *)"0:", RED);
  45.          while (res != 0)
  46.          {
  47.              lcd_show_string(30, 90, 200, 16, 16, "Font UpdateFailed!", RED);
  48.              delay_ms(200);
  49.              lcd_show_string(30, 90, 200, 16, 16, "PleaseCheck!      ", RED);
  50.              delay_ms(200);
  51.          }
  52.          
  53.          lcd_show_string(30, 90, 200, 16, 16, "Font UpdateSuccess!   ", RED);
  54.          delay_ms(1500);
  55.          lcd_clear(WHITE);
  56.     }
  57.    
  58.    text_show_string(30, 30, 200, 16, "正点原子STM32开发板", 16, 0, RED);
  59.    text_show_string(30, 50, 200, 16, "GBK字库测试程序", 16, 0, RED);
  60.    text_show_string(30, 70, 200, 16, "ATOM@ALIENTEK", 16, 0, RED);
  61.    text_show_string(30, 90, 200, 16, "WKUP: 更新字库", 16, 0, RED);
  62.    
  63.    text_show_string(30, 110, 200, 16, "内码高字节:", 16, 0, BLUE);
  64.    text_show_string(30, 130, 200, 16, "内码低字节:", 16, 0, BLUE);
  65.    text_show_string(30, 150, 200, 16, "汉字计数器:", 16, 0, BLUE);
  66.    
  67.    text_show_string(30, 180, 200, 24, "对应汉字为:", 24, 0, BLUE);
  68.    text_show_string(30, 204, 200, 16, "对应汉字(16*16)为:", 16, 0, BLUE);
  69.    text_show_string(30, 220, 200, 12, "对应汉字(12*12)为:", 12, 0, BLUE);
  70.    
  71.     while (1)
  72.     {
  73.          fontcnt = 0;
  74.          
  75.          /* GBK内码高字节范围为0x81~0xFE */
  76.          for (i=0x81; i<0xFF; i++)
  77.          {
  78.              fontx[0] = i;
  79.              lcd_show_num(118, 110, i, 3, 16, BLUE);
  80.             
  81.              /* GBK内码低字节范围为0x40~0x7E、0x80~0xFE)*/
  82.              for (j=0x40; j<0xFE; j++)
  83.              {
  84.                  if (j == 0x7F)
  85.                  {
  86.                      continue;
  87.                  }
  88.                  
  89.                  fontcnt++;
  90.                  lcd_show_num(118, 130, j, 3, 16, BLUE);
  91.                  lcd_show_num(118, 150, fontcnt, 5, 16, BLUE);
  92.                  fontx[1] = j;
  93.                  text_show_font(30 + 132, 180, fontx, 24, 0, BLUE);
  94.                  text_show_font(30 + 144, 204, fontx, 16, 0, BLUE);
  95.                  text_show_font(30 + 108, 220, fontx, 12, 0, BLUE);
  96.                  
  97.                  t = 200;
  98.                  while ((t--) != 0)
  99.                  {
  100.                      delay_ms(1);
  101.                      
  102.                      key = key_scan(0);
  103.                      if (key == WKUP_PRES)
  104.                      {
  105.                          /* 更新字库 */
  106.                          goto UPD;
  107.                      }
  108.                  }
  109.                  
  110.                  LED0_TOGGLE();
  111.              }
  112.          }
  113.     }
  114. }
复制代码
从上面的代码中可以看出,本实验的应用代码中,在完成文件系统等一系列初始化后,便调用函数fonts_init()初始化字库管理库,若初始化失败则说明NOR Flash中没有对应的字库数据,因此需要进行更新字库,更新字库时,会从SD卡中读入字库数据并将其写入NORFlash中,因此需要在SD中提前准备好字库文件。
当NOR Flash有了字库数据后,便在LCD上使用中文显示本实验的实验信息,并不断的显示中文字符,同时检测按键输入,若检测到WKUP按键被按下,则强制进行字库更新。

48.3 下载验证
在完成编译和烧录操作后,将根目录存放了A盘à5,SD卡根目录文件中文件的SD卡插入开发板板载的SD卡卡座后,若NOR Flash中没有字库数据,则能够看到LCD显示了正在更新字库的提示,更新完成后,便可以在LCD上看到中文显示的实验信息和不断刷新显示的中文字符,此时可以按下WKUP按键强制更新字库。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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