资料介绍
摘 要:在基于嵌入式系统的智能终端中,中文人机交互界面是必须的功能,某些系统还要求中文文本输入。本文介绍了一种占用较少资源并适于在MCU上实现的中文输入法。
引言
目前,以LCD和数字键盘实现的人机交互式界面在智能终端中广泛采用。在不同的应用场合,对人机界面的要求也不同,一些情况下只要求简单参数的显示和选择,而在一些信息终端中,还要求文字的输入。
在使用高性能CPU和标准显示设备的情况下,实现友好的人机界面可采用商用嵌入式系统( 如Linux或WinCE)所支持的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数字键分别对应下述汉语拼音字母:
2:a b c 3:d e f 4:g h i
5:j k l 6:m n o 7:p q r s
8:t u v 9:w x y z
而“0”、“*”、“#”键则作为输入法中的控制键。我们将“#”作为“选择键”,用于选取同一数字键组合下的不同拼音组合。
输入法中使用了两个重要数据结构,分别是PY_NODE和PY_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_NODE的ID号
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种组合,这样系统中必须有412个PY_SUBNODE与其一一对应;系统中共建立了250个PY_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组成树。
图1中所示组织关系并不复杂,但其工作量不小,一般情况下可编写转换程序自动建立。图2为拼音输入法数据结构的一个片断。
在改变当前PY_NODE时,一般应伴有一些显示操作,因应用不同各有差异,此处不做过多说明。
在当前节点下,可以用某一指定控制键(如“#”键)来选择此PY_NODE下属的PY_SUBNODE以缩小汉字的选取范围。
增加功能
上述拼音输入法比较简单,且完成了输入法需要的基本功能。对于某些应用场合,对输入法还有更多的要求,可在上述方法的基础上进行改进实现。一些常见的要求和改进方法列举如下:
① 增加常用字功能
在上述输入法中,增加常用汉字。只考虑国标码中的约7000常用汉字情况下,输入法所占用的存储空间增加14kB。
② 增加联想功能
为使输入更为友好,很多输入法设有联想功能,即在输入一个汉字后,此汉字常用的后续汉字自动成为候选项由用户选择。
③ 笔划输入法
笔划输入法较之拼音输入法的优势在于重码少,输入不常用汉字时也不必多次翻页查找。
以五笔划输入法为例,通过五个按键即可输入汉字。该输入法将汉字笔划分为5种笔划,即:“一”、“丨”、“丿”、“丶”和“-”五种笔划,分别对应数字键“7”、“8”、“9”、“*”、“0”,如“你”字的组合为“丿”、“丨”、“丿”、“-”、“丨”、“丿”、“丶”。
笔划输入法与拼音输入法的区别在于人的感觉而非机器的操作,本质上只是按键组合与汉字码表对应关系有所不同,如“你”在拼音输入法下对应“64”,而在笔划输入法下则对应“989089*”。
④ 关于特殊符号、英文和数字
对于一些常用的特殊符号、英文和数字的输入,较常用的做法是将以单独的输入法实现。
软、硬件设计
输入法的性能优劣,更多的不是体现在算法,而是是否符合实际需求。因此它的优化工作是对前述PY_NODE和PY_SUBNODE组织的优化,如汉字次序的安排、联想功能中后序字的组织、以及操作界面的设计是否适合人们的使用习惯。因算法本身很简单,所以用C语言可实现较高的代码效率,以及较好的可移植性。
对于很多8位MCU,地址空间不大于64kB。这样小的空间对于汉字界面中的汉字库和输入法中的大量数据结构是远远不够的(如一、二级常用字的16×16点阵汉字库至少需要约220kB),因此常使用地址分页方式实现地址扩展。在MCU外部设一锁存器作为“页”寄存器,每页大小根据MCU特性和实际需求确定,如MCS51系列最大可为64kB一页。由于页寄存器的操作为独占型的,因此在中断内不能进行操作;而在基于RTOS的多任务环境下,应避免多个任务同时使用页寄存器。
结语
由于8位、16位MCU的应用场合多是低成本的设备,当商用输入法的成本无法接受或无法得到时,自行编写输入法应是可行的。当然,本文所讨论的只是实现输入法的基本方法,虽然方法可行,但所编写的输入法代码应经过较长时间的测试才可以作为产品的正式软件发布。
引言
目前,以LCD和数字键盘实现的人机交互式界面在智能终端中广泛采用。在不同的应用场合,对人机界面的要求也不同,一些情况下只要求简单参数的显示和选择,而在一些信息终端中,还要求文字的输入。
在使用高性能CPU和标准显示设备的情况下,实现友好的人机界面可采用商用嵌入式系统( 如Linux或WinCE)所支持的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数字键分别对应下述汉语拼音字母:
2:a b c 3:d e f 4:g h i
5:j k l 6:m n o 7:p q r s
8:t u v 9:w x y z
而“0”、“*”、“#”键则作为输入法中的控制键。我们将“#”作为“选择键”,用于选取同一数字键组合下的不同拼音组合。
输入法中使用了两个重要数据结构,分别是PY_NODE和PY_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_NODE的ID号
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种组合,这样系统中必须有412个PY_SUBNODE与其一一对应;系统中共建立了250个PY_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组成树。
图1中所示组织关系并不复杂,但其工作量不小,一般情况下可编写转换程序自动建立。图2为拼音输入法数据结构的一个片断。
在改变当前PY_NODE时,一般应伴有一些显示操作,因应用不同各有差异,此处不做过多说明。
在当前节点下,可以用某一指定控制键(如“#”键)来选择此PY_NODE下属的PY_SUBNODE以缩小汉字的选取范围。
增加功能
上述拼音输入法比较简单,且完成了输入法需要的基本功能。对于某些应用场合,对输入法还有更多的要求,可在上述方法的基础上进行改进实现。一些常见的要求和改进方法列举如下:
① 增加常用字功能
在上述输入法中,增加常用汉字。只考虑国标码中的约7000常用汉字情况下,输入法所占用的存储空间增加14kB。
② 增加联想功能
为使输入更为友好,很多输入法设有联想功能,即在输入一个汉字后,此汉字常用的后续汉字自动成为候选项由用户选择。
③ 笔划输入法
笔划输入法较之拼音输入法的优势在于重码少,输入不常用汉字时也不必多次翻页查找。
以五笔划输入法为例,通过五个按键即可输入汉字。该输入法将汉字笔划分为5种笔划,即:“一”、“丨”、“丿”、“丶”和“-”五种笔划,分别对应数字键“7”、“8”、“9”、“*”、“0”,如“你”字的组合为“丿”、“丨”、“丿”、“-”、“丨”、“丿”、“丶”。
笔划输入法与拼音输入法的区别在于人的感觉而非机器的操作,本质上只是按键组合与汉字码表对应关系有所不同,如“你”在拼音输入法下对应“64”,而在笔划输入法下则对应“989089*”。
④ 关于特殊符号、英文和数字
对于一些常用的特殊符号、英文和数字的输入,较常用的做法是将以单独的输入法实现。
软、硬件设计
输入法的性能优劣,更多的不是体现在算法,而是是否符合实际需求。因此它的优化工作是对前述PY_NODE和PY_SUBNODE组织的优化,如汉字次序的安排、联想功能中后序字的组织、以及操作界面的设计是否适合人们的使用习惯。因算法本身很简单,所以用C语言可实现较高的代码效率,以及较好的可移植性。
对于很多8位MCU,地址空间不大于64kB。这样小的空间对于汉字界面中的汉字库和输入法中的大量数据结构是远远不够的(如一、二级常用字的16×16点阵汉字库至少需要约220kB),因此常使用地址分页方式实现地址扩展。在MCU外部设一锁存器作为“页”寄存器,每页大小根据MCU特性和实际需求确定,如MCS51系列最大可为64kB一页。由于页寄存器的操作为独占型的,因此在中断内不能进行操作;而在基于RTOS的多任务环境下,应避免多个任务同时使用页寄存器。
结语
由于8位、16位MCU的应用场合多是低成本的设备,当商用输入法的成本无法接受或无法得到时,自行编写输入法应是可行的。当然,本文所讨论的只是实现输入法的基本方法,虽然方法可行,但所编写的输入法代码应经过较长时间的测试才可以作为产品的正式软件发布。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 嵌入式linux 中文输入法,基于嵌入式Linux的汉字输入法
- 嵌入式发动机活塞温度测试系统设计方案 22次下载
- 基于ARM的嵌入式Web服务器设计方案 20次下载
- T9输入法在嵌入式设备中的实现方案资料下载
- 188万中文词库包括了输入法和机器学习与训练 6次下载
- 如何在2KB内存的单片机上实现的T9中文输入法详细方法和程序说明
- 如何在2KB内存的单片机上实现的T9中文输入法
- 如何使用ARM进行嵌入式系统的设计与实现 14次下载
- 基于嵌入式LINUX和QT/E实现矩阵键盘中文输入 3次下载
- Pocket PC中汉字输入法分析与实现 0次下载
- 基于VxWorks的汉字输入法实现
- 采用FPGA的嵌入式系统设计方案
- 基于嵌入式Linux的汉字输入法
- 嵌入式中文输入法设计
- 51单片机拼音中文输入法c程序源代码
- 什么是嵌入式系统?嵌入式系统的具体应用 2096次阅读
- 安卓11之下的系统实现输入法切换 1447次阅读
- 分享一种嵌入式系统自动化测试的详细方案 2522次阅读
- B超系统中的汉字输入方案的设计与实现 1887次阅读
- 嵌入式系统的全面解析 3146次阅读
- 如何实现嵌入式系统远程调试 5077次阅读
- 基于嵌入式软件的JNI技术应用解析 1020次阅读
- 基于嵌入式环境的WiFi通信设计方案详解 5593次阅读
- 基于FPGA嵌入式系统的智能小车全面解析 9097次阅读
- 液晶显示屏设计方案:基于Nios嵌入式软核处理器 1081次阅读
- 嵌入式输入设备设计 1232次阅读
- 典型的嵌入式系统设计 2650次阅读
- 嵌入式输入设备设计应用 478次阅读
- 一种嵌入式Web服务器的设计方案 4151次阅读
- 基于ARM的嵌入式无线视频采集系统设计 1809次阅读
下载排行
本周
- 1GBT1094.11-2022电力变压器第11部分:干式变压器
- 14.12 MB | 3次下载 | 免费
- 2FT-7800R对讲机维修手册附原理图
- 3.35 MB | 2次下载 | 免费
- 3串口工具UartAssist5.0.exe
- 0.60 MB | 2次下载 | 免费
- 4爬电距离和电气间隙计算
- 0.75 MB | 2次下载 | 1 积分
- 5UC3584DW次级侧后置稳压器EVM板原理图
- 38.97KB | 2次下载 | 免费
- 6UCC38C42 25瓦自谐振复位正激变换器
- 320.6KB | 1次下载 | 免费
- 7ZX-D37 BLE主从一体蓝牙模块技术手册
- 1.22 MB | 1次下载 | 免费
- 8使用15个时钟周期的ADS7841和ADS7844
- 188.55KB | 1次下载 | 免费
本月
- 1无刷电机控制方案设计合作
- 1.05 MB | 22次下载 | 免费
- 2美的超薄电磁炉TM-S1-09B主板原理图
- 0.08 MB | 20次下载 | 免费
- 3纯电动汽⻋的主要部件及⼯作原理
- 5.76 MB | 12次下载 | 5 积分
- 4GP328和GP88S对讲机的维修实列资料合集免费下载
- 0.03 MB | 10次下载 | 10 积分
- 5舒尔SLX4无线话筒接收机原理图:二次变频超外差部分
- 0.27 MB | 8次下载 | 免费
- 6IP5385_DEMO开发资料
- 1.96 MB | 7次下载 | 2 积分
- 7i.MX Linux开发实战指南—基于野火i.MX系列开发板
- 17.86 MB | 7次下载 | 免费
- 8Type-C VL160数据手册
- 0.92 MB | 7次下载 | 3 积分
总榜
- 1matlab软件下载入口
- 未知 | 935115次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420061次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233084次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191363次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183329次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81581次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73805次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65985次下载 | 10 积分
评论
查看更多