PCB论坛网

 找回密码
 注册
查看: 1002|回复: 0

嵌入式系统中文输入法的设计

[复制链接]
发表于 2008-9-6 10:44:00 | 显示全部楼层 |阅读模式

Tag: 嵌入式系统 嵌入式开发 嵌入式开发工具 嵌入式系统开发

目前,以LCD和数字键盘实现的人机交互式界面在智能终端中广泛采用。在不同的应用场合,对人机界面的要求也不同,一些情况下只要求简单参数的显示和选择,而在一些信息终端中,还要求文字的输入。

在使用高性能CPU和标准显示设备的情况下,实现友好的人机界面可采用商用嵌入式系统LinuxWinCE)所支持的GUI程序。但很多情况下,智能终端使用MCU,且其显示设备是非标准接口的小型LCD。此时,必须找到占用较少资源的低成本实现方法。

笔者参加的智能终端项目就是一个比较典型的基于MCU的人机界面应用,使用128×64点阵式LCD模块,要求可显示Unicode编码的一、二级常用汉字库并可进行中文输入。此应用中输入法相关的代码和数据占用约20kB。在应用开发中,我们使用了实时操作系统μC/OS-II,相关内容可参考有关文献。

简单的中文拼音输入法

汉字输入法的实质是建立一种按键组合到汉字编码的映射关系,因此,使用数字键盘的嵌入式系统的输入法与使用标准键盘的PC机的输入法没有本质的不同,其区别主要在于嵌入式应用中处理器、存储器等资源比较有限。如对应汉字,拼音输入法下PC键盘按键组合为“ni”,而在一般数字键盘下,其按键组合则为“64”

在多数手持式设备(如智能电话)中,以0~9数字键与几个简单的控制键实现汉字输入,比较著名的是在手机中广泛采用的T9 iTap 输入法。这里我们介绍一种简单的拼音输入法的实现方法。

一般终端键盘包括12个按键,分别是0~9数字键和“*”“#”两个特殊键。按通用规则,数字1对应空格,其功能基本等同于PC机中的空格键,用于输入空格或作为当前汉字的确认键;2~9数字键分别对应下述汉语拼音字母:

2a b c   3d e f     4g h i

5j k l    6m n o   7p q r s 

8t u v   9w x y z

“0”“*”“#”键则作为输入法中的控制键。我们将“#”作为选择键,用于选取同一数字键组合下的不同拼音组合。(嵌入式系统 嵌入式开发工具 嵌入式 嵌入式软件开发)

输入法中使用了两个重要数据结构,分别是PY_NODEPY_SUBNODE。每个PY_NODE对应一个数字键组合,PY_SUBNODE则对应一组拼音组合。由于一个数字组合可对应多个拼音组合(“226”对应“ban”“bao”“can ”“cao”),因此这两个结构实现的是一个两级的对应表。

PY_NODE按树组织,而PY_SUBNODE按双向链表组织。二者的基本关系如图1所示。

以下是两个结构的定义:

typedef struct py_node{

unsigned int son[8];   //对应下次2~9按键输入时应转到的PY_NODEID

unsigned int father;     //父节点ID

struct py_subnode *ptrpy;   //指向下属第一个PY_SUBNODE的指针

}PY_NODE;

typedef rom struct py_subnode{

unsigned char py[7];                   //本节点的拼音字符串

struct py_subnode *prev;           //指向前一PY_SUBNODE的指针

struct py_subnode *next;            //指向下一PY_SUBNODE的指针

unsigned char *ptrUnicode;        //指向本节点对应Unicode码表的指针

}PY_SUBNODE;

设计中我们所参照的汉语拼音表中共有412种组合,这样系统中必须有412PY_SUBNODE与其一一对应;系统中共建立了250PY_NODE。建立此部分数据的工作比较繁琐,分以下5个步骤进行:

1、 汉字按拼音进行分组,按常用程度排序,并将汉字转化为Unicode码或国标码,码型视系统要求而定;

2、 将有效拼音转换为数字键盘值组合,如拼音“cui”转为数字值284”,这些值对应了部分PY_NODE

3、 增加中间PY_NODE,用于表示本身无效但后续输入有效的拼音,如“b”“c”“don”“dua”等节点;

4、 将数字键组合相同的PY_SUBNODE编成链表,由某一PY_NODE中的ptrpy指针指向表头;

5、 按数字键组合的关系,将PY_NODE组成树。

在改变当前PY_NODE时,一般应伴有一些显示操作,因应用不同各有差异,此处不做过多说明。

在当前节点下,可以用某一指定控制键(“#”)来选择此PY_NODE下属的PY_SUBNODE以缩小汉字的选取范围。

嵌入式系统 嵌入式开发工具 嵌入式 嵌入式软件开发

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|手机版|PCB设计论坛|EDA论坛|PCB论坛网 ( 沪ICP备05006956号-1 )

GMT+8, 2024-6-12 00:46 , Processed in 0.120297 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表