基于ARM9的多行列键盘设计及其驱动实现

基于ARM9的多行列键盘设计及其驱动实现,第1张

  1 引 言

  许多嵌入式系统,尤其是一些人机交互(HMI)较频繁的嵌入式系统,键盘是一种应用最为广泛的输入设备。由于嵌入式设备的功能互异性,为其提供一种通用性键盘是不可行的,一般都需要根据嵌入式系统的实际功能来设计所需的特殊键盘,并实现相应的驱动程序。www.51kaifa.com

  在嵌入式设备上扩展键盘的常用方式是通过使用CPU的GPIO端口扫描实现的,显然,这种方式会占用系统的GPIO资源,特别是在GPIO资源比较紧张而按键又较多的系统,这个问题就特别突出。当然,也可以通过外扩GPIO(如8255等)或外扩专用的键盘接口(如8279等)方式实现,但这种方式显然增加了系统的复杂度,在实际系统设计中颇感不便。

  本文以在ARM9(AT91RM9200)嵌入式微处理器上实现一个POS机键盘(8×8)为例,呈现了一种在嵌入式设备上扩展多行列键盘的新设计思路,并在ARM-Linux系统实现了键盘的驱动程序。

  2、接口电路的硬件设计

  本文通过一个设计实例,说明如何使用一种比较简单的方式,来实现一个8×8的POS机矩阵键盘,POS机所采用的微处理器是AT91RM9200芯片。AT91RM9200是ATMEL公司生产的一款高性能的32位ARM9处理器,它是一款通用工业级ARM芯片,在工业控制、智能仪器仪表等领域内得到了大量的应用[3,4],其详细芯片特性可参见文献[2]。

  在AT91RM9200上扩展键盘,一般都是通过其GPIO端口来实现。AT91RM9200虽提供了4×32个可编程的GPIO端口。但为减小芯片体积和功耗,其许多GPIO端口都是与系统的外围设备控制器端口或地址线、数据线进行复用的,所以实际可用于扩展的GPIO端口是很少的。而对于一个8×8键盘,若采用传统的GPIO端口扩展方式,则需要16个GPIO,这在一个比较复杂的POS系统中是很难满足的,因此需要采用其他方式来解决这个问题。

  基于ARM9的多行列键盘设计及其驱动实现,第2张

  图1 键盘接口原理图

  本文通过数据锁存的方式,充分利用32位处理器的数据宽度优势,使用数据线来替代键盘扩展所需的GPIO端口,从而减少对系统GPIO资源的占用。键盘接口的实现原理如图1所示。在图1所示的电路中,U1301(74LVCC4245)为三态缓冲器,U1302(74HC574)为锁存器,系统工作原理描述如下:

  U1301的nOE端连接系统的译码输出nKey_CS,部件地址由系统译码电路决定,当向该地址写数据时,nKey_CS信号为低电平,数据可以通过U1301,同时,nKey_CS信号经两级反相器延时后作为锁存信号将数据锁存到U1302的输出端,作为键盘的行扫描信号,而键盘的列扫描信号则仍然使用系统的GPIO。依次向每行送出低电平信号,同时检测连接在GPIO的列信号,即可实现对键盘的扫描。在本系统中,只使用了系统32位数据的低8位作为行扫描信号,在实现8×8矩阵键盘扫描的情况下,仅需要占用8个GPIO口,如果采用同样的方式,分别使用16位数据或32位数据作为行扫描信号,则只需要占用4个或2个GPIO,显然,与传统的方式相比较,该方式可以大大节省系统的GPIO资源。

  3、键盘的驱动模块设计

  完成接口电路的设计之后,还需要编写相应的键盘驱动模块。本文采用AT91RM9200芯片中已经运行了ARM-Linux *** 作系统,因此给键盘的驱动程序开发提供了很大的方便。键盘的驱动模块可分为硬件初始化、文件 *** 作函数的实现以及键盘扫描程序三个部分。

  3.1 硬件初始化

  键盘驱动程序的开发模式与Linux系统中一般字符设备的驱动开发步骤相似,关于Linux设备驱动开发的详细分析可参考文献[1]。首先需完成的是驱动程序模块的初始化函数和清除函数。在初始化函数中,除完成模块注册外,还应进行硬件初始化,下面是本文根据AT91RM9200芯片的GPIO控制器的特性[2],在模块的初始化函数中的硬件初始化的伪代码。

  ……

  设置所使用GPIO端口为GPIO控制器控制

  设置所使用GPIO端口的类型为输入

  使能所使用GPIO端口的输入毛刺滤波功能

  使能相应的GPIO控制器时钟

  取指定地址的虚拟地址并向地址写入数据0x0

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2714252.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存