欢迎来到天天文库
浏览记录
ID:57023745
大小:184.63 KB
页数:10页
时间:2020-07-31
《矩阵键盘的工作原理和扫描确认方式.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、9.3.1矩阵键盘的工作原理和扫描确认方式来源:《AVR单片机嵌入式系统原理与应用实践》M16华东师范大学电子系马潮当键盘中按键数量较多时,为了减少对I/O口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图9-7所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU通过检测行或列线上的电平变化可以确定哪个按键被按下。图9-7为一个4x3的行列结构,可以构成12个键的键盘。如果使用4x4的行列结构,就能组
2、成一个16键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O口线。矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对MCU的占用时间。下面以图9-7为例,介绍采用行扫描法对矩阵键盘进行判别的思路。图9-7中,PD0、PD1、PD2为3根列线,
3、作为键盘的输入口(工作于输入方式)。PD3、PD4、PD5、PD6为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。行扫描法也称为逐行扫描查询法,其按键识别的过程如下。√将全部行线PD3-PD6置低电平输出,然后读PD0-PD2三根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。√在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依次将行线置为低电平,并检测列线的输入(扫描),进而确认是具体的按键位置。如当PD5
4、输出低电平时(PD3=1、PD4=1、PD5=0、PD6=1),测到PD1的输入为低电平(PD0=1、PD1=0、PD2=1),则可确认按键K3-2处于闭合状态。通过以上分析可以看出,MCU对矩阵键盘的按键识别,是采用扫描方式控制行线的输出和检测列线输入的信号相配合实现的。√矩阵按键的识别仅仅是确认和定位了行和列的交叉点上的按键,接下来还要考虑键盘的编码,即对各个按键进行编号。在软件中常通过计算的方法或查表的方法对按键进行具体的定义和编号。在单片机嵌入式系统中,键盘扫描只是MCU的工作内容之一。MCU除了要检测键盘和处理
5、键盘操作之外,还要进行其他事物的处理,因此,MCU如何响应键盘的输入需要在实际系统程序设计时认真考虑。通常,完成键盘扫描和处理的程序是系统程序中的一个专用子程序,MCU调用该键盘扫描子程序对键盘进行扫描和处理的方式有三种:程序控制扫描、定时扫描和中断扫描。√程序控制扫描方式。在主控程序中的适当位置调用键盘扫描程序,对键盘进行读取和处理。√定时扫描方式。在该方式中,要使用MCU的一个定时器,使其产生一个10ms的定时中断,MCU响应定时中断,执行键盘扫描,当在连续两次中断中都读到相同的按√键按下(间隔10ms作为消抖处理)
6、,MCU才执行相应的键处理程序中断方式。使用中断方式时,键盘的硬件电路要做一定的改动,增加一个按键产生中断信号的输入线,当键盘有按键按下时,键盘硬件电路产生一个外部的中断信号,MCU响应外部中断,进行键盘处理。下面我们介绍基于状态机并采用定时键盘扫描的键盘处理系统的设计方法。9.3.2定时扫描方式的键盘接口程序根据图9-7,下面的键盘接口函数read_keyboaed()完成了对4*3键盘的扫描识别和键盘的编码。编码键盘的定义使用define语句定义,键盘的形式类似电话和手机键盘,如图9-8所示。#defineNo_ke
7、y255#defineK1_11#defineK1_22#defineK1_33#defineK2_14#defineK2_25#defineK2_36#defineK3_17#defineK3_28#defineK3_39#defineK4_110#defineK4_20#defineK4_311#defineKey_mask0b00000111charread_keyboard(){staticcharkey_state=0,key_value,key_line;charkey_return=No_key,i;swi
8、tch(key_state){case0:key_line=0b00001000;for(i=1;i<=4;i++)//扫描键盘{PORTD=~key_line;//输出行线电平PORTD=~key_line;//必须送2次!!!(注1key_value=Key_mask&PIND;//读列电平if(key_valu
此文档下载收益归作者所有