1、第第8章章 键盘控制键盘控制LED灯、数码管灯、数码管8.1 功能要求功能要求8.2 任务分析任务分析 8.3 键盘接口技术键盘接口技术8.3.1 键盘工作特性键盘工作特性8.3.2 独立式键盘接口电路独立式键盘接口电路8.3.3 8.3.3 矩阵式键盘接口电路矩阵式键盘接口电路8.4 键盘接口程序设计键盘接口程序设计8.4.1 本项目使用的键盘接口本项目使用的键盘接口8.4.2 独立式键盘控制独立式键盘控制LED灯灯8.4.3 矩阵式键盘控制数码管矩阵式键盘控制数码管8.1功能要求功能要求 一基本要求一基本要求能用独立式键盘控制LED灯。二发挥部分二发挥部分能用矩阵式键盘输入数据和命令,当键
2、入数字键时,数码管显示相应数字,当输入功能键时,完成相应的功能。回目录回目录 8.2 任务分析任务分析 要完成此任务,主要需解决如下四方面的问题:要完成此任务,主要需解决如下四方面的问题:1.为什么要软件延时去抖动;2.独立式和矩阵式键盘接口电路的设计方法;3.独立式和矩阵式键盘程序的设计方法。回目录回目录8.3.1 8.3.1 键盘工作特性键盘工作特性 键盘是一组按键的组合,它是单片机最常用的输入设备,单片机中的键盘一般通过按键开关自己设计焊接,当然也可到厂家定制,如图81 c)所示。本节主要讲解通过按键开关自己设计键盘的方法,根据按键开关与单片机接口的连接方式,可以分为独立式键盘和矩阵式键
3、盘。8.3 键盘接口技术键盘接口技术回目录回目录按键开关介绍按键开关介绍 单片机中的键盘通常由按键开关组成,按键开关的外形和参数如下图所示,它是一种常开型按键开关,为了便于安装固定,它有四个管脚,其管脚说明如下图中的文字所示,在常态时开关触点(1和2)处于断开状态,只有按下按键时开关触点才闭合短路,所以可以用万用表检测开关的管脚排列、好坏和质量。回目录回目录按键闭合、断开时的抖动按键闭合、断开时的抖动 回目录回目录在单片机中,按键通常与I/O端口相连,如下图左边所示。当按键开关K1未按下时,P1.0输入为高电平,而当按键K1闭合时,P1.0输入为低电平,由于开关为机械弹性开关,当机械触点断开、
4、闭合时,由于机械触点的弹性作用,一个机械开关闭合时不会马上稳定的闭合接通,断开时也不会马上断开,而是在闭合、断开的瞬间伴随有一连串的抖动,如下图右边所示,抖动时间的长短与开关的机械特性决定,一般为510ms。AT89C51R12KK1VCCP1.0前沿抖动后沿抖动闭合稳定键按下键释放理想波形实际波形P1.0输入的高低电平高低电平阀值按键抖动消除办法按键抖动消除办法 按键抖动是一种普遍的现象,如电流较大的电器开关闭合时,我们有时可以见到电火花,按键抖动将形成干扰和造成误动作。如上页图所示,抖动将造成I/O端口输入的高低电平多次变化,使单片机系统误动作,一次按键产生多次按键效果,因此必须采取措施消
5、除。按键抖动消除可以采用硬件和软件方法消除,硬件去抖动电路如RS触发器等,由于硬件去抖动电路需要额外的硬件电路,使产品成本增加,硬件电路复杂,所以一般应用较少。在单片机中广泛采用的是软件延时去抖动,由图84可知,按键闭合时存在前沿抖动,一般时间为510ms,因此我们可在按键按下后,延时10ms左右避开前沿抖动,然后再判断按键是否按下,即P1.0是否仍为低电平,如果仍为低电平,此时才确认为一次完整有效的按键闭合,否则认为只是抖动或干扰,系统对此不作出响应。8.3.2 独立式键盘接口电路独立式键盘接口电路独立式键盘的结构如下图所示,组成键盘的各按键相互独立,每个按键独立地与一个I/O端口相连,结构
6、简单,其中图左图适合于端口内部有上拉电阻的端口,如P1、P2、P3口,所以外部不用上拉电阻,电路更简单,成本更低。右图适合于端口内部没有上拉电阻地端口,如P0口,所以外部必须使用上拉电阻,成本稍高,所以一般尽量使用左图的形式。AT89C51K1P1.0K2K3K4P1.1P1.2P1.3AT89C51K1P0.0K2K3K4P0.1P0.2P0.3R12KR22KR32KR42KVCC8.3.3 矩阵式键盘接口电路矩阵式键盘接口电路 独立式键盘虽然硬件、软件结构简单,但在按键数量较多的情况下,将占有较多的I/O端口,所以在按键数量较多的情况下,一般采用可以有效减少I/O端口数量的矩阵式键盘。矩
7、阵式键盘又称为行列式键盘,采用行、列线结构,按键设置在行列线的交叉点上,如下图所示,H0H3为四条行线,L0L3为四条列线,在行列相交的每个交点上通过按键来连通,按键开关的一个触点连行线,一个触点连列线,从而组成44矩阵16键键盘 AT89C51K1P1.0K2K3K4P1.1P1.2P1.3K5K6K7K8K9K10K11K12K13K14K15K16P1.4P1.5P1.6P1.7H0H1H2H3L0L1L2L3回目录回目录2独立式和矩阵式键盘比较独立式和矩阵式键盘比较独立式键盘硬件结构简单,软件编程较简单,但每个按键独自占用一个I/O端口,在按键数量较多的情况下,将占有较多的I/O端口。
8、所以,独立式键盘一般运用于按键数量不多的场合。矩阵式键盘能有效的减少I/O端口的占用量,但因为各按键不是单独的占有I/O端口,从而给按键的判断带来难度,造成编程难度加大。84 键盘接口程序设计键盘接口程序设计 8.4.1 本项目使用的键盘接口本项目使用的键盘接口 本项目使用的键盘接口如下图所示,它是23的矩阵式键盘接口电路,我们选P2口的低五位作为矩阵式键盘的列线和行线,其中P2.3、P2.4作为矩阵式键盘的行线,P2.0、P2.1、P2.2作为矩阵式键盘的列线,选用六个按键主要是为了降低试验板成本和焊接的难度。R810KR710KVCCK1K4K2K3K5K6P2.0P2.1P2.2P2.3
9、P2.4回目录回目录8.4.2 8.4.2 独立式键盘控制独立式键盘控制LEDLED灯灯 本项目基本任务为利用独立式键盘控制LED灯,为了不增加试验板的成本,我们在上页图的矩阵式键盘电路中,将P2.0设置为低电平,相当于键盘K1、K4一端触点接地,从而使按键K1、K4相当于组成独立式键盘,等效电路如下图所示。回目录回目录A02A13A24A35A46A57A68A79B018B117B216B315B414B513B612B711E19DIR1U274LS245RP14708EA/VP31X119X218RESET9RD17WR16INT012INT113T014T115P101P112P12
10、3P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSEN29ALE/P30TXD11RXD10U1AT89C51K1K4D8D6D7D4D3D5D2D1VCC一、独立式键盘任务分析一、独立式键盘任务分析 本任务要求按下K1时,D1D8全亮,按下K4时,D1D8全灭。本任务的关键为设计独立式键盘的控制程序,它必须解决以下几个问题:(1)检测有无按键按下。先将各按键相连的I/O端口置为高电平1,然后检测各I/O端口是否仍全为高电平,如果不是,表明
11、有按键按下。(2)如果有键按下,运用软件去抖动在有键按下的情况下,延时10ms,再次检测是否有键按下,如果是,表明确实有键按下,否则表示只是干扰或抖动。(3)确认有键按下,暂存键值,等键释放这主要是为了保证一次按键仅执行一次按键功能,防止按住按键不放时,执行多次按键功能。(4)判断按键情况,执行相应的按键功能既如果按键K1按下,D1D8全亮,按键K4按下,D1D8全灭。二、独立式键盘程序流程图设计二、独立式键盘程序流程图设计 通过以上分析,独立式按键程序思路大致如下:(1 1)首先进行程序初始化。)首先进行程序初始化。P1.0清零,使开关K1、K4一端接低电平;置位P2.3、P2.4作为输入口
12、,同时使P2.3、P2.4输出高电平。(2 2)判断是否有键按下。)判断是否有键按下。读入P2.3、P2.4的状态,判断是否全为高电平1,否则表明有按键按下。(3 3)延时去抖动。)延时去抖动。延时10ms,再次读入P2.3、P2.4的状态,判断是否仍然有键按下,如果有,表明确实有键按下,否则表明只是抖动或干扰信号。(4 4)暂存当前按键状态,等待按键释放。)暂存当前按键状态,等待按键释放。在等待按键弹起的过程中,必须将前面的按键状态保存下来,以便后面取出判断具体的按键号。等待按键弹起的方法为延时一段时间,再次检测按键的状态,直到无键按下为止。二、独立式键盘程序流程图设计二、独立式键盘程序流程
13、图设计(5 5)判断具体按键号,执行相应的按键功能。)判断具体按键号,执行相应的按键功能。取出前面暂存的按键状态,并判断具体是那个按键按下,执行相应的功能,如果是P2.3为低电平,表明K1按下,置P1为低电平,D1D8全亮,如果是P2.4为低电平,表明K4按下,置P1为高电平,D1D8全灭。回目录回目录程序开始使开关一端为低电平将开关的输入端口置1调用按键子程序Y等按键弹起YP1置1,D1D8灭P1清零,D1D8亮K1按键子程序返回按键子程序开始K2判具体按键是否有键按下N延时去抖动,是否确实有键按下N三、独立式键盘程序清单三、独立式键盘程序清单(1)ORG 0000H LJMP MAIN O
14、RG 0050HMAIN:CLR P2.0 ;P2.0清0,使K1、K4一端触点接低电平 SETB P2.3 ;P2.3置1,作为输入口 SETB P2.4 ;P2.4置1,作为输入口MAINHUI:LCALL KEY ;调用按键处理子程序 LJMP MAINHUI ;反复执行 LJMP KEYHUI ;否则,表示没有键按下,键处理程序返回DYS:LCALL DELAY ;键去抖动,延时10ms左右 MOV A,P2 ;再次取出P2口状态 ANL A,#00011000B ;取出P2.3,P2.4位 CJNE A,#00011000B,DJTQ ;确认有键按下,跳到等待按键弹起 LJMP KE
15、YHUI ;无键按下,表明只是干扰或键抖动DJTQ:MOV R2,A ;暂存当前按键状态DENDAI:LCALL DELAY ;延时10ms,再次取出当前按键状态 MOV A,P2 ANL A,#00011000B ;取出P2.3,P2.4位 三、独立式键盘程序清单(三、独立式键盘程序清单(2)CJNE A,#00011000B,DENDAI ;按键没有弹起,继续等待 MOV A,R2 ;取出暂存在R2中的按键状态PJZ:JNB ACC.3,K1 ;ACC.3为0,表示K1按下,跳到K1处 JNB ACC.4,K4 ;ACC.4为0,表示K4按下,跳到K4处 LJMP KEYHUI ;如果K1
16、、K4都没按下,跳到键处理子程序返回 K1:MOV P1,#00H ;按键K1按下处理,D1D8全亮 LJMP KEYHUI ;跳到键处理子程序返回K4:MOV P1,#0FFH ;按键K4按下处理,D1D8全灭KEYHUI:RET ;键处理子程序返回 三、独立式键盘程序清单(三、独立式键盘程序清单(3)DELAY:;延时子程序 MOV R7,#0FH ;二层循环延时程序LOOP2:MOV R6,#0FFHLOOP1:DJNZ R6,LOOP1 DJNZ R7,LOOP2 RET三、独立式键盘程序清单(三、独立式键盘程序清单(4)8.4.3 矩阵式键盘控制数码管矩阵式键盘控制数码管 一、任务分
17、析一、任务分析本任务要求能用矩阵式键盘输入数据,当按下按键时,数码管显示相应的键值。矩阵式键盘接口电路图如下图所示。R810KR710KVCCK1K4K2K3K5K6P2.0P2.1P2.2P2.3P2.4与基本任务相比,这个任务的难度有所增加,本任务关键问题为具体键号的判断,既键的识别问题,对矩阵式按键的识别通常有二种方法,一种为常用的逐行(或列)扫描查询法,另一种为速度较快的反转法。回目录回目录二、逐行(或列)扫描查询法工作原理二、逐行(或列)扫描查询法工作原理(1)判断有无按键按下)判断有无按键按下 方法为将所有列线置为低电平“0”,所有行线置为高电平“1”,作为输入口,然后读入所有行线
18、的状态,如果行线全为高电平1,说明没有按键按下,否则说明有键按下(虽然暂时无法具体判断是哪个按键按下)。因为如果有按键按下,则按键所在的行、列线将短路,由于所有列线已经预置为低电平“0”,近似接地,则与该按键相连的行线必定被拉低为低电平“0”,所以由行线是否全为高电平“1”,就能判断是否有键按下。(2)按键延时去抖动)按键延时去抖动 在判断有按键按下后,为了去除按键机械抖动的影响,延时10ms左右再次检测是否仍有按键按下,判断方法和步骤(1)相同,如果仍有按键按下,表示确实有按键按下,否则表示只是干扰或抖动。提示 此处延时程序利用显示程序代替,主要是利用显示程序执行时间既实现延时,又显示数据,
19、防止显示间断。(3)判断按键列号,并暂存列值和行状态。)判断按键列号,并暂存列值和行状态。依次设置各列为低电平,读入行状态,如果将某一列设置为低电平0后,读入的行状态不全为高电平1,说明按下的按键在该列,将该列列值暂存起来,以便后面计算键值。同时将当前的行状态暂存起来,以便后面判断行号。(4)等待按键释放。)等待按键释放。将列值和行状态暂存下来后,将等待按键释放,以保证按键按下一次,只执行一次按键功能,本处的延时程序仍以显示程序代替,在延时的同时保证显示不间断。(5)判断按键行号。)判断按键行号。将暂存的行状态取出,依次判断按键在哪一行。方法为检测该行是否为低电平,如果是,表明按键在该行,并将
20、行值暂存下来。(6)计算键值。)计算键值。取出前面保存的列值、行值,利用如下公式计算键值:键值行值列数列值键值计算出来后,可以根据各按键要求,完成相应的按键功能。三、矩阵式按键逐行扫描程序流程图三、矩阵式按键逐行扫描程序流程图程序开始显示单元、键值、行值、列值单元清零键值送显示单元调用按键子程序调用显示子程序Y等按键弹起Y按键子程序返回按键子程序开始是否有键按下N延时去抖动,是否确实有键按下N判按键在哪一列,保存列值保存行状态取出行状态判断按键在哪一行,保存行值计算键值并保存程序中30H单元为显示缓冲区,保存需显示的数据,40H为键值暂存单元,41H为列值暂存单元,42H为行值暂存单元。ORG
21、 0000H LJMP MAIN ORG 0050HMAIN:MOV 30H,#00H ;显示缓冲区清0 MOV 40H,#00H ;键值暂存单元清0 MOV 41H,#00H ;列值暂存单元清0 MOV 42H,#00H ;行值暂存单元清0MAINHUI:LCALL KEY ;调用按键处理子程序 MOV 30H,40H ;将键值送显示缓冲单元显示 LCALL XIANSHI ;调用显示子程序 LJMP MAINHUI ;反复执行 三、矩阵式按键逐行扫描程序清单(三、矩阵式按键逐行扫描程序清单(1)KEY:;键处理子程序 MOV P2,#11111000B;将列线全设为0,行线全设为1,数码管
22、熄灭 MOV A,P2 ;P2口键盘状态送入累加器A ANL A,#00011000B ;取出P2.3,P2.4位,行线状态 CJNE A,#00011000B,DYS ;如果行线不全为1,表示有键按下,跳到键去抖动处理 LJMP KEYHUI ;无键按下,键处理子程序返回DYS:LCALL XIANSHI ;延时去抖动 MOV A,P2 ;P2口键盘状态送入累加器A ANL A,#00011000B ;取出P2.3,P2.4位,行线状态 CJNE A,#00011000B,PANLIE;如果行线不全为1,表示确实有键按下,跳去判断哪一列 LJMP KEYHUI ;无键按下,键处理子程序返回,
23、表示只是干扰或抖动 三、矩阵式按键逐行扫描程序清单(三、矩阵式按键逐行扫描程序清单(2 2)PANLIE:MOV P2,#11111110B ;将第0列设为0,判断是否第0列 MOV A,P2 ;P2口键盘状态送入累加器A ANL A,#00011000B ;取出P2.3,P2.4位,行线状态 CJNE A,#00011000B,LIE0;如果行线不全为1,表示该列有键按下,跳到LIE0处 MOV P2,#11111101B ;判断是否第1列 MOV A,P2 ;P2口键盘状态送入累加器A ANL A,#00011000B ;取出P2.3,P2.4位,行线状态 CJNE A,#00011000
24、B,LIE1;如果行线不全为1,表示该列有键按下,跳到LIE1处 MOV P2,#11111011B ;判断是否第2列 MOV A,P2 ANL A,#00011000B CJNE A,#00011000B,LIE2 LJMP KEYHUI ;所有列线无键按下,跳到键处理子程序返回 三、矩阵式按键逐行扫描程序清单(三、矩阵式按键逐行扫描程序清单(3 3)LIE0:MOV 41H,#00H ;保存列值0 MOV 42H,A ;保存行值,此时A中为行线的状态,暂存到42H单元 LJMP DENDAI ;跳到等待按键弹起LIE1:MOV 41H,#01H ;保存列值1 MOV 42H,A LJMP
25、DENDAILIE2:MOV 41H,#02H ;保存列值2 MOV 42H,A ;保存行状态DENDAI:LCALL XIANSHI ;等待按键弹起,在等待时调用显示程序作延时,防止按键按下时数码管熄灭 MOV P2,#11111000B;将列线全设为0,行线全设为1,数码管熄灭 MOV A,P2 ANL A,#00011000B CJNE A,#00011000B,DENDAI;行线不全为1,表面按键未弹起,继续等待 三、矩阵式按键逐行扫描程序清单(三、矩阵式按键逐行扫描程序清单(4 4)MOV A,42H ;取出保存的行状态,判具体是哪一行 JNB ACC.3,HANG0 JNB ACC
26、.4,HANG1 LJMP KEYHUIHANG0:MOV 42H,#00H ;第0行,42H单元送0 LJMP QJZ ;跳到求键值QJZ处HANG1:MOV 42H,#01H ;第1行,42H单元送1QJZ:MOV A,42H ;求出按键数值,键值行值列数列值 MOV B,#03H ;B中为列数 MUL AB ;行值列数 ADD A,41H ;加列值 MOV 40H,A ;将键值送40H单元暂存KEYHUI:RET ;键处理子程序返回 三、矩阵式按键逐行扫描程序清单(三、矩阵式按键逐行扫描程序清单(5 5)XIANSHI:;显示子程序 SETB P2.7 ;第二个数码管亮 CLR P2.6
27、 ;第一个数码管熄灭 MOV A,30H ;取出显示数据 ANL A,#0FH ;取出显示值的个位(即低四位)LCALL CHABIAO ;调用查表显示程序 LCALL DELAY ;调用延时程序 SETB P2.6 ;第二个数码管灭 CLR P2.7 ;第一个数码管熄亮 MOV A,30H ;取出显示数据 ANL A,#0F0H ;取出显示值的十位(即高四位)SWAP A ;高、低四位对调,以便于查表取段码 LCALL CHABIAO ;调用查表显示程序 LCALL DELAY ;调用延时程序 RET ;显示子程序返回 三、矩阵式按键逐行扫描程序清单(三、矩阵式按键逐行扫描程序清单(6 6)CHABIAO:;查表子程序 MOV DPTR,#TABLE1 ;DPTR用于保存表的首地址 (即到哪一个表中取数)MOVC A,A+DPTR ;查表指令,MOV P1,A ;将取得的段码送到P1口显示 RET ;查表子程序返回DELAY:;二层循环延时子程序 MOV R7,#0FH LOOP2:MOV R6,#0FFHLOOP1:DJNZ R6,LOOP1 DJNZ R7,LOOP2 RET ;延时子程序返回 TABLE1:DB 0COH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H 三、矩阵式按键逐行扫描程序清单(三、矩阵式按键逐行扫描程序清单(7 7)