基于Murphypinyin的嵌入式键盘设计

基于murphypinyin的嵌入式键盘设计
引 言
 随着嵌入式系统的飞速发展,在嵌入式手持设备中,人机交互设备是与用户接触最多的部分,最能够直接快速地体现出该设备的性能。所以,是否有一个友好的、快速的、可靠的人机交互设备已经成为衡量一款手持设备的重要指标。在嵌入式人机交互设备中,键盘由于其具有很高的准确性和可靠性,能够适应各种恶劣的工作环境,并且具有很长的使用寿命,而得到广泛应用。
本文根据手持终端的特点,设计出一款矩阵键盘,并在linux平台下开发出键盘的驱动程序。采用qt/embedded构建图形界面,通过对 qt/embedded自带输入法的分析,结合murphpinyin中文输入法软件包,构建了一款可输入数字、中/英文的嵌入式键盘。
1 硬件设计
本系统的硬件部分主要是一个4列5行的矩阵键盘,如图1所示。其中列线col0~col3使用了s3c2440的4个中断引脚——eint10、enit13、eint15、eint20,并且每根列线都有一个4.7 kω的上拉电路,把中断引脚电平拉高,确保按键空闲时不会触发中断;行线row0~row4使用的是s3c2440的5个普通i/o口——gpe11、gpe13、gpg3、gpg6、gpg11。这里需要注意的问题是,一定要确保列线所用的中断在linux的各个设备中尚未使用到,否则在后面的驱动程序中将会造成驱动程序初始化失败。
考虑到手持终端操作的方便性,将所有的按键进行重新布局,如图2所示。为了延长手持设备的使用寿命、提高可靠性,增加了电源按键power。另外,考虑到手持设备的低功耗要求,增加了背光控制按钮back-light,通过控制lcd_pwren引脚的高低电平,控制lcd背光的开关。其中电源按键power、背光控制按键backlight为单独按键,直接与s3c2440的中断引脚相连。本文重点对矩阵键盘做详细介绍,电源按键和背光控制按键的处理机制与矩阵键盘类似,这里不再做介绍。
2 软件设计
2.1 矩阵键盘的linux驱动程序设计
矩阵键盘是作为linux的一个字符设备注册到系统中的。为了降低对系统资源的损耗,采用中断处理函数对按键做处理;同时考虑到按键的抖动问题,采用定时器来消除抖动。
该驱动程序的流程如图3所示。首先,使用s3c2440_kb_init()函数将键盘作为一个字符设备进行注册,初始化行线引脚为:输出、非上拉,并将所有行输出置为低电平;注册该键盘设备。初始化列线所连接的中断引脚为:输入、下降沿触发中断,并建立中断与中断处理函数key_interrupt()的连接。
当有按键按下后,由于所有的行为低电平,必然有一行和一列线导通,从而将相应的列线拉低,触发中断。然后,中断处理函数 key_interrupt()记录相应的中断号码,由于按键存在抖动,单凭一次中断的触发就判定相应的按键按下很不可靠,所以在中断触发后开启定时器 kb_timer对按键状态再次进行判定。
上层应用程序使用s3c2440_kb_open ()打开键盘设备,开启列线中断,初始化定时器。当中断触发后,开启定时器,定时器定时时间到后,触发定时器中断kb_timer_handler()。 kb_timer_handler()首先会调用键盘扫描函数scan_keyboard()扫描按键状态,scan_keyboard()流程如图4所示。如果经过3次键盘扫描,每次都扫描到相同的按键值被按下,则证明确实有按键被按下,scan_keyboard()函数返回:keydown。如果按本次按键值与上一次按键值不同,则保存本次按键值到循环队列,这样可以不保存重复数据到缓冲队列。如果连续10次扫描到按键的状态都不为 key_down,则证明按键已经弹起,关闭定时器kb_timer。
s3c2440_kb_read()函数负责从循环队列中读取按键值反馈给上层应用程序。
2.2 qt/embedded的键盘映射
qt/embedded是trolltech公司针对采用嵌人式linux的电子设备开发的综合应用平台。qt/embedded包含完整的应用层、灵活的用户界面、窗口操作系统、应用程序以及开发框架。
qt/embedded本身提供了对按键的支持,它在文件qkeyboard_qws.cpp中提供了一个 qwskeyboardhandler类来处理按键事件。本系统创建了qwskeyboardhandler类的一个子类 qwskeymatrixhandler。在qwskeymatrixhandler类的构造函数中,通过open()函数打开矩阵键盘 key_matrix,通过对打开的键盘设备创建一个qscoketnotifer来监控按键设备,通过信号与槽机制,建立该 qscoketnotifer与读键盘函数readkeyboarddata()的连接,当key_matrix被激活时,就会触发读键盘函数 readkeyboarddata()。代码如下:
notifier=new qsocketnotifier(key_matrix,qsock-etnotifier::read,this);
connect(notifier,signal(activated(int)),this,slot(readkeyboarddata()));
在读键盘函数readkeyboarddata()中,调用矩阵键盘驱动程序的读函数read()来获取按键值。为了使得按键值能够传送给应用程序,要使用qwskeyboardhandler类的成员函数processkeyevent(int unicode,int keycode,int modifiers,bool ispress,bool autorepeat),各参数功能如下:
①unicode:按键的unicode编码,如数字1的unicode编码为1,字母a的unicode编码为a。如果该项为0,则为功能键shift、left、right等;如果该项为0xffff,则只传送键值keycode,不打印编码。
②keycode:qt中使用的按键名称,如qt::key_backspace、qt::key_enter等。
③modifiers:qt所支持的键盘组合键。
④ispress:判断按键的状态是“按下”还是“弹起”。
⑤autorepeat:判断本次事件是有自动重复机制产生,还是由一个现实中的按键产生。
通过processkeyevent()函数可以发送数字、小写英文、大写英文,但是目前qt/embedded上没有中文输入法,不能输入中文。
2.3 murphpinyin拼音输入法的移植
murphypinyin是目前为止基于qt/embedded的一个比较好的开源中文输入法,而且murphypinyin带有软键盘,用户可以通过触摸屏输入中文、英文、数字和符号等。对于murphypinyin到qt/embedded的移植,网络上有很多参考资料,这里不再作介绍。
但是将murphypinyin应用到手持终端上目前还有一个问题:murphypinyin带有的软键盘是标准的pc101键盘,按键数量很多。在对体积、重量要求很苛刻的手持终端上,触摸屏本身的尺寸受到严重的制约,pc101键盘会占据触摸屏的大部分显示面积;而且单个按键所占面积很小,从而对触摸屏的定位精度要求很高。然而触摸屏本身受周围环境的影响较大,很容易造成定位不准。本系统将矩阵键盘映射到murphypinyin上,通过矩阵键盘输入中文、英文和数字,这样在手持终端上可以使用普通的lcd,从而降低了系统成本、提高了系统的可靠性。
首先考虑的问题是:如何用键盘打开murphypinyin输入法?这里可以修改murphypinyin软件包中的pinyinframe.cpp文件中的:
boot qpinyinframe::filter(int unicode,int keycode,int modifiers,bool ispress,bool autorepeat)
其中:if(!ishidden()&& ispress)语句用来判断murphypinyin输入法是否已经打开并且有按键按下。如果是,则判断当前是中文模式、还是英文模式。中文模式则调用 getkey(unicode,keycode)函数,根据输入的拼音搜索汉字;英文模式则调用sendkey(unicode,keycode)函数发送大写或小写英文字母。如果unicode==9&&keycode==qt::key_tab,则进行中英文切换。在这里可以添加判断语句:if (keycode==qt::key numlock)。当numlock按键按下时,调用:qpinyinframe::sizehint()和qpinyinframe::show()两个函数来开启murphypinyin输入法界面。如果再次按下numlock按键,则调用qpinyinframe::hide()来隐藏输入法界面。
用键盘打开murphypinyin输入法之后,可以通过键盘发送拼音字母来输入汉字。通过发送unicode=9&&keycode==qt::key_tab来进行中英文切换。
2.4按键复用
由于手持终端设备对自身的体积有严格的要求,为了缩小键盘的体积,本系统模仿手机键盘的布局,采用按键复用的方式来缩小键盘大小。将26个英文字母按字母表顺序3个或4个一组依次排列在2~9这8个数字键上,并与阿拉伯数字进行复用(见图2)。
硬件上的简化必然导致软件复杂度的增加。为了使得系统能够在按下一个按键后自动识别是数字、英文大写字母、英文小写还是拼音字母,需要修改 qt/embedded中qkeyboard_qws.cpp的qwskeymatrixhandler::readkeyboarddata()函数。
当有按键按下后,首先需要判断当前是处于何种模式:数字、拼音、小写英文还是大写英文模式,实现流程如图5所示。通过numlock按键和状态标志字english-mode来进行数字状态和其他几个状态的切换。通过tab按键来进行中、英文模式的切换,通过capslock按键来进行英文大小写字母的切换。
为了使一个按键能够输入不同的字符,本系统使用不同的key_id值来标识各个字符,这样,每按一次键都是不同的。图6是对于按键2的复用过程。根据不同的key_id结合当前所处的输入模式,发送相应的数字、小写英文或大写英文字符。
3 总 结
本文介绍了基于s3c2440的矩阵键盘的硬件设计方法和软件的驱动开发方法,通过将murphpinyin开源软件包与qt/embeded自带输入法的融合,使用按键复用的策略,采用较少的按键,构建了一款可输入数字、中/英文的嵌入式键盘,并在s3c2440上实现。为手持终端提供了一种嵌入式键盘的解决方案。

2010年全球IT支出将增长4.6%,达到3.4万亿美元
朗迅集成电路封装技术虚拟仿真实训系统即将面世
基于高精度V/F转换器LM331芯片实现A/D转换电路的设计
LTspice电路图层次化设计
Gel-Pak 芯片包装盒光通讯行业应用: OSA流转工序以及自动 PnP拾取
基于Murphypinyin的嵌入式键盘设计
疫情对智能家居行业有什么影响
特斯拉大幅度降价 为何
基于区块链精神的资料经济协作模式
华为荣耀V9性能赶超mate9 请冠军代言 明星代言好?小米华为纷纷做?
2018年最具吸引力的11种创新医疗设备大盘点
52F-2000-360加速度传感器的安装方法
LP9912芯茂微CCM 模式的功率因数校正控制器
新西兰职场将迎来4种人工智能趋势
联发科最新推出旗舰智能电视芯片
智能魔镜显示屏的应用,感受满满的黑科技生活
创新提升5G 700MHz网络能力,5G NR广播技术赋能广电低频网络
未来电梯行业法人发展趋势分析
电缆故障测试仪的使用注意事项
测量和控制数据记录仪CR300的特点优势和应用范围