当前位置:   article > 正文

【正点原子STM32连载】 第四十八章 汉字显示实验 摘自【正点原子】APM32E103最小系统板使用指南

【正点原子STM32连载】 第四十八章 汉字显示实验 摘自【正点原子】APM32E103最小系统板使用指南

1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第四十八章 汉字显示实验

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

48.1 硬件设计
48.1.1 例程功能

  1. 程序运行后,会检测NOR Flash中是否存在字库,若不存在则会从SD卡中更新字库到NOR Flash
  2. NOR Flash中的字库准备好后,就开始在LCD上显示汉字
  3. 按下KEY0按键可强制更新字库
  4. 可通过USMART操作LCD显示中文
  5. LED0闪烁,指示程序正在运行
    48.1.2 硬件资源
  6. LED
    LED0 - PB5
  7. 按键
    KEY0 - PE4
  8. USART1(PA9、PA10连接至板载USB转串口芯片上)
  9. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  10. SD卡(SDIO驱动)
  11. NOR Flash(SPI驱动)
    48.1.3 原理图
    本章实验使用的字库管理库为软件库,因此没有对应的连接原理图。
    48.2 程序设计
    48.2.1 字库管理库的使用
    正点原子提供的字库管理库包含了四个文件,分别为:fonts.c、fonts.h、text.c和text.h,本章实验配套实验例程中已经提供了这四个文件,并且已经针对正点原子APM32E103最小系统板软硬件进行了移植适配,用户在使用时,仅需将这四个文件添加到自己的工程中即可,如下图所示:
    在这里插入图片描述

图48.2.1.1 正点原子字库管理库文件
字库管理库中fonts.c和fonts.h两个文件提供了字库更新和初始化的函数,test.c和test.h文件中提供了在LCD上显示中文字符的函数。
字库管理库在显示中文字符至LCD上时会使用NOR Flash中的中文字库,因此需要确保NOR Flash中的中文字库无误,若NOR Flash中没有中文字库的数据,那么在进行字库初始化时就会提示失败,这时就需要使用字库管理库中提供的字库更新函数更新NOR Flash中的中文字库数据,更新字库是读取SD卡中的字库文件将其写入NOR Flash,因此需确保SD卡中有对应的中文字库文件。
本章实验所需的中文字库文件可在A盘5,SD卡根目录文件SYSTEMFONT中找到,建议将A盘5,SD卡根目录文件中的所有文件按照该目录的目录结构复制到SD卡中,方便后续实验的使用。
48.2.2 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{
    uint8_t t;
    uint8_t key;
    uint8_t res;
    uint32_t fontcnt;
    uint8_t i;
    uint8_t j;
    uint8_t fontx[2];
    
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);  /* 设置中断优先级分组为组4 */
    sys_apm32_clock_init(15);                         /* 配置系统时钟 */
    delay_init(120);                                  /* 初始化延时功能 */
    usart_init(115200);                               /* 初始化串口 */
    usmart_dev.init(120);                             /* 初始化USMART */
    led_init();                                       /* 初始化LED */
    key_init();                                       /* 初始化按键 */
    lcd_init();                                       /* 初始化LCD */
    my_mem_init(SRAMIN);                              /* 初始化内部SRAM内存池 */
    exfuns_init();                                    /* 为exfuns申请内存 */
    f_mount(fs[0], "0:", 1);                          /* 挂载SD卡 */
    f_mount(fs[1], "1:", 1);                          /* 挂载NOR Flash */
    
    while (fonts_init() != 0)                         /* 检查字库 */
    {
UPD:
        lcd_clear(WHITE);
        lcd_show_string(30, 30, 200, 16, 16, "APM32", RED);
        
        while (sd_init() != SD_OK)                    /* 初始化SD卡 */
        {
            lcd_show_string(30, 50, 200, 16, 16, "SD Card Failed!", RED);
            delay_ms(200);
            lcd_fill(30, 50, 200 + 30, 50 + 16, WHITE);
            delay_ms(200);
        }
        
        lcd_show_string(30, 50, 200, 16, 16, "SD Card OK", RED);
        lcd_show_string(30, 70, 200, 16, 16, "Font Updating...", RED);
 /* 更新字库 */
        res = fonts_update_font(20, 90, 16, (uint8_t *)"0:", RED); 
        while (res != 0)                              /* 更新失败 */
        {
            lcd_show_string(30, 90, 200, 16, 16, "Font Update Failed!", RED);
            delay_ms(200);
            lcd_fill(20, 90, 200 + 20, 90 + 16, WHITE);
            delay_ms(200);
        }
        
        lcd_show_string(30, 90, 200, 16, 16, "Font Update Success!   ", RED);
        delay_ms(1500);
        lcd_clear(WHITE);
    }
    
    text_show_string(30, 30, 200, 16, "正点原子APM32开发板", 16, 0, RED);
    text_show_string(30, 50, 200, 16, "GBK字库测试程序", 16, 0, RED);
    text_show_string(30, 70, 200, 16, "ATOM@ALIENTEK", 16, 0, RED);
    text_show_string(30, 90, 200, 16, "KEY0: 更新字库", 16, 0, RED);
    
    text_show_string(30, 110, 200, 16, "内码高字节:", 16, 0, BLUE);
    text_show_string(30, 130, 200, 16, "内码低字节:", 16, 0, BLUE);
    text_show_string(30, 150, 200, 16, "汉字计数器:", 16, 0, BLUE);
    
    text_show_string(30, 180, 200, 24, "对应汉字为:", 24, 0, BLUE);
    text_show_string(30, 204, 200, 16, "对应汉字(16*16)为:", 16, 0, BLUE);
    text_show_string(30, 220, 200, 12, "对应汉字(12*12)为:", 12, 0, BLUE);
    
    while (1)
    {
        fontcnt = 0; 
/* GBK内码高字节范围为0x81~0xFE */
        for (i=0x81; i<0xFF; i++)
        {
            fontx[0] = i; 
            lcd_show_num(118, 110, i, 3, 16, BLUE);    /* 显示内码高字节 */
            
            for (j=0x40; j<0xFE; j++)                                           /* GBK内码低字节范围为0x40~0x7E、0x80~0xFE) */
            {
                if (j == 0x7F)
                {
                    continue;
                }
                
                fontcnt++;
                lcd_show_num(118, 130, j, 3, 16, BLUE);/* 显示内码低字节 */
/* 汉字计数显示 */
                lcd_show_num(118, 150, fontcnt, 5, 16, BLUE); 
                fontx[1] = j;
                text_show_font(30 + 132, 180, fontx, 24, 0, BLUE);
                text_show_font(30 + 144, 204, fontx, 16, 0, BLUE);
                text_show_font(30 + 108, 220, fontx, 12, 0, BLUE);
                
                t = 200;
                while ((t--) != 0)                    /* 延时,同时扫描按键 */
                {
                    delay_ms(1);
                    
                    key = key_scan(0);
                    if (key == KEY0_PRES)
                    {
/* 跳转到UPD位置(强制更新字库) */
                        goto UPD;
                    }
                }
                
                LED0_TOGGLE();
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110

从上面的代码中可以看出,本实验的应用代码中,在完成文件系统等一系列初始化后,便调用函数fonts_init()初始化字库管理库,若初始化失败则说明NOR Flash中没有对应的字库数据,因此需要进行更新字库,更新字库时,会从SD卡中读入字库数据并将其写入NOR Flash中,因此需要在SD中提前准备好字库文件。
当NOR Flash有了字库数据后,便在LCD上使用中文显示本实验的实验信息,并不断的显示中文字符,同时检测按键输入,若检测到KEY0按键被按下,则强制进行字库更新。
48.3 下载验证
在完成编译和烧录操作后,将根目录存放了A盘5,SD卡根目录文件中文件的SD卡插入开发板板载的SD卡卡座后,若NOR Flash中没有字库数据,则能够看到LCD显示了正在更新字库的提示,更新完成后,便可以在LCD上看到中文显示的实验信息和不断刷新显示的中文字符,此时可以按下KEY0按键强制更新字库。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号