1、,#,单片机原理及,应用技术,键盘接口设计与编程,任务一 独立式键盘的接口设计与编程,任务二 矩阵式键盘的接口设计与编程,Project 9,任务,1,独立式,键盘,的,接口设计,与,编程,独立式键盘接口设计,one,独立式键盘相互独立,,每个按键占用一根,I/O,口线,每根,I/O,口线上的按键工作状态不会影响其他按键的工作状态,,CPU,可直接读取该,I/O,线的高,/,低电平状态。,这种按键硬件、软件结构简单,判键速度快,使用方便,但占用,I/O,口线较多,适用于按键数量较少的系统中,。,独立连接式键盘连接图,如图所示。当没有键被按下时,所有的数据输入线均为高电平;当任意一个按键被按下时
2、,与之相连的数据输入线将变为低电平;通过相应指令,可以判断是否有键被按下。,按键的,抖动问题,是指,按键的触点在闭合和断开瞬间由于接触情况不稳定,从而导致电压信号的抖动现象,(由按键的机械特性造成,不可避免)。如图所示为一次按键的抖动过程,在按键的前沿和后沿都会有,5,10ms,的抖动。,按键抖动问题产生的原因及解决方法,two,对于时钟是微秒级的单片机而言,键盘的抖动有可能造成单片机对一次按键的多次处理。为了提高系统的稳定性,我们必须采用有效的方式,消除抖动,。,去除抖动可以采用,硬件方式,和,软件方式,。,硬件方式,一般是在按键与单片机的输入通道上安装硬件去抖电路(如,RS,触发器),。,
3、软件方式的实现方法是,:当查询到电路中有按键按下时,先不进行处理,而是先执行,10,20ms,的延时程序,延时程序结束后,再次查询按键状态,,若此时按键仍为按下状态,则视为按键被按下。,键盘扫描方式及相关程序,three,1,查询方式键盘扫描程序,【,例,9,-1】,这里按独立连接式键盘连接图的按键连接方式编写了查询方式的按键扫描程序。,程序如下,ORG0000H,LJMPMAIN,ORG0030H,MAIN:,JNBP1.0,KEY_0;,判断与,P1.0,相接的按键是否被按下,JNBP1.1,KEY_1;,判断与,P1.1,相接的按键是否被按下,JNBP1.2,KEY_2;,判断与,P1.
4、2,相接的按键是否被按下,JNBP1.3,KEY_3;,判断与,P1.3,相接的按键是否被按下,LJMPMAIN;,继续查询,KEY_1:,LCALLDL_20MS;,调用延时子程序,去除机械抖动,JB,P1.0,MAIN;,去除抖动后,再次确认按键是否被按下,LCALLPRO_1;,若键按下,调用按键,1,的处理程序,LJMPMAIN;,执行结束,返回查寻循环,KEY_2:,LCALLDL_20MS;,同上,JBP1.1,MAIN,LCALLPRO_2,LJMPMAIN,PRO_1:;,按键,1,的处理程序,RET,PRO_2:;,按键,2,的处理程序,RET,DL_20MS:;20,毫秒延
5、时子程序,RET,END,2,中断方式键盘扫描程序,除了查询方式,中断方式也常用于,键盘扫描,。硬件连接如图所示。,P1,口,8,个,I/O,信号经过与非门,74LS30,实现逻辑与非后,再经过非门,74LS04,反相,然后接至,MCS-51,的,INT0,引脚上。在中断服务程序中,,先延时,20ms,消除键抖动,再对各键进行查询,找到所按键,并转到相应的处理程序中去,。,【,例,9,-2】,中断方式下的键盘扫描程序,ORG0000H,LJMPMAIN,ORG0003H;,外部中断,0,中断服务入口地址,LJMPINT0;,转中断服务,ORG0100H,MAIN:,MOVP1,#0FFH;P1
6、,口做输入时,先送,1,SETBEA;,开总中断允许,SETBEX0;,开,INT0,中断,SETBIT0;,下降沿有效,;,主程序其余部分,;,INT0:,LCALLDL_20MS;,延时去抖动,MOVA,P1;,读,P1,口各引脚,CJNEA,#0FFH,,,CLOSE;,验证是否确实有键闭合,AJMPEXIT;,无键按下(按键时间过短)则退出中断,CLOSE:,JNBACC.0,KEY_0;,查询,0,号键,JNBACC.1,KEY_1;,查询,1,号键,JNBACC.2,KEY_2;,查询,2,号键,JNBACC.3,KEY_3;,查询,3,号键,JNBACC.4,KEY_4;,查询,
7、4,号键,JNBACC.5,KEY_5;,查询,5,号键,JNBACC.6,KEY_6;,查询,6,号键,JNBACC.7,KEY_7;,查询,7,号键,EXIT:,RETI,KEY_0:;1,号键处理程序,RETI,;,其他键处理程序,KEY_7:,RETI,;,DL_20MS:,RET,END,任务,2,矩阵式,键盘的接口,设计,与,编程,矩阵式键盘接口设计,基于行反转法,one,4,4,矩阵式键盘接口设计如图所示,图中,P1,口,的低,4,位作为行线,,,P2,口,的,低,4,位作为列线,。行线通过,74LS21,进行逻辑与操作后作为单片机的外部中断源输入,当有键按下时以中断形式去执行相
8、应的按键处理程序。,行反转法,因,判键时将输入与输出线反转互换,而得名,步骤如下:,1,首先将行线(,P1,)设为输入线,初值全为,1,,列线(,P2,)设为输出线,初值全为,0,。,2,若有按键被按下,将进入中断处理程序,通过读取,P1,端口值,确定按键所在行。接下来,,P2,设为输入线,值为全,1,,,P1,设为输出线,将原数据写入,P1,,读取,P2,,判断按键所在列。,3,将第一步读的值与第二步读的值进行运算,得到按键的特征值。,【,例,9,-3】,行反转法判断按键编号,并存入,40H,单元,程序如下,ORG0000H,LJMPMAIN,ORG0003H;,外部中断,0,中断服务入口地
9、址,LJMPINT0;,转中断服务,ORG0100H,MAIN:,MOVP1,0FFH,MOVP2,00H,;,主程序其余部分,;,INT0:,LCALLDL_20MS;,延时去抖动,MOVA,P1;,读,P1,ANLA,#0FH;,判断是否有键闭合,提示,由于,P1,的输出为高电平,,P2,的输出为低电平,故此,若按下某键,则,P1,相应输入引脚被拉低为低电平。,CJNEA,#0FH,TEST;,若有键闭合,转判断按键程序,RETI;,若无键闭合,返回,TEST:;,按键处理程序,MOVB,A;,暂存,LCALLKEYR;,调用读取子程序,结果保存在,R3,中(行号),MOV40H,R3;,
10、暂存在,40H,单元,MOVP2,#0FFH;P2,写,1,MOVP1,B;,在,P1,中写入原数据,MOVA,P2;,读,P2,LCALLKEYR;,调用读取子程序,结果保存在,R3,中(列号),XCHA,R3;,交换,A,与,R3,中数据,SWAPA;,将,A,的高四位与第四位交换,ORL40H,A;,将按键特征值存入,40H,(高四位为列号,第四位为行号),RETI,;,KEYR:,CJNEA,#0FEH,TESTP11;,测试,P1.0,MOVR3,#0;P1.0=0,,说明被按键的输入线为,P1.0,LJMPFINISH;,返回,TESTP11:,CJNEA,#0FDH,TESTP1
11、2;,测试,P1.1,MOVR3,#1,LJMPFINISH,TESTP12:,CJNEA,#0FBH,TESTP13;,测试,P1.2,MOVR3,#2,LJMPFINISH,TESTP13:,CJNEA,#0F7H,FINISH;,测试,P1.3,MOVR3,#3,FINISH:,RET,;,DL_20MS:,RET,END,矩阵式键盘接口设计,基于扫描法,two,这里通过,8255A,连接一个,4,8,的矩阵键盘,,PB,口的低四位连接行线,,8255A,的,PA,口连接列线,,如图所示。,扫描法,是指,在判定按键时,通过逐行逐列进行扫描,。例如,如果按行进行扫描,首先将列的全部输出设为
12、高电平,行线的输出信号中总有一行为低电平,其余为高电平。如果某按键被按下,且按键所在行的输出信号为低电平,那么,列输出信号被拉低为低电平,即读取列值时该列的值为,0,。那么,,通过输出的行值和读入的列值就可以确定被按键的行列值,。,扫描法具体分析如下:,PB,口作为扫描口需要设为输出,,PA,口设为读入,。,逐行扫描时,,PB,口的状态为:,PB7,PB6,PB5,PB4,PB3,PB2,PB1,PB0,1,1,1,1,1,1,1,0,(,FEH,),1,1,1,1,1,1,0,1,(,FDH,),1,1,1,1,1,0,1,1,(,FBH,),1,1,1,1,0,1,1,1,(,F7H,),
13、PB,口作为扫描口需要设为输出,,PA,口设为读入,。,逐行扫描时,,PB,口的状态为:,PB7,PB6,PB5,PB4,PB3,PB2,PB1,PB0,1,1,1,1,1,1,1,0,(,FEH,),1,1,1,1,1,1,0,1,(,FDH,),1,1,1,1,1,0,1,1,(,FBH,),1,1,1,1,0,1,1,1,(,F7H,),1,1,1,0,1,1,1,1,(,EFH,),1,1,0,1,1,1,1,1,(,DFH,),1,0,1,1,1,1,1,1,(,BFH,),0,1,1,1,1,1,1,1,(,7FH,),例如,若当前,PB,口的输出状态为,FEH,,查询输入口,PA
14、,的状态为,EFH,。那么我们可以确定是,PA0,与,PB4,相交位置的按键被按下,即,4,号键。根据图,3.11,中各键的编号情况,按键键码可按如下公式计算:,键码,=,行号,列总数,+,列号,【,例,9,-4】,利用扫描法判断按键,并将键码存入,40H,单元。,分析,8255A,的,PA,、,PB,口的控制字。,A,口设为基本输入方式,,B,口设为基本输出方式,那么方式控制字为,90H,。关于,8255A,方式控制字的设定一般放到主程序中进行,这里只有对扫描过程进行编程。,由矩阵式键盘接口设计图可知,,8255A,端口地址:,A,口为,7FFCH,,,B,口为,7FFDH,。,N,Y,结束
15、,逐行扫描,开始,是否有键按下?,存入键号,Y,调用延时子程序,是否有键按下?,找到按键?,Y,N,N,程序的流程图如图所示,:,扫描程序如下:,SCAN:,ACALLP_KEY;,调用“有无按键按下子程序”,JNZT_KEY;,若有键按下,进一步判断是否因抖动判错,AJMPSCAN;,若无键按下,则不断查询,;,T_KEY:,ACALLDL_20MS;,调用延时子程序,ACALLP_KEY;,再次调用“有无按键按下子程序”,JNZIN_SCAN;,若有键按下,则执行逐行扫描程序,AJMPSCAN;,若无键按下,则不断查询,;,IN_SCAN:,MOVR2,#0FEH;,将首次行扫描数据送,R
16、2,MOVR4,#00H;,将首行号送,R4,;,ST_SCAN:,MOVDPTR,#7FFDH;,将,PB,口地址送,DPTR,MOVA,R2;,将行扫描数据送,A,MOVX,DPTR,A;,将行扫描数据送,PB,口,DECDPTR;DPTR,指向,PA,口,MOVXA,DPTR;,读取,PA,口的值,;,PA_0:,JBAcc.0,PA_1;,判断是否是第,0,列有按键,MOVA,#00H;,若该列有按键,将列号送,A,AJMPLKP;,跳转至计算按键号程序,;,PA_1:,JBAcc.1,PA_2,MOVA,#01H,AJMPLKP,;,PA_2:,JBAcc.2,PA_3,MOVA,#
17、02H,AJMPLKP,;,PA_3:,JBAcc.3,PA_4,MOVA,#03H,AJMPLKP,;,PA_4:,JBAcc.4,PA_5,MOVA,#04H,AJMPLKP,;,PA_5:,JBAcc.5,PA_6,MOVA,#05H,AJMPLKP,;,PA_6:,JBAcc.6,PA_7,MOVA,#06H,AJMPLKP,;,PA_7:,JBAcc.7,NEXT;,若无按键按下,使用下一个行扫描值进行扫,MOVA,#07H,AJMPLKP,;,NEXT:,INCR4;,行号加,1,MOVA,R2,JNBAcc.3,SCAN;,判断行扫描是否结束。若结束,表示无键按下,RLA;,循环
18、左移一位,产生下一个行扫描值,MOVR2,A,AJMPST_SCAN;,继续扫描下一行,;,LKP:,MOVB,R4;,行号送,B,MOVR4,A;,列号送,R4,暂存,MOVA,8;,将列总数,8,送,A,MULAB;,计算键值,ADDA,R4,MOV40H,A;,将键值存入,40H,单元,RET,;,P_KEY:,MOVDPTR,#7FFDH;,将,PB,口地址送,DPTR,MOVA,#00H;,将全扫描字送,A,MOVX,DPTR,A;,将全扫描字送,PB,口,DECDPTR;,将,DPTR,指向,PA,口,MOVXA,DPTR;,读取,PA,口的状态,提示,如果,A,为全,1,,表示无键按下,否则,表示有键按下。,CPLA;,将,A,取反(,A=0,,则无键按下,否则相反),RET,;,DL_20MS:,RET,键盘接口设计与编程,项目总结,本项目主要介绍了,独立式键盘,和,矩阵式键盘,的使用方法。其中,任务一介绍了,独立式键盘的接口设计,、,抖动产生的原因以及查询和中断两种扫描方式,;任务二介绍了,矩阵式键盘的接口设计,、,行反转法以及扫描法两种判键方法,。,THANKS FOR WATCHING,谢谢收看,