图 59.1.1 手机拼音输入键盘
在这个键盘上,我们对比下传统的输入法和 T9 输入法,输入“中国”两个字需要的按键
次数。传统的方法,先按 4 次 9,输入字母 z,再按 2 次 4,输入字母 h,再按 3 次 6,输入字
母 o,再按 2 次 6,输入字母 n,最后按 1 次 4,输入字母 g。这样,输入“中”字,要按键 12
次,接着同样的方法,输入“国”字,需要按 6 次,总共就是 18 次按键。
如果是 T9,我们输入“中”字,只需要输入:9、4、6、6、4,即可实现输入“中”字,
在选择中字之后,T9 会联想出一系列同中字组合的词,如:文、国、断、山等。这样输入“国”
字,我们直接选择即可,所以输入“国”字按键 0 次,这样 T9 总共只需要 5 次按键。
这就是 T9 智能输入法的优越之处。正因为 T9 输入法高效便捷的输入方式得到了众多手机
厂商的采用,以至于 T9 成为了使用频率最高知名度最大的手机输入法。
本章,我们实现的 T9 拼音输入法,没有真正的 T9 那么强大,我们这里仅实现输入部分,
不支持词组联想。
本章,我们主要通过一个和数字串对应的拼音索引表来实现 T9 拼音输入,我们先将汉语
拼音所有可能的组合全部列出来,如下所示:
这里我们只列出了部分组合,我们将这些组合称之为码表,然后将这些码表和其对应的数
字串对应起来,组成一个拼音索引表,如下所示:
其中 py_index 是一个结构体,定义如下:
typedef struct
{
u8 *py_input;
//输入的字符串
u8 *py;
//对应的拼音
u8 *pymb; //码表
}py_index;
其中 py_input,即与拼音对应的数字串,比如“94824”。py,即与 py_input 数字串对应的
拼音,如果 py_input=“94824”,那么 py 就是“zhuai”。最后 pymb,就是我们前面说到的码表。
注意,一个数字串可以对应多个拼音,也可以对应多个码表。
在有了这个拼音索引表(py_index3)之后,我们只需要将输入的数字串和 py_index3 索引
表里面所有成员的 py_input 对比,将所有完全匹配的情况记录下来,用户要输入的汉字就被确
定了,然后由用户选择可能的拼音组成(假设有多个匹配的项目),再选择对应的汉字,即完成
一次汉字输入。
当然还可能是找遍了索引表,也没有发现一个完全符合要求的成员,那么我们会统计匹配
数最多的情况,作为最佳结果,反馈给用户。比如,用户输入“323”,找不到完全匹配的情况,
那么我们就将能和“32”匹配的结果返回给用户。这样,用户还是可以得到输入结果,同时还
可以知道输入有问题,提示用户需要检查输入是否正确。
以上,就是我们的 T9 拼音输入法原理,关于拼音输入法,我们就介绍到这里。
最后,我们看看一个完整的 T9 拼音输入步骤(过程):
1) 输入拼音数字串
本章,我们用到的 T9 拼音输入法的核心思想就是对比用户输入的拼音数字串,所以必
须先由用户输入拼音数字串。
2) 在拼音索引表里面查找和输入字符串匹配的项,并记录
在得到用户输入的拼音数字串之后,在拼音索引表里面查找所有匹配的项目,如果有
完全匹配的项目,就全部记录下来,如果没有完全匹配的项目,则记录匹配情况最好的一
个项目。
3) 显示匹配清单里面所有可能的汉字,供用户选择.
将匹配项目的拼音和对应的汉字显示出来,供用户选择。如果有多个匹配项(一个数
字串对应多个拼音的情况),则用户还可以选择拼音。
4) 用户选择匹配项,并选择对应的汉字.
用户对匹配的拼音和汉字进行选择,选中其真正想输入的拼音和汉字,实现一次拼音
输入。
以上 4 个步骤,就可以实现一个简单的 T9 汉字拼音输入法。
59.2 硬件设计
本章实验功能简介:开机的时候先检测字库,然后显示提示信息和绘制拼音输入表,之后
进入等待输入状态。此时用户可以通过屏幕上的拼音输入表输入拼音数字串(通过 DEL 可以实
现退格),然后程序自动检测与之对应的拼音和汉字,并显示在屏幕上(同时输出到串口)。
如果有多个匹配的拼音,则通过 KEY_UP 和 KEY1 进行选择。按键 KEY0 用于清除一次输入,
按键 KEY2 用于触摸屏校准。
本实验用到的资源如下:
1) 指示灯 DS0
2) 四个按键(KEY0/KEY1/KEY2/KEY_UP)
3) 串口
4) LCD 模块(含触摸屏)
5) SPI FLASH
这些用到的硬件,我们在之前都已经介绍过,这里就不再介绍了。
59.3 软件设计
打开本章实验工程可以看到,我们在根目录文件夹下新建了一个 T9INPUT 的文件夹。在
该文件夹下面新建了 pyinput.c、pyinput.h 和 pymb.h 三个文件,然后在工程里面新建一个
T9INPUT 的组,将 pyinput.c 加入到该组下面。最后,将 T9INPUT 文件夹加入头文件包含路径。
打开 pyinput.c,代码如下:
这里总共就 4 个函数,其中 get_matched_pymb,是核心,该函数实现将用户输入拼音数字
串同拼音索引表里面的各个项对比,找出匹配结果,并将完全匹配的项目存放在 matchlist里面,
同时记录匹配数。对于那些没有完全匹配的输入串,则查找与其最佳匹配的项目,并将匹配的
长度返回。函数 test_py(代码省略)用于给 usmart 调用,实现串口测试,该函数可有可无,只
是在串口测试的时候才用到,如果不使用的话,可以去掉,本章,我们将其加入 usmart 控制,
大家可以通过该函数实现串口调试拼音输入法。
其他两个函数,也比较简单了,我们这里就不细说了。打开 pyinput.h,代码如下:
pymb.h 里面完全就是我们前面介绍的拼音码表,该文件很大,里面存储了所有我们可以输
入的汉字,此部分代码就不贴出来了,请大家参考光盘本例程的源码。
最后,我们看看主函数代码:
此部分代码除 main 函数外还有 4 个函数。首先,py_load_ui,该函数用于加载输入键盘,
在 LCD 上面显示我们输入拼音数字串的虚拟键盘。py_key_staset,该函数用与设置虚拟键盘某
个按键的状态(按下/松开)。py_get_keynum,该函数用于得到触摸屏当前按下的按键键值,通
过该函数实现拼音数字串的获取。最后,py_show_result,该函数用于显示输入串的匹配结果,
并将结果打印到串口。
在 main 函数里面,实现了我们在 59.2 节所说的功能,这里我们并没有实现汉字选择功能,
但是有本例程作为基础,再实现汉字选择功能就比较简单了,大家自行实现即可。注意:kbdxsize
和 kbdysize 代表虚拟键盘按键宽度和高度,程序根据 LCD 分辨率不同而自动设置这两个参数,
以达到较好的输入效果。
最后,我们将 test_py 函数加入 USMART 控制,以便大家串口调试。
至此,本实验的软件设计部分结束。
59.4 下载验证
在代码编译成功之后,我们下载代码到 ALIENTEK 阿波罗 STM32 开发板上,得到,如图
59.4.1 所示:
图 59.4.2 实现拼音输入
如果发现输入错了,可以通过屏幕上的 DEL 按钮,来退格。如果有多个匹配的情况(匹配
值大于 1),则可以通过 KEY_UP 和 KEY1 来选择拼音。通过按下 KEY0,可以清除当前输入,
通过按下 KEY2,可以实现触摸屏校准(仅限电阻屏,电容屏无需校准)。
我们还可以通过 USMART 调用 test_py 来实现输入法调试,如图 59.4.3 所示:

图 59.4.3 USMART 调试 T9 拼音输入法
相关资源:阿P软件之划词复制v1.20绿色版-其它代码类资源-CSDN文库