关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > MiniGUI中开发实现键盘输入设备方案解析

MiniGUI中开发实现键盘输入设备方案解析

作者:时间:2012-05-14来源:网络收藏

嵌入式系统通常拥有特定的用于实现数据输入和人机交互,其种类繁多,并且不同的设备依赖不同的硬件实现。为了减弱系统的硬件相关性和提高可移植性,提供了统一的输入抽象层IAL(Input Abstract Layer)接口来支持不同的,减小了开发输入设备的难度。下面以开发4×4小输入为例,介绍在中开发和实现特定输入设备输入的方法。

本文引用地址:http://www.eepw.com.cn/article/202338.htm

1 输入的处理方式

MiniGUI对键盘输入的处理方式如图1所示。键盘设备驱动程序从键盘接收原始的输入事件和数据,并把它转换为MiniGUI抽象的键盘事件和数据。相关的底层事件处理例程把这些键盘事件转换为上层的击键消息,放到相应的消息队列中。应用程序通过消息循环获取这些消息,交由窗口过程处理。

开发特定的键盘输入,主要完成底层的两部分工作:键盘驱动程序设计和键盘输入引擎开发。前者负责从键盘接收原始输入事件和数据,后者负责把原始的输入事件和数据转抉成MiniGUI抽象的键盘事件和数据。至于抽象键盘事件和数据转换成上层的击键消息等工作,则是由MiniGUI提供的底层事件处理例程自己完成,无需用户设计,这正是MiniGUI提供输入抽象层接口(IAL)所带来的好处。下面具体介绍小键盘输入的开发过程与实现方法,主要介绍重要接口函数的实现。

2 键盘驱动程序设计

该设备驱动要实现的主要功能是进行小键盘行列扫描,接收原始键盘输入事件和数据,如有无键按下、按下某键或释放某键。返回的字符型按键信息(小键盘扫描码)由两部分组成:“高位”代表键盘输入事件,即按下(高位为O)或释放(高位为1);“低7 位”代表键盘输入数据,即按下或释放的按键值。

2.1 键盘按键值的获取

当按下某个键时,和该键所在行列相连的两路通用外设I/O引脚就会导通,其电平就会相同,因此驱动中只需要轮询各路I/O引脚就可以知道按键值。比如,使各行线输入低电平,各列线都通过上拉电阻接高电平,此时检测各列,如果某一列电平为低,则说明该列所在的键盘已经按下,使该列与行导通变为低电平,这样就可以确定按键所在列号(j);同理,将各列置低电平,再依次查询各行,就可以确定按键的行号(i)。若定义一个键值映射数组key_arrow[5] [5]表示所有键盘按键值:Key_arrow[5][5]={{0,O,O,O,0,0},{0,‘7’,‘8’,‘9’,‘A’},{0,‘4’, ‘5’,‘6’,‘B’},{0,‘1’,‘2’,‘3’,‘C’},{0,‘D’,‘O’,‘.’,‘E’}},则按键值就为key_arrow[i] [j]。初始化时行列号均为0,因此当小键盘无键按下时,返回按键值为0(即字符NULL)。

需要注意的是,要保证驱动正常工作,设置好行列线的输入输出模式后,需要一定时间延时以后才能开始进行行(列)查询。这是因为行列线进行输入输出模式切换时存在硬件延迟。

2.2 键盘扫描码的获取

为了判断键盘事件是按下还是释放,定义两个无符号型字符变量last和key。前者是静态变量,存放等待释放的键的按键值,即前一次扫描读到的按键值;后者存放当前键盘扫描码。当键盘事件为按下时,它的值和键盘按键值相同;当键盘事件为释放时,它的值等于last高位置l后的值。

2.3 功能实现流程

我们用驱动程序read接口函数实现这些功能。当应用程序凋用read函数后,该函数先进行行列扫描,得到键盘按键值key_arrow[i][j]后进行判断。著其非零,即有键按下,则直接将此按键值作为键盘的扫描码(key=key_arrow[i][j]),并将其赋给字符变量last,表示该键等待释放。如果key_arrow[i][j]为零,即无键按下,则判断是否有需要释放的键:若没有(即last为O),就直接将按键值(key=0)作为键盘扫描码;若有键需要释放(1ast非零),就把1ast高位置1作为键盘扫描码(key=last 10x80),表示释放刚按下的键,然后last清零,表示已没有按键等待释放。read函数最后发送键盘扫描码(key)到用户缓冲区后返回。

3 键盘输入引擎的设计

第2部分要开发的是小键盘输入引擎。它负责把键盘驱动提供的原始键盘输入事件和数据(即小键盘扫描码)转换为MiniGUI抽象的键盘事件和数据(由系统扫描码索引的键盘数组)。

3.1 MiniGUI的IAL接口

前面已提到,IAL定义了一组不依赖于任何特殊硬件的抽象接口,而用于实现这一抽象接口的底层代码就称为输入引擎。在代码实现上,MiniGUI通过 INPUT结构来表示“输入引擎”。它实际是一个拥有若干函数指针成员的结构体,MiniGUI在特定的时候调用这些函数来达到操作硬件的目的,因此,编写特定的输入引擎,主要就是编码实现INPUT结构中的各个函数。该结构定义在/minigui-free/libminigui-1.3. 3/src/ial/ial.h中,其中的主要成员函数如表l所列。为表述方便,定义当前工作目录为/mlnlgui-free/libminigui- 1.3.3,后文出现的所有文件目录及路径均在该目录下。

DIY机械键盘相关社区:机械键盘DIY



上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭