📄 7.5 键盘驱动.txt
字号:
7.5 键盘驱动
7.5.1 键盘的硬件实现
EP7312提供了8个键盘扫描列输出驱动端口,可由其他GPIO进行行扫描,并根据获得的GPIO端口状态来判断哪个键按下。最大扫描阵列为8×8。在嵌入式ARM实验箱中的缺省配置为4×4键盘扫描阵列。以EP7312的COL0~COL3为列扫描输出驱动,用EP7312的GPIO PORT A0~A3作为行输入线。所有列输出驱动和PORT A的口线都连接到接插件JP9(如图7-8所示)
1. 键盘的功能实现原理
键盘时嵌入式系统中是一个很关键的部件,它能实现向计算机输入数据、传送命令等功能,是用户与嵌入式系统交互的主要手段。键盘实质上是一组按键开关的集合。通常,按键所用的开关为机械弹性开关,均利用了机械触点的合、断作用。
一个电压信号通过机械触点的断开、闭合过程的波形如图7-9所示。由于机械触点的弹性作用,一个按键开关在闭合时不会立即稳定地接通,在断开时也不会立即断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。抖动时间的长短由按键的机械特性决定,一般为5~10ms。
键的闭合与否反应在电压上,就是呈现出高电平或低电平。如果高电平表示断开,那么低电平则表示闭合。所以通过电平的高低状态的检测,便可确认按键按下与否。为了确保CPU对一次按键动作只确认一次,必须消除抖动的影响。一般常用软件的方法进行去抖。在第一次检测到有键按下时,执行一段延时10ms左右的延时子程序,再次确认该键电平是否保持闭合状态电平。如果保持闭合状态电平,则确认为真正有键按下,从而消除了抖动的影响。
2.键盘的工作原理
键盘中有无键按下由列线和行线的状态决定。当列线通过上拉电阻接高电平时,决定列接口都是1。按键判定的步骤是:把行线(D4~D7)依次置低电平,然后读入列中,根据行、列交叉点判断按下的具体键(如图7-10)键盘上的每一个键都有一个键值,其功能是由键盘驱动程序事先设定好的。
3.中断键盘扫描工作方式
初始化时,将D4~D7置低电平。当有键按下时,中断端为低电平,向CPU发出中断请求,进入中断服务程序。中断服务程序首先进行键盘扫描,扫描方式又分为扫描法和反转法两种。扫描法是在发现有键按下后,逐行对D4~D7置低电平,并检查D0~D3的状态。如果其中某位为0,此行列交叉点上的键即为按下键。反转法接线图与扫描法稍有不同,它分为两步来确定按键,第一步同扫描法,用来判断是否有键按下及按下的键所在的行(列);第二步是将行、列的输入、输出状态与第一步反向,此时列(行)中的0电平和第一步中行(列)的0电平对应位是按下键。
4.矩阵键盘缓冲算法
被按下键的扫描代码通常放置在一个缓冲区内,直到该应用程序准备处理一个按键为止。缓冲是一个方便的特征,因为当应用程序在按键发生而不能马上处理时,缓冲区的使用可以防止按键的丢失。缓冲区大小一般视应用程序的需求而定。一般而言,一个大小为10个按键代码的缓冲区内能够满足大多数情况下的要求。缓冲区的实现是以一个环行队列的形式完成的。当一个按键被按下后,扫描代码将被放置在队列下一个空位置上。当应用程序从该键盘模块中读取了一个扫描码后,它将被从该队列中删除掉,队列指针的第一位指向下一个扫描代码(如果有)。如果该队列我满,则任何下一格按键都会被丢失。
5.EP7312的键盘接
EP7312的键盘接口是一个8位的输出接口,一般作为键盘矩阵的列驱动。EP7312的键盘接口支持通过GPIO(PA 口)可以直接连接成8×8的输入键盘矩阵,通过扫描法决定键盘按键的状态。设置相关的寄存器可以产生由键盘触发的内部中断。通常是将PA口作为行扫描的输入口。当键盘中断被允许时,PA口的8个引脚在芯片内部被连接到一个8输入“或”门,其输出作为系统的键盘中断源。这就使得当PA口作为键盘矩阵的输入时,任一键按下都会产生键盘中断。当然,为了扩展键盘,也可以使用扩展总线来读取设定的键值。键盘接口的这种中断方式允许操作系统采用轮询法、中断扫描法或者两者相结合的方式定制设备驱动程序。
键盘矩阵的列向量引脚可以被置为3种状态:高(1)、低(0)和高阻。PA口的引脚一般被定义成8×8矩阵的行向量的输入端。对于标准键盘接口而言,驱动列向量的引脚被置为高,使得在按键动作时,PA口的某个引脚被置为高,从而产生键盘中断。
键盘接口不提供片内的去抖电路,这就需要设计者使用软件完成按键的去抖功能,以防止系统的误动作。
在键盘中断控制寄存器中有以下定义:
当KBWEN位(即键盘唤醒使能位,SYSCON2 bit3)清0,且键盘中断没有被屏蔽时,按键动作将会使系统从省电模式下唤醒。
当KBWEN位置1时,不管键盘中断处于任何状态,系统都会从省电模式下唤醒,称为“按键直接唤醒”模式。这种模式下,中断请求可能不会被响应。若键盘中断被屏蔽掉,处理器就会从它进入省电模式的代码处继续执行,否则,处理器会进入中断服务程序。
当KBD6位(SYSCON2 bit1)被清0时,PA口的8个引脚在芯片内部连接到一个8输入的“或”门上,其输出则作为内部唤醒信号及键盘中断请求信号。这种状态是系统复位后的默认状态。
当KBD6位(SYSCON2 bit1)被置1时,仅仅是PA口的低6位引脚在芯片内部连接到另外两个引脚可以用做GPIO使用。
在KBWENZ和KBD6都被清0时,只能通过外部、中断或其他没有屏蔽的内部中断把系统从省电模式中唤醒。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -