1标题:键盘接口电路教学目标与要求:1.键盘去抖动和连接、控制方式2.独立式按键及其接口电路3.矩阵式键盘及其接口电路授课时数:2教学重点:.矩阵式键盘及其接口电路教学内容及过程:一、键盘接口概述1、按键开关去抖动问题机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图9-11所示,抖动时间的长短与开关的机械特性有关,一般为510ms在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施。这一点可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。在硬件上可采用在键输出端加R-S触发器(双稳态触发器)或单稳态触发器构成去抖动电路。图9-12是一种由R-S触发器构成的去抖动电路,当触发器一旦翻转,触点抖动不会对其产生任何影响。软件上采取的措施是:在检测到有按键按下时,执行一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态。同理,在检测到该键释放后,也应采用相同的步骤进行确认,从而可消除抖动的影响。22.编制键盘程序一个完善的键盘控制程序应具备以下功能:(1)检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。(2)有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。(3)准确输出按键值(或键号),以满足跳转指令要求。二、独立式按键单片机控制系统中,往往只需要几个功能键,此时,可采用独立式按键结构。1.独立式按键结构独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图7.4所示。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。2.矩阵式键盘I/O端线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线发生短路。特点:①占用I/O端线较少;②软件结构教复杂。适用于按键较多的场合。3.键盘扫描控制方式⑴程序控制扫描方式键处理程序固定在主程序的某个程序段。特点:对CPU工作影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。⑵定时控制扫描方式利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描。特点:与程序控制扫描方式的区别是,在扫描间隔时间内,前者用CPU工作程序填充,后者用定时/计数器定时控制。定时控制扫描方式也应考虑定时时间不能太长,否则会影响对键输入响应的及时性。⑶中断控制方式中断控制方式是利用外部中断源,响应键输入信号。特点:克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高CPU运行效率,但要占用一个宝贵的中断资源。三、独立式按键及其接口电路1、按键直接与I/O口连接3【例9-8】按图9-13(a)、(b),试分别编制按键扫描子程序。解:按图9-13(a)编程如下:KEYA:ORLP1,#07H;置P1.0~P1.2为输入态MOVA,P1;读键值,键闭合相应位为0CPLA;取反,键闭合相应位为1ANLA,#00000111B;屏蔽高5位,保留有键值信息的低3位JZGRET;全0,无键闭合,返回LCALLDY10ms;非全0,有键闭合,延时10ms,软件去抖动MOVA,P1;重读键值,键闭合相应位为0CPLA;取反,键闭合相应位为1ANLA,#00000111B;屏蔽高5位,保留有键值信息的低3位JZGRET;全0,无键闭合,返回;非全0,确认有键闭合JBAcc.0,KA0;转0#键功能程序JBAcc.1,KA1;转1#键功能程序JBAcc.2,KA2;转2#键功能程序GRET:RETKA0:LCALLWORK0;执行0#键功能子程序RETKA1:LCALLWORK1;执行1#键功能子程序RETKA2:LCALLWORK2;执行2#键功能子程序RET按图9-13(b)编程如下:KEYB:ORLP1,#07H;置P1.0~P1.2为输入态MOVA,P1;读键值,键闭合相应位为1ANLA,#00000111B;屏蔽高5位,保留有键值信息的低3位JZGRET;全0,无键闭合,返回LCALLDY10ms;非全0,有键闭合,延时10ms,软件去抖动MOVA,P1;重读键值,键闭合相应位为1ANLA,#00000111B;屏蔽高5位,保留有键值信息的低3位JZGRET;全0,无键闭合,返回;非全0,确认有键闭合JBAcc.0,KB0;转0#键功能程序4JBAcc.1,KB1;转1#键功能程序JBAcc.2,KB2;转2#键功能程序GRET:RETKB0:LCALLWORK0;执行0#键功能子程序RETKB1:LCALLWORK1;执行1#键功能子程序RETKB2:LCALLWORK2;执行2#键功能子程序RET四、矩阵式键盘及其接口电路矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上。当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。然而,矩阵键盘中的行线、列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,因此,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。2.矩阵式键盘按键的识别识别按键的方法很多,其中,最常见的方法是扫描法。下面以图7.5中8号键的识别为例来说明扫描法识别按键的过程。按键按下时,与此键相连的行线与列线导通,行线在无键按下时处在高电平。显然,如果让所有的列线也处在高电平,那么,按键按下与否不会引起行线电平的变化,因此,必须使所有列线处在低电平。只有这样,当有键按下时,该键所在的行电平才会由高电平变为低电平。CPU根据行电平的变化,便能判定相应的行有键按下。8号键按下时,第2行一定为低电平。然而,第2行为低电平时,能否肯定是8号键按下呢?回答是否定的,因为9、10、11号键按下,同样会使第2行为低电平。为进一步确定具体键,不能使所有列线在同一时刻都处在低电平,可在某一时刻只让一条列线处于低电平,其余列线均处于高电平,另一时刻,让下一列处在低电平,依此循环,这种依次轮流每次选5通一列的工作方式称为键盘扫描。采用键盘扫描后,再来观察8号键按下时的工作过程,当第0列处于低电平时,第2行处于低电平,而第1、2、3列处于低电平时,第2行却处在高电平,由此可判定按下的键应是第2行与第0列的交叉点,即8号键。3.键盘的编码对于独立式按键键盘,因按键数量少,可根据实际需要灵活编码。对于矩阵式键盘,按键的位置由行号和列号惟一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,高4位是行号,低4位是列号。如图9-15中的8号键,它位于第2行,第0列,因此,其键盘编码应为20H。采用上述编码对于不同行的键离散性较大,不利于散转指令对按键进行处理。因此,可采用依次排列键号的方式对按排进行编码。以图7.5中的4×4键盘为例,可将键号编码为:01H、02H、03H、…、0EH、0FH、10H等16个键号。编码相互转换可通过计算或查表的方法实现。【例9-10】按图9-15及图9-16,试编制矩阵式键盘扫描程序。解:KEY:MOVP1,#0F0H;行线置低电平,列线置输入态KEY0:MOVA,P1;读列线数据CPLA;数据取反,“1”有效ANLA,#0F0H;屏蔽行线,保留列线数据MOVR1,A;存列线数据(R1高4位)JZGRET;全0,无键按下,返回KEY1:MOVP1,#0FH;行线置输入态,列线置低电平MOVA,P1;读行线数据CPLA;数据取反,“1”有效ANLA,#0FH;屏蔽列线,保留行线数据MOVR2,A;存行线数据(R2低4位)JZGRET;全0,无键按下,返回JBCF0,WAIT;已有消抖标志,转SETBF0;无消抖标志,置消抖标志LCALLDY10ms;调用10ms延时子程序(参阅例4.13),消抖SJMPKEY0;重读行线列线数据GRET:RETWAIT:MOVA,P1;等待按键释放CPLA;ANLA,#0FH;JNZWAIT;按键未释放,继续等待KEY2:MOVA,R1;取列线数据(高4位)MOVR1,#03H;取列线编号初值MOVR3,#03H;置循环数CLRC;KEY3:RLCA;依次左移入C中JCKEY4;C=1,该列有键按下,(列线编号存R1)DECR1;C=0,无键按下,修正列编号DJNZR3,KEY3;判循环结束否?未结束继续寻找有键按下的列线KEY4:MOVA,R2;取行线数据(低4位)MOVR2,#00H;置行线编号初值6MOVR3,#03H;置循环数CLRC;KEY5:RRCA;依次右移入C中JCKEY6;C=1,该行有键按下,(行线编号存R2)INCR2;C=0,无键按下,修正行线编号DJNZR3,KEY5;判循环结束否?未结束继续寻找有键按下的行线KEY6:MOVA,R2;取行线编号CLRC;RLCA;行编号×2RLCA;行编号×4ADDA,R1;行编号×4+列编号=按键编号KEY7:CLRC;RLCA;按键编号×2RLCA;按键编号×4(LCALL+RET共4字节)MOVDPTR,#TABJ;JMP@A+DPTR;散转,执行相应键功能子程序TABJ:LCALLWORK0;调用执行0#键功能子程序RET;LCALLWORK1;调用执行1#键功能子程序RET;……LCALLWORK15;调用执行15#键功能子程序RET【例9-11】按图9-17,试编制中断方式键盘扫描程序,将键盘序号存入内RAM30H。解:ORG0000H;复位地址LJMPSTAT;转初始化ORG0003H;中断入口地址LJMPPINT0;转中断服务程序ORG0100H;初始化程序首地址STAT:MOVSP,#60H;置堆栈指针7SETBIT0;置为边沿触发方式MOVIP,#00000001B;置为高优先级中断MOVP1,#00001111B;置P1.0~P1.3置为输入态,置P1.4~P1.7输出0SETBEA;CPU开中SETBEX0;开中LJMPMAIN;转主程序,并等待有键按下时中断OGR2000H;中断服务程序首地址PINT0:PUSHAcc;保护现场PUSHPSW;MOVA,P1;读行线(P1.0~P1.3)数据CPLA;数据取反,“1”有效ANLA,#0FH;屏蔽列线,保留行线数据MOVR2,A;存行线(P1.0~P1.3)数据(R2低4位)MOVP1,#0F0H;行线置低电平,列线置输入态MOVA,P1;读列线(P1.4~P1.7)数据CPLA;数据取反,“1”有效ANLA,#0F0H;屏蔽行线,保留列线数据(A中高4位)MOVR1,#03H;取列线编号初值MOVR3,#03H;置循环数CLRC;PINT01:RLCA;依次左移入C中JCPINT02;C=1,该列有键按下,(列线编号存R1)DECR1;C=0,无键按下,修正列编号DJNZR3,PINT01;判循环结束否?未结束继续寻找有键按下列线PINT02:MOVA,R2;取行线数据(低4位)MOVR2,#00H;置行线编号初值MOVR3,#03H;置循环数PINT03:RRCA;依次右移入C中JCPINT04;C=1,该行有键按下,(行线编号存R2)INCR2;C=0,无键按下,修正行线编号DJNZR3,PINT03;判循环结束否?未结束继续寻找有键按下行线PINT04:MOVA,R2;取行线编号CLRC;RLCA;行编号×2RLCA;行编号×4ADDA,R1;行编号×4+列