Windows CE.Net下的矩阵键盘开发设计

发布者:jingwen最新更新时间:2012-05-17 来源: 单片机与嵌入式系统应用 关键字:矩阵键盘  中断  流驱动 手机看文章 扫描二维码
随时随地手机看文章

引言

  随着现代科技日新月异的发展,作为新兴产业的嵌入式移动信息设备的应用越来越广。这些嵌入式设备中的PDA以其体积小、重量轻、便于携带、功能强大、功耗低等特点而备受青睐。键盘作为一种最为普通的输入工具在PDA上显得尤为重要。PDA因其体积小、功能专一等特点决定了它的键盘不大可能采用普通PC机上的标准键盘,因而大多数PDA采用键数相对较少的矩阵键盘。矩阵键盘设计也是多种多样,有外接键盘管理芯片设计的,如采用CH452、 UR5HCSPI等芯片;有外接普通单片机设计的,如采用8051、2051等单片机;也有不采用任何外围芯片直接与CPU的I/O口相连设计的。本文介绍一种在Windows CE.Net操作系统下,直接与CPU的I/O口相连的矩阵键盘的硬件设计方案,以及相应的流接口驱动程序设计方案。

1  Windows CE.Net介绍

  Windows CE是Microsoft公司专门为信息设备、移动应用、消费类电子产品、嵌入式应用等非PC领域而全新设计的战略性嵌入式操作系统。Windows CE的设计目标是:模块化以及可伸缩性、实时性能好、通信能力强、支持多种CPU[1]。

  Windows CE.Net是Windows CE 3.0的后续产品,它不仅是一个功能强大的实时嵌入式操作系统,而且提供了众多强大工具,允许用户利用它快速开发出下一代的智能化小体积连接设备。借助于完善的操作系统功能和开发工具,Windows CE.Net提供了构建、调试和部署基于Windows CE.Net的定制设备所需的一切特性。

  Windows CE.Net的最大好处是具有可定制性。当它自带的驱动程序不能满足用户的要求时,需要用户自己编写相应的驱动程序。Windows CE.Net的开发工具Platform Builder就可以完成相应的驱动程序开发。

2  矩阵键盘硬件设计

  嵌入式设备上的键盘作为一种输入工具,有着极其重要的作用;然而受设备本身体积影响,键盘设计大多数采用20个左右的键值(0—9数字键、上下左右方向键、确定取消键以及输入法切换键ALT、TAB,具体视应用而定)。这里采用4×5的矩阵键盘设计,即4行5列。把这些矩阵键盘的行和列直接与 CPU的I/O口相连,可以充分利用CPU的I/O口资源,降低硬件和驱动设计难度,提高整个系统的稳定性,并在一定程度上降低设备的生产成本。采用矩阵式键盘设计还可以最大限度地节省CPU的I/O口资源。这里用到了CPU的9个I/O口,其中4个I/O口作为中断I/O口。为了使I/O口的初始输入状态为高电平,需要在与键盘相连的每个I/O口上接起初始化电平作用的上拉电阻(100 kΩ)。上拉电阻的阻值根据I/O口端口的电流值来确定。如果相邻I/O口的布线过近,相邻I/O口的电平跳变可能会相互影响,导致扫描按键不准确,这时就需要在每个I/O口上接一个滤波电容到地,减少串扰。支持Windows CE.Net操作系统的CPU有很多种,比较常见的有三星公司的S3C2440、2410 ARM芯片和Intel公司的PXA255、270 ARM芯片,这里的CPU芯片采用的是PXA255。不同CPU之间,矩阵键盘硬件设计相同。矩阵键盘硬件设计电路原理如图1所示。


图1  矩阵键盘(4×5)电路原理

3  矩阵键盘驱动设计

3.1  矩阵键盘驱动开发策略

  Windows CE.Net中的驱动可分为两种模式:本机驱动模式和流驱动模式[2]。前者比较适合集成在本机上的设备,后者则通常用在用户添加的外围设备上。本文讨论的矩阵键盘作为一种外围设备适合采用流驱动模式。

3.2  矩阵键盘驱动加载过程

  Windows CE.Net系统运行时会默认启动DEVICE.EXE进程。DEVICE.EXE就是负责加载所有流驱动的,进程对流驱动的加载通过注册表列举器(RegEnum.dll)来实现。键盘的资源信息由OEM适配层(OAL)记录在注册表中,RegEnum.dll是通过扫描注册表项 HKEYLOCALMACHINE\Drivers\BuiltIn\PWRBUTTON下的键值对矩阵键盘进行初始化的。注册表中关于矩阵键盘驱动的注册信息如下:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\PWRBUTTON]
"Prefix"="PWR"//设备文件名前缀
"Dll"="PwrButton.Dll"//键盘驱动的动态连接库名
"Order"=dword:2//键盘驱动加载顺序
"Ioctl"=dword:4[page]

3.3  矩阵键盘驱动重要函数设计

  流接口驱动程序的主要任务就是把外设的使用传递给应用程序。这是通过把设备表示为文件系统的一个特殊文件来实现的,每个流接口的驱动程序都必须实现一组标准的接口函数。由于矩阵键盘驱动采用了流驱动模式设计,故矩阵键盘驱动使用标准的流驱动接口函数,也称“矩阵键盘驱动的DLL接口”。DLL接口的具体描述如表1所列。

表1  矩阵键盘流驱动程序的DLL接口

  矩阵键盘作为一种输入设备与其他外围设备有很大的区别,应用层不能对其发布命令来操作它。因此一般流驱动接口函数中对设备进行操作的接口函数在矩阵键盘驱动中只是作了保留,并未有实质性的功能。接口函数中比较重要的是PWR_Init和PWR_DllEntry。下面简单介绍这两个函数:

  ①  PWR_DllEntry。驱动程序的入口函数,当Windows CE.NET加载或断开DLL时调用,其中dwReason指明了调用的原因。
  ②  PWR_Init。接口函数PWR_Init完成矩阵键盘流驱动程序的初始化,首先完成矩阵键盘驱动涉及的CPU的I/O口寄存器和中断控制寄存器的地址映射工作。接下来设置中断服务线程优先级,最后创建中断服务线程和初始化I/O口。

3.4  矩阵键盘驱动中断处理设计

(1)  矩阵键盘驱动实现原理概述
  矩阵键盘驱动的主要作用就是实时监测外部按键中断,一旦发现外部有键按下就向内核发送键盘消息实现键盘输入功能。键盘驱动创建了中断服务线程和4个键盘中断事件,每行按键对应一个键盘中断事件。有键被按下时,中断服务例程得到对应的中断标识符并报告给系统任务调度进程,同时产生键盘中断事件,键盘中断服务线程响应键盘中断事件,开始扫描矩阵键盘。根据产生的中断事件类型不同,可以首先确定被按下键的行位置。由于键盘被按下后,该键对应的行和列被连通,因此根据判断各列对应的I/O口的电平,可以得到被按下键的列位置;得到按键的准确位置后,通过向操作系统发送键盘消息KEYBD_EVENT,实现一次键盘输入。循环扫描键盘,直到按键被弹起则发送KEYEVENTF_KEYUP事件。响应键盘中断输入的整个流程如图2所示。


图2  响应键盘中断输入流程图

  实际上,矩阵键盘驱动的设计就是键盘中断处理的设计。下面就对矩阵键盘驱动中的中断处理设计作详细的介绍。

(2)  在OAL层加入中断源
  矩阵键盘采用4路I/O口中断,每路中断对应1个中断源。矩阵键盘驱动首先要在OAL层加入这些中断源。以其中一路中断为例:
  #define SYSINTR_KEYONE(SYSINTR_FIRMWARE+0)

(3)  中断服务例程(ISR)设计
  本键盘驱动将GPIO_6、GPIO_7、GPIO_16、GPIO_17四个I/O口作为中断 I/O口。有键被按下时将产生一个I/O中断,内核首先进入异常中断处理程序,由它屏蔽所有中断,再调用中断服务例程ISR得到该中断的逻辑中断标识。鉴于ISR的任务比较单一,ISR通常都要求越短、越快越好。矩阵键盘驱动的ISR设计如下:
  if(v_pGPIOReg﹥GEDR_x & GPIO_6) {//中断触发
    v_pGPIOReg﹥GEDR_x = GPIO_6;//清除中断
    return SYSINTR_KEYONE;//返回中断标识}

  其他三路中断的ISR设计与此类似。

(4)  中断服务线程(IST)设计
  中断服务例程以键盘中断的逻辑中断标识符形式返回给系统任务调度进程,中断服务线程则在矩阵键盘驱动中负责具体中断处理。因为中断服务例程较小,并且只做很少的处理工作,中断服务线程就必须完成大多数中断处理工作,功能主要包括响应中断、扫描按键位置、发送键盘消息等。
  矩阵键盘驱动的IST设计如下:矩阵键盘驱动设计了4个中断事件HANDLE hKEYEvents[4],分别对应矩阵键盘4行产生的中断。在矩阵键盘驱动的IST中,调用CreateEvent函数创建4个事件对象,接着调用系统函数InterruptInitialize完成中断和事件的关联并使能中断。完成这些初始化工作后,就可以调用 WaitForMultipleObjects (hKEYEvents)函数进入键盘事件的等待队列中。当有事件被捕获后,根据不同的事件类型进入不同的键盘扫描处理程序(以其中一路中断为例):

  switch (dwEventWAIT_OBJECT_0){//事件类型
  case 0://第1行键盘有键按下
  v_pGPIOReg﹥GPDR_x &= ~ (GPIO_13);//设为输入
  v_pGPIOReg﹥GPDR_x |= (GPIO_6);//中断I/O输出
  v_pGPIOReg﹥GPCR_x |= (GPIO_6);//输出低电平
  while(!(v_pGPIOReg﹥GPLR_x & GPIO_13)) {//扫描矩阵键盘,判断按键列位置
    if(num==1)//第1次连发延时400 ms
      Sleep(400);
    else
      Sleep(100);//按键延时去抖
    if(!(v_pGPIOReg﹥GPLR_x & GPIO_13)){//列位置
      keybd_event('0' ,0x71, 0, 0);//发键盘消息
      num++;//连发计数
    }
    else{
      if((v_pGPIOReg->GPLR_x & GPIO_13)&&num>0){
        num=0;//按键弹起
        keybd_event('0',0x71, KEYEVENTF_KEYUP, 0);}
    }
  }

  中断处理完成后恢复I/O口的初始电平,调用InterruptDone函数恢复中断,使其能响应下一次同样的中断。

  编者注:驱动程序源码见本刊网站www.mesnet.com.cn。

结语

  随着嵌入式设备应用的日益广泛,特别是微软的嵌入式操作系统Windows CE.NET的普及,Windows CE.NET下矩阵键盘设计得到了越来越多开发者的重视。本文所讨论的Windows CE.NET下矩阵键盘设计方案简单、高效、实用。特别适合于I/O口资源充足的嵌入式PDA上,现已成功应用于某卫星定位系统的键盘设计上。

参考文献

[1]  Intel. PXA255 Processor Developer’s Manual[R],2003-03.
[2]  陈向群,王雷,马洪兵,等.Windows CE .NET系统分析及实验教程[M].北京:机械工业出版社,2003:5-7.
[3]  周毓林,宁杨,陆贵强,等.Windows CE.net内核定制及应用开发[M].北京:电子工业出版社,2004:213-215.
[4]  潘莉,吴晓婷,邓中亮.Windows CE下串口驱动开发设计[J].电脑开发与应用,2005,18(4):21-23.
[5]  http://www.driverdevelop.com.

龚小林(硕士研究生),主要研究方向为现代通信技术;
柯熙政(教授、博士生导师),主要研究方向为大气激光通信、现代通信技术等;
宋辉(硕士研究生),主要研究方向为嵌入式系统。

关键字:矩阵键盘  中断  流驱动 引用地址:Windows CE.Net下的矩阵键盘开发设计

上一篇: 基于VxWorks嵌人式操作系统的C/S模式网络编程
下一篇:VxWorks系统概念妙喻

推荐阅读最新更新时间:2024-05-02 22:03

嵌入式实时系统中断管理技术研究
摘要:嵌入式实时系统中断管理技术直接影响到系统的实时响应性能。本文通过对嵌入式内核中断管理技术的研究,归结出“中断前-后段处理”模型;同时,针对一些处理器中多个外部中断共用一个向量的问题,提出一种单向量多中断处理映射技术,并在PowerPC MPC860处理器上实现Delta OS内核时,验证此技术的有效性。 关键词:实时性 中断 中断管理模式 嵌入式实时系统 引 言 嵌入式实时系统(Real-Time System)是一个能够在指定或者确定的时间内对外部事件作出响应的系统,其重要的特性是实时响应性。   嵌入式实时系统对外部事件的响应一般都是通过中断来处理的,其对中断的处理方式,直接影响到系统的实时性能。 1 嵌
[应用]
C&K门锁开关实现频繁的手动电路中断,寿命达100000个周期
符合 RoHS 指令要求的 DS 系列开关是安全系统、游戏设备和家用电器的理想之选 C&K Components开发了一款稳定的、面向门锁系统的卡入式安装按键开关。DS系列连锁开关具有闩锁或瞬动作用,提供多种集成选项,在恶劣环境下通常被用作检测开关或中断电路。单/双刀双掷DS系列开关符合RoHS指令要求,由无卤素材料制成。 DS连锁按键开关采用稳定的铜合金,镀银公共端子和F5级镀金银合金触点,性能强健。DS开关的介电强度高达1500V(50-60Hz,在海平面上),绝缘电阻为100m (最小值),额定初始接触电阻为30m 。 详情请访问网站: http://goo.gl/EfHsny
[安防电子]
STM8学习笔记---uart1串口中断
uart1串口发送、接收中断。 目标:串口接收1,点亮led1,接收2点亮led2,接收到其他字符关闭led1和led2。 步骤如下: 1、编写led.h和led.c文件。略 2、编写uart.h和uart.c文件,其中串口配置函数如下: void USART_Configuration(void)//串口初始化函数 { UART1_DeInit(); UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO , UART1_SYNCMODE_CLOCK_DISABLE , UART1_MODE
[单片机]
基于tiny4412的Linux內核移植 --- 实例学习中断背后的知识(2)
平台 tiny4412 ADK Linux-4.9 概述 前面一篇博文基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(1)结合示例分析了一下新版kernel引入设备树和irq domain后中断幕后的一些知识,其中的示例只是使用gpio中断的一种方式,此外,还有一种,就像博文 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(1)中描述的那样,这种实现方式又是如何进行的呢?下面还是结合示例的方式分析。 正文 框图可以参考前一篇博文。 在前一篇博文的第三部分 GPIO控制器驱动中有一个函数我们没有分析,就是samsung_gpiolib_register,把这函数看懂了,后面的分
[单片机]
【51单片机STC89C52】定时器(中断)控制LED
一、定时器/计数器T0 1、定时器/计数器的相关寄存器 2、定时器/计数器控制寄存器TCON TCON格式如下: 3、定时器/计数器工作模式寄存器TMOD 模式选择: 二、配置相关寄存器 1、使用STC-ISP工具 2、配置寄存器 设置定时器模式(16位定时器) 配寄存器推荐使用按位操作: 需要清零的位与等于0,不清零的位与等于1 需要置1的位或等于1,不需要置一的位或等于0 TMOD &= 0xF0; //清零低四位、高四位不变 TMOD |= 0x01; //低四位的bit0置1 设置定时器初值 TL0=0x00; //低八位、需要计算 TH0=0xDC
[单片机]
【51单片机STC89C52】定时器(<font color='red'>中断</font>)控制LED
4×4矩阵键盘C语言程序参考
#define int8 unsigned int #define int16 unsigned char #define int32 unsigned long #define KEY_PORT PORTD #define KEY_ PIN PIND #define ROW1 (1 0) #define ROW2 (1 1) #define ROW3 (1 2) #define ROW4 (1 3) stat IC int8 s CAN _X(void); static delay(void); int8 scan_key(void); /* 函数原型:int8 scan_key(void) 功能: 返回按下的按
[单片机]
PPC 405EP在电力监测系统中的应用
1 引言 目前,作为监测系统核心器件的微处理器一般采用高性能单片机、数字信号处理器(DSP)等提高系统的处理速度。但是,随着电力系统监测趋于多功能、智能化、可视化的发展。上述单一的器件已不能完全满足要求。本文介绍了一种新型嵌入式微处理器PPC 405EP以及基于PPC 405EP的电力监测系统,能够满足高实时性、良好的人机交互和多种通信方式要求。 2 PPC 405EP微处理器 20世纪90年代,IBM和Motorola以及Apple公司共同开发了32位/64位PowerPC系列微处理器,主要应用于PC、网络通讯、工业控制领域。PowerPC灵活的体系结构可实现多种专用系统。PPC405EP是IBM/AMCC公司高性能嵌入式
[工业控制]
stm32的串口空闲中断接收数据
举个例子: 1、后台数据- USART1- USART2- 其它设备,其它设备数据- USART2- USART1- 后台,这两个数据过程也可能同时进行。 2、由于硬件的限制,USART1和USART2的传输波特率不一样,比如USART1使用GPRS通信,USART2使用短距离无线通信;或者USART1使用以太网通信,USART2使用485总线通信。 现在我把我实现的过程简单描述一下: 1、 初始化设置:USART1_RX DMA1_ Channel5,USART2_RX DMA1_ Channel6,USART1_TX DMA1_ Channel4,USART2_TX DMA1_ Channel7(具体设置请看程序包) 2
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved