当前位置:   article > 正文

【正点原子STM32连载】 第五十一章 T9拼音输入法实验 摘自【正点原子】APM32E103最小系统板使用指南

【正点原子STM32连载】 第五十一章 T9拼音输入法实验 摘自【正点原子】APM32E103最小系统板使用指南

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

第五十一章 T9拼音输入法实验

本章将介绍正点原子提供的T9拼音输入法库的使用,用其实现一个简单的T9拼音输入法应用。通过本章的学习,读者将学习到正点原子T9拼音输入法库的使用。
本章分为如下几个小节:
51.1 硬件设计
51.2 程序设计
51.3 下载验证

51.1 硬件设计
51.1.1 例程功能

  1. 程序运行后,在LCD上显示T9拼音输入法的键盘及相关信息
  2. 触摸键盘上的按键,可进行拼音输入
  3. 按下KEY0按键或KEY_UP按键,可分别进行匹配结果翻页或清除输入的操作
  4. 可使用USMART对输入法进行调试
  5. LED0闪烁,指示程序正在运行
    51.1.2 硬件资源
  6. LED
    LED0 - PB5
  7. 按键
    KEY0 - PE4
    KEY_UP - PA0
  8. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  9. TFTLCD模块上的触摸屏(电阻式、电容式)
  10. SD卡(SDIO驱动)
  11. NOR Flash(SPI驱动)
    51.1.3 原理图
    本章实验使用的T9拼音输入法库为软件库,因此没有对应的连接原理图。
    51.2 程序设计
    51.2.1 T9拼音输入法库的使用
    正点原子提供的T9拼音输入法库包含三个文件,分别为:pyinput.c、pyinput.h和pymb .h,本章实验配套的实验例程中已经提供了这三个文件,并且针对正点原子APM32E103最小系统板进行了移植适配,在使用时,仅需将这三个文件添加到自己的工程即可,如下图所示:
    在这里插入图片描述

图51.2.1.1 正点原子T9拼音输入法库文件
T9拼音输入法库提供了匹配码表的函数,使用非常方便。
匹配码表函数的使用示例,如下所示:

#include " apm32e10x.h"
#include "./T9INPUT/pyinput.h"

void example_fun(void)
{
    uint8_t inputstr[5];
    uint8_t res;
    uint8_t index;
    
    /* 拼音输入 */
    // inputstr[0] = 9; // wxyz
    // inputstr[1] = 4; // ghi
    // inputstr[2] = 3; // def
    // inputstr[3] = 6; // mno
    // inputstr[4] = 4; // ghi
    
    /* 匹配码表 */
    res = t9.getpymb(inputstr);
    /* 有匹配结果 */
    if (res != 0)
    {
    		/* 展示所有匹配结果 */
    		for (index=0; index<(res&0x7F); index++)
    		{
    			// printf("拼音: %s\r\n", t9.pymb[index]->py);
    			// printf("结果: %s\r\n", t9.pymb[index]->pymb);
    		}
    }
    /* 无匹配结果 */
    else
    {
    		/* Do something */
    }
}
  • 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

51.2.2 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{
    uint8_t inputstr[7];
    uint8_t inputlen;
    uint8_t result_num;
    uint8_t cur_index;
    uint8_t t = 0;
    uint8_t key;
    uint8_t pykey;
    
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);  /* 设置中断优先级分组为组4 */
    sys_apm32_clock_init(15);                         /* 配置系统时钟 */
    delay_init(120);                                  /* 初始化延时功能 */
    usart_init(115200);                               /* 初始化串口 */
    led_init();                                       /* 初始化LED */
    key_init();                                       /* 初始化按键 */
    lcd_init();                                       /* 初始化LCD */
    tp_dev.init();                                    /* 初始化触摸屏 */
    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)                         /* 检查字库 */
    {
        lcd_show_string(30, 50, 200, 16, 16, "Font error!", RED);
        delay_ms(200);
        lcd_fill(30, 50, 240, 66, WHITE);
        delay_ms(200);
    }
    
RESTART:
    text_show_string(30, 5, 200, 16, "正点原子APM32开发板", 16, 0, RED);
    text_show_string(30, 25, 200, 16, "拼音输入法实验", 16, 0, RED);
    text_show_string(30, 45, 200, 16, "ATOM@ALIENTEK", 16, 0, RED);
    text_show_string(30, 65, 200, 16, "KEY0:翻页", 16, 0, RED);
    text_show_string(30, 85, 200, 16, "KEY_UP:清除", 16, 0, RED);
    text_show_string(30, 105, 200, 16, "输入:        匹配:  ", 16, 0, RED);
    text_show_string(30, 125, 200, 16, "拼音:        当前:  ", 16, 0, RED);
    text_show_string(30, 145, 210, 32, "结果:", 16, 0, RED);
    /* 根据LCD分辨率设置按键大小 */
    if (lcddev.id == 0x5310)
    {
        kbdxsize = 86;
        kbdysize = 43;
    }
    else if (lcddev.id == 0x5510)
    {
        kbdxsize = 140;
        kbdysize = 70;
    }
    else
    {
        kbdxsize = 60;
        kbdysize = 40;
    }
    py_load_ui(30, 195);
    my_mem_set(inputstr, 0, 7);
    inputlen = 0;
    result_num = 0;
    cur_index = 0;

    while (1)
    {
        t++;
        pykey = py_get_keynum(30, 195);               /* 得到触摸屏的输入 */
        if (pykey != 0)                               /* 有按键按下 */
        {
            if (pykey == 1)                           /* 删除键 */
            {
                if (inputlen != 0)
                {
                    inputlen--;
                }
                inputstr[inputlen] = '\0';
            }
            else                                      /* 添加字符 */
            {
                inputstr[inputlen] = pykey + '0';
                if (inputlen < 7)
                {
                    inputlen++;
                }
            }
            
            if (inputstr[0] != '\0')                  /* 有字符,需要进行匹配 */
            {
                pykey = t9.getpymb(inputstr);         /* 获取匹配结果 */
                if (pykey != 0)                       /* 有匹配结果 */
                {
                    result_num = pykey & 0x7F;
                    cur_index = 1;
                    if ((pykey & 0x80) != 0)
                    {
                        inputlen = pykey & 0x7F;
                        inputstr[inputlen] = '\0';
                        if (inputlen > 1)
                        {
                            result_num = t9.getpymb(inputstr);
                        }
                    }
                }
                else                                  /* 无匹配结果 */
                {
                    inputlen--;
                    inputstr[inputlen] = '\0';
                }
            }
            else
            {
                cur_index = 0;
                result_num = 0;
            }
/* 清除之前的显示 */
            lcd_fill(30 + 40, 105, 30 + 40 + 48, 110 + 16, WHITE);
/* 显示匹配结果 */
            lcd_show_num(30 + 144, 105, result_num, 1, 16, BLUE);
/* 显示有效的字符串 */
            text_show_string(30 + 40, 105, 200, 16, 
(char *)inputstr, 16, 0, BLUE);
            py_show_result(cur_index);                /* 根据索引显示匹配结果 */
        }
        
        if (result_num != 0)                          /* 有匹配结果 */
        {
            key = key_scan(0);
            switch (key)
            {
                case KEY0_PRES:                       /* 匹配结果翻页 */
                {
                    if (cur_index < result_num)
                    {
                        cur_index++;
                    }
                    else
                    {
                        cur_index = 1;
                    }
                    py_show_result(cur_index);
                    break;
                }
                case WKUP_PRES:                       /* 清除输入 */
                {
                    lcd_fill(30 + 40, 145, lcddev.width - 1, 145 + 48, WHITE);
                    goto RESTART;
                }
            }
        }
        
        if (t == 20)
        {
            LED0_TOGGLE();
            t = 0;
        }
        delay_ms(10);
    }
}
  • 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
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157

从上面的代码中可以看出,本实验实验的应用中,通过触摸屏获取拼音的键值,然后调用函数t9. getpymb()进行码表匹配,有匹配结果时,则在LCD上显示匹配结果,若有多个匹配结果,则可通过KEY0按键进行翻页,通过也可通过KEY_UP按键清除输入。
51.3 下载验证
在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关实验信息,通过也显示了T9拼音的输入键盘,此时便可通过键盘输入拼音,随即便可在LCD上看到输入拼音对应的汉字匹配结果,若有多个匹配结果,例如输入“64”,则会匹配到拼音“mi”和“ni”,此时按下KEY0按键,可对多个匹配结果进行翻页,若按下KEY_UP按键则会清除所有输入。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/172503
推荐阅读
相关标签
  

闽ICP备14008679号