摘要 MiniGUI一种轻量级的针对嵌入式操作平台的图形用户界面支持系统,广泛应用于基于ARM、MIPS等主流嵌入式开发平台的项目及产品中。本文详细介绍嵌入式系统中机交互常用输入设备(4×4数字小键盘)在MiniGUI中的实现方法,包括相关的底层按键扫描驱动程序,键盘输入引擎的编写,以及如何在MiniGUI中添加新输入引擎的方法等;最后针对调试过程中的典型问题提出一些调试建议。
关键词 MiniGUI输入抽象层 输入引擎数字键盘
嵌入式系统通常拥有特定的输入设备。输入设备用于实现数据输入和人机交互,其种类繁多,并且不同的设备依赖不同的硬件实现。为了减弱系统的硬件相关性和提高可移植性,MiniGUI提供了统一的输入抽象层IAL(Input Abstract Layer)接口来支持不同的输入设备,减小了开发输入设备的难度。下面以开发4×4小键盘输入为例,介绍在MiniGUI中开发和实现特定键盘输入设备输入的方法。
1 MiniGUI对键盘输入的处理方式
MiniGUI对键盘输入的处理方式如图1所示。键盘设备驱动程序从键盘接收原始的输入事件和数据控制工程网版权所有,并把它转换为MiniGUI抽象的键盘事件和数据。相关的底层事件处理例程把些键盘事件转换为上层的击键消息,放到相应的消息队列中。应用程序通过消息循环获取这些消息,交由窗口过程处理。
开发特定的键盘输入,主要完成底层的两部分工作:键盘驱动程序设计和键盘输入引擎开发。前者负责从键盘接收原始输入事件和数据,后者负责把原始的输入事件和数据转抉成MiniGUI抽象的键盘事件和数据。至于抽象键盘事件和数据转换成上层的击键消息等工作,则是由MiniGUI提供的底层事件处理例程自己完成,无需用户设计,这正是MiniGUI提供输入抽象层接口(IAL)所带来的好处。下面具体介绍小键盘输入的开发过程与实现方法,主要介绍重要接口函数的实现。
2 键盘驱动程序设计
该设备驱动要实现的主要功能是进行小键盘行列扫描,接收原始键盘输入事件和数据,如有无键按下、按下某键或释放某键。返回的字符型按键信息(小键盘扫描码)由两部分组成:"高位"代表键盘输入事件,即按下(高位为O)或释放(高位为1);"低7位"代表键盘输入数据,即按下或释放的按键值。
2.1 键盘按键值的获取
当按下某个键时,和该键所在行列相连的两路通用外设I/O引脚就会导通,其电平就会相同,因此驱动中只需要轮询各路I/O引脚就可以知道按键值。比如,使各行线输入低电平www.cechina.cn,各列线都通过上拉电阻接高电平,此时检测各列,如果某一列电平为低,则说明该列所在的键盘已经按下,使该列与行导通变为低电平,这样就可以确定按键所在列号(j);同理,将各列置低电平,再依次查询各行,就可以确定按键的行号(i)。若定义一个键值映射数组key_arrow[5][5]表示所有键盘按键值:Key_arrow[5][5]={{0CONTROL ENGINEERING China版权所有,O,O,O,0CONTROL ENGINEERING China版权所有,0},{0CONTROL ENGINEERING China版权所有,'7','8','9','A'},{0CONTROL ENGINEERING China版权所有,'4','5','6','B'},{0CONTROL ENGINEERING China版权所有,'1','2','3','C'},{0CONTROL ENGINEERING China版权所有,'D','O','.','E'}},则按键值就为key_arrow[i][j]。初始化时行列号均为0CONTROL ENGINEERING China版权所有,因此当小键盘无键按下时,返回按键值为0(即字符NULL)。
需要注意的是,要保证驱动正常工作控制工程网版权所有,设置好行列线的输入输出模式后,需要一定时间延时以后才能开始进行行(列)查询。这是因为行列线进行输入输出模式切换时存在硬件延迟。
2.2 键盘扫描码的获取
为了判断键盘事件是按下还是释放,定义两个无符号型字符变量last和key。前者是静态变量,存放等待释放的键的按键值,即前一次扫描读到的按键值;后者存放当前键盘扫描码。当键盘事件为按下时,它的值和键盘按键值相同;当键盘事件为释放时,它的值等于last高位置l后的值。
2.3 功能实现流程
我们用驱动程序read接口函数实现这些功能。当应用程序凋用read函数后,该函数先进行行列扫描,得到键盘按键值key_arrow[i][j]后进行判断。著其非零,即有键按下CONTROL ENGINEERING China版权所有,则直接将此按键值作为键盘的扫描码(key=key_arrow[i][j]),并将其赋给字符变量last,表示该键等待释放。如果key_arrow[i][j]为零,即无键按下,则判断是否有需要释放的键:若没有(即last为O),就直接将按键值(key=0)作为键盘扫描码;若有键需要释放(1ast非零),就把1ast高位置1作为键盘扫描码(key=last 10x80),表示释放刚按下的键,然后last清零,表示已没有按键等待释放。read函数最后发送键盘扫描码(key)到用户缓冲区后返回。
3 键盘输入引擎的设计