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 例程功能
- 程序运行后,在LCD上显示T9拼音输入法的键盘及相关信息
- 触摸键盘上的按键,可进行拼音输入
- 按下KEY0按键或KEY_UP按键,可分别进行匹配结果翻页或清除输入的操作
- 可使用USMART对输入法进行调试
- LED0闪烁,指示程序正在运行
51.1.2 硬件资源 - LED
LED0 - PB5 - 按键
KEY0 - PE4
KEY_UP - PA0 - 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
- TFTLCD模块上的触摸屏(电阻式、电容式)
- SD卡(SDIO驱动)
- 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 */}
}
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);}
}
从上面的代码中可以看出,本实验实验的应用中,通过触摸屏获取拼音的键值,然后调用函数t9. getpymb()进行码表匹配,有匹配结果时,则在LCD上显示匹配结果,若有多个匹配结果,则可通过KEY0按键进行翻页,通过也可通过KEY_UP按键清除输入。
51.3 下载验证
在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关实验信息,通过也显示了T9拼音的输入键盘,此时便可通过键盘输入拼音,随即便可在LCD上看到输入拼音对应的汉字匹配结果,若有多个匹配结果,例如输入“64”,则会匹配到拼音“mi”和“ni”,此时按下KEY0按键,可对多个匹配结果进行翻页,若按下KEY_UP按键则会清除所有输入。