赞
踩
1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban
本章将介绍正点原子提供的T9拼音输入法库的使用,用其实现一个简单的T9拼音输入法应用。通过本章的学习,读者将学习到正点原子T9拼音输入法库的使用。
本章分为如下几个小节:
51.1 硬件设计
51.2 程序设计
51.3 下载验证
51.1 硬件设计
51.1.1 例程功能
图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按键则会清除所有输入。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。