当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]基于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的中断引脚相连。本文重点对矩阵键盘做详细介绍,电源按键和背光控制按键的处理机制与矩阵键盘类似,这里不再做介绍。

[!--empirenews.page--]
  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上没有中文输入法,不能输入中文。[!--empirenews.page--]

  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上实现。为手持终端提供了一种嵌入式键盘的解决方案。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭