嵌入式系统中文输入法的设计
上一篇 / 下一篇 2007-08-31 15:09:29 / 个人分类:嵌入式开发
目前,以LCD和数字键盘实现的人机交互式界面在智能终端中广泛采用。在不同的应用场合,对人机界面的要求也不同,一些情况下只要求简单参数的显示和选择,而在一些信息终端中,还要求文字的输入。木铎校园 BBS 社区(T!i$^UW
$b`2z,pf{ Cs0在使用高性能CPU和标准显示设备的情况下,实现友好的人机界面可采用商用嵌入式系统( 如Linux或WinCE)所支持的GUI程序。但很多情况下,智能终端使用MCU,且其显示设备是非标准接口的小型LCD。此时,必须找到占用较少资源的低成本实现方法。木铎校园 BBS 社区zG`0B*@m
木铎校园 BBS 社区*w4C!g6r Wf\$P(]笔者参加的智能终端项目就是一个比较典型的基于MCU的人机界面应用,使用128×64点阵式LCD模块,要求可显示Unicode编码的一、二级常用汉字库并可进行中文输入。此应用中输入法相关的代码和数据占用约20kB。在应用开发中,我们使用了实时操作系统μC/OS-II,相关内容可参考有关文献。木铎校园 BBS 社区T{&_&K_Ka.n+_Oz
木铎校园 BBS 社区YbZ+AI简单的中文拼音输入法木铎校园 BBS 社区8a$ij0ui ci.N8TF.Aa
木铎校园 BBS 社区xU_6E^!o汉字输入法的实质是建立一种按键组合到汉字编码的映射关系,因此,使用数字键盘的嵌入式系统的输入法与使用标准键盘的PC机的输入法没有本质的不同,其区别主要在于嵌入式应用中处理器、存储器等资源比较有限。如对应汉字“你”,拼音输入法下PC键盘按键组合为“ni”,而在一般数字键盘下,其按键组合则为 “64”。
(mg,@ fr ?0!x b3A9uRX-AB0在多数手持式设备(如智能电话)中,以0~9数字键与几个简单的控制键实现汉字输入,比较著名的是在手机中广泛采用的T9 和iTap 输入法。这里我们介绍一种简单的拼音输入法的实现方法。
5I o/VTu0Li(m5j_0K0xg,|w?,q0一般终端键盘包括12个按键,分别是0~9数字键和“*”、“#”两个特殊键。按通用规则,数字1对应空格,其功能基本等同于PC机中的空格键,用于输入空格或作为当前汉字的确认键;2~9数字键分别对应下述汉语拼音字母:
[,B)b:u;Ok"J0$?O5{~ c6A)~ IN02:a b c 3:d e f 4:g h i
0`%]hI/l3v0P)d L#H)i0eu05:j k l 6:m n o 7:p q r s 木铎校园 BBS 社区%LTR)uRx
木铎校园 BBS 社区b{!F"i C8:t u v 9:w x y z木铎校园 BBS 社区'w Q s:O7hs hD2x2n(o
木铎校园 BBS 社区0l{'Gn1Xra而“0”、“*”、“#”键则作为输入法中的控制键。我们将“#”作为“选择键”,用于选取同一数字键组合下的不同拼音组合。木铎校园 BBS 社区#b Wp bD[,q w8x{+k'e
M0r-a/te+}L E"G0输入法中使用了两个重要数据结构,分别是PY_NODE和PY_SUBNODE。每个PY_NODE对应一个数字键组合,PY_SUBNODE则对应一组拼音组合。由于一个数字组合可对应多个拼音组合(如“226”对应“ban”、“bao”、“can ”、“cao”),因此这两个结构实现的是一个两级的对应表。
!LV [/Sc1M#n6KM0木铎校园 BBS 社区Z4l2_BN:m3fpG7]PY_NODE按树组织,而PY_SUBNODE按双向链表组织。二者的基本关系如图1所示。木铎校园 BBS 社区__/R[nB
木铎校园 BBS 社区r v `\b NST以下是两个结构的定义:
\#q2])b3O?7pn4@0木铎校园 BBS 社区ui7IgXt_typedef struct py_node{木铎校园 BBS 社区#Og C__sI|
BA;~^Z+`#`0unsigned int son[8]; //对应下次2~9按键输入时应转到的PY_NODE的ID号木铎校园 BBS 社区:nXrmy0f
木铎校园 BBS 社区"xwIIDC6gunsigned int father; //父节点ID号
"Qx3hX~"t#]F{0vb| |3O#i0struct py_subnode *ptrpy; //指向下属第一个PY_SUBNODE的指针
1a%T?3w-an5{0木铎校园 BBS 社区N'l{ I1N`n}PY_NODE;
PBT R6B,W,^3p W?0`T#y&`z0typedef rom struct py_subnode{木铎校园 BBS 社区qG.R*l/e_w
木铎校园 BBS 社区l-zp!c\8Gunsigned char py[7]; //本节点的拼音字符串木铎校园 BBS 社区 o:ah Y,|!F1kfI
J}3m+\B8DMnW+ms5w0struct py_subnode *prev; //指向前一PY_SUBNODE的指针木铎校园 BBS 社区.P.qR2^V"~
5c3A;n ]7{U0struct py_subnode *next; //指向下一PY_SUBNODE的指针木铎校园 BBS 社区FI{(L#Qy
?"\1G t!Fk#H0unsigned char *ptrUnicode; //指向本节点对应Unicode码表的指针木铎校园 BBS 社区|ct(I$PT^#\
*A*J2tTUl#w v5qY0}PY_SUBNODE;
Cw)v0Sv0木铎校园 BBS 社区K b)GeYK!tL设计中我们所参照的汉语拼音表中共有412种组合,这样系统中必须有412个PY_SUBNODE与其一一对应;系统中共建立了250个PY_NODE。建立此部分数据的工作比较繁琐,分以下5个步骤进行:木铎校园 BBS 社区so#Cg~
木铎校园 BBS 社区 h~2kK RRS!~1、 汉字按拼音进行分组,按常用程度排序,并将汉字转化为Unicode码或国标码,码型视系统要求而定;木铎校园 BBS 社区(I'|o4F)_UW^2Jx/^
M5[p0lv7uC02、 将有效拼音转换为数字键盘值组合,如拼音“cui”转为数字值“284”,这些值对应了部分PY_NODE;木铎校园 BBS 社区)iVe&UN3e3V
木铎校园 BBS 社区)q/M5ft!|j:m3、 增加中间PY_NODE,用于表示本身无效但后续输入有效的拼音,如“b”、“c”、“don”、“dua”等节点;木铎校园 BBS 社区NIQg[a Ju
3v#sHth]4clk)^04、 将数字键组合相同的PY_SUBNODE编成链表,由某一PY_NODE中的ptrpy指针指向表头;
BO(O:P:GVm0木铎校园 BBS 社区2u9kM2qHyJ5、 按数字键组合的关系,将PY_NODE组成树。
p5[8O)D(m*^a%B;H0木铎校园 BBS 社区8XY Ct7yrz i~V图1中所示组织关系并不复杂,但其工作量不小,一般情况下可编写转换程序自动建立。图2为拼音输入法数据结构的一个片断。
;U A4r7oO0nF:y0:j!m ~ vI;N:h0在改变当前PY_NODE时,一般应伴有一些显示操作,因应用不同各有差异,此处不做过多说明。
4nM6l O4x:sWxe"fn0;@[K O,i0在当前节点下,可以用某一指定控制键(如“#”键)来选择此PY_NODE下属的PY_SUBNODE以缩小汉字的选取范围。
6[4Y"}U)L0M%G`^\]u0
0v7a3|*\#WUJ0^}l6V$P[o3F_#K0增加功能
