1、第7章 单片机接技术 实训7 简易秒表的制作 7.1 单片机与键盘接 7.2 单片机与显示器接 7.3 D/A转换器接 7.4 A/D转换器接,返回主目录,实训7 简易秒表的制作,1实训目的 (1) 利用单片机定时器中断和定时器计数方式实现秒、分定时。 (2) 通过LED显示程序的调整,熟悉8155与8051,8155与LED的接口技术,熟悉LED动态显示的控制过程。 (3) 通过键盘程序的调整,熟悉8155与矩阵式键盘的接口技术,熟悉键盘扫描原理。 (4) 通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示、键盘扫描和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧
2、。,2实训设备与器件 (1) 实训设备:单片机开发系统、微机。 (2) 实训器件:实训电路板1套。 3. 实训步骤与要求 (1) 要求:利用实训电路板,以8位LED右边2位显示秒,左边6位显示0,实现秒表计时显示;以44矩阵键盘的KE0、KE1、KE2等3键分别实现启动、停止、清零等功能。 (2) 方法:用单片机定时器0中断方式,实现1 s定时;利用单片机定时器1方式2计数,实现60 s计数。用动态显示方式实现秒表计时显示,用键盘扫描方式取得KE0、KE1、KE2的键值,用键盘处理程序实现秒表的启动、停止、清零等功能。,(3) 实验线路分析:采用实训电路板,其原理图参见附录1。8位LED显示的
3、位码由8155的A口输出,段码由8155的B口输出。B口线与LED之间接有200限流电阻。LED为共阴极数码管,LED显示方式为动态显示方式。44矩阵键盘的行线经5.1 k电阻上拉后与8155 C口的PC0PC3口线相连,列线与8155 A口的PA0PA3口线相连。8155的控制口地址为4400H,A口地址为4401H,B口地址为4402H,C口地址为4403H。系统本采用11.0592 MHz的晶振,本实训应改为12 MHz晶振,以方便定时。 (4) 软件设计:软件整体设计思路是以键盘扫描和键盘处理作为主程序,LED动态显示作为子程序。二者间的联系是:主程序查询有无按键,无按键时,调用一次L
4、ED动态显示,子程序(约延时8 ms)后再回到按键查询状态,不断循环;有按键时,LED动态显示子程序作为按键防抖延时被连续调用二次(约延时16 ms),待按键处理程序执行完后,再回到按键查询状态,同时兼顾了按键扫描取值的准确性和LED动态显示的稳定性。秒定时采用定时器0中断方式进行,60 s计数由定时器1采用方式3完成,中断及计数的开启与关闭受控于按键处理程序。由上述设计思路可设计出软件流程图如图7.1所示。,图7.1 简易秒表软件流程图之1,图7.1 简易秒表软件流程图之2,图7.1 简易秒表软件流程图之3,(5) 程序编制:编程时置KE0键为“启动”,置KE1键为“停止”,置KE2键为“清
5、零”。因按键较少,在处理按键值时未采用散转指令“JMP”,而是采用条件转移指令“CJNE”。每条指令后紧跟着一条无条件跳转指令“AJMP”,转至相应的按键处理程序,如不是上述3个按键值则跳回按键查询状态。8位LED显示的数据由显示缓冲区30H37H单元中的数据决定,顺序是从左至右。动态显示时,每位显示持续时间为1 ms。1 ms延时由软件实现。8位显示约耗时8 ms。主程序、按键查询子程序采用第0组工作寄存器,显示子程序采用第1组工作寄存器。1 s定时采用定时器0方式1中断,每50 ms中断一次。用21H做50 ms计数单元,每20次为一个循环,计满20次,60 s计数单元(20H)计数1次。
6、60 s计数采用定时器1方式2计数,计数脉冲采用软件置位、复位P3.5口的方法实现。用20H单元做60 s计数单元,如定时器1溢出,则20H单元被清零。20H单元的数据采用十进制计数,该数据被拆成个位和十位两个数据后分别送至显示缓冲区的30H、31H单元。,按照上述思路可编制源程序如下:ORG0000H AJMPMAIN ORG000BH AJMPCONT;主程序;初始化程序MAIN:MOVTMOD,#61H ;置定时器0方式1定时,定时器1方式2计数 MOVTH0,#3CH;定时器0置初值 MOVTL0,#0B0H MOVTH1,#0C4H;定时器1置初值,MOVTL1,#0C4H MOV
7、DPTR,#4400H ;8155控制口地址送DPTR MOV A,#43H ;设置8155工作方式字 MOVX DPTR,A ;设置A、B口输出,C口输入 MOV 20H,#00H;60 s计数单元置初值 MOV 21H,#14H ;50 ms计数单元置初值 MOV SP,#3FH;堆栈指针置初值 MOV R2,#08H;LED待显示位数送R2 MOV R0,#30H ;显示缓冲区首址送R0,STAR:MOV R0,#00H;显示缓冲区清零 INC R0 DJNZ R2,STAR CLRA;累加器清零;键盘查询程序 KEY: ACALLKS;调按键查询子程序判断是否有键按下 JNZK1;有键
8、按下转移 ACALLDISP;无键按下,调显示子程序延时 AJMPKEY;继续查询按键;键盘扫描程序,K1:ACALLDISP;键盘去抖延时 ACALLDISP ACALLKS;再次判别是否有键按下 JNZK2;有键按下转移 AJMP KEY;无按键,误读,继续查询按键 K2:MOVR3,#0FEH;首列扫描字送R3 MOVR4,#00H;首列号送R4 K3:MOVDPTR,#4401H ;A口地址送DPTR,开始列扫描 MOVA,R3 MOVX DPTR,A;列扫描字送A口 INCDPTR;指向C口,INC DPTR MOVX A,DPTR;读取行扫描值 JB ACC.0,L1;第0行无键按
9、下,转查第1行 MOVA,#00H;第0行有键按下,行首键号送A AJMP LK;转求键号 L1: JB ACC.1,L2;第1行无键按下,转查第2行 MOVA,#08H ;第1行有键按下,行首键号送A AJMP LK;转求键号L2: JB ACC.2,L3;第2行无键按下,转查第3行 MOVA,#10H ;第2行有键按下,行首键号送A AJMPLK;转求键号,L3: JBA CC.3,NEXT ;第3行无键按下,转查下一列 MOV A,#18H ;第3行有键按下,行首键号送A AJMPLK LK: ADD A,R4 ;形成键码送A PUSHACC ;键码入栈保护 K4 ACALLDISP A
10、CALLKS ;等待键释放 JNZK4 ;未释放,等待 POP ACC ;键释放,弹栈送A AJMPPR ;转键盘处理程序,NEXT:INCR4;修改列号 MOVA,R3 JNBACC.3,KEY;4列扫描完,返回按键查询状态 RL A;未扫描完,改为下列扫描字 MOVR3,A;扫描字暂存R3 AJMPK3;转列扫描程序;键盘处理程序PR:CJNEA,#00H,PR01;不是KE0键码,转KE1键 AJMPKE0 ;转KE0键处理程序PR01: CJNEA,#01H,PR02;不是KE1键码,转KE2键,AJMPKE1 ;转KE1键处理程序PR02:CJNEA,#02H,PR03 ;不是KE2
11、键码,返回按键查询 AJMPKE2 ;转KE2键处理程序PR03:AJMPKEYKE0:SETBTR0 ;启动定时器0 SETBTR1 ;启动定时器1 SETBET0 ;允许定时器0中断 SETBEA ;开中断 AJMPKEY ;返回键盘查询状态,KE1:CLREA;关中断 CLRET0;禁止定时器0中断 CLRTR1;关定时器1 CLRTR0;关定时器0 AJMPKEYKE2:CLREA;关中断 AJMPMAIN;返回主程序进行初始化;按键查询子程序,KS:MOVDPTR,#4401H ;置8155 A口地址 MOVA,#00H MOVX DPTR,A ;全扫描字#00H送A口 INCDPT
12、R ;指向C口 INC DPTR MOVX A,DPTR ;读入C口状态 CPLA ;变正逻辑,高电平表示有键按下 ANLA,#0FH ;屏蔽高4位 RET ;返回,A0表示有键按;LED动态显示子程序,DISP:PUSHACC;A入栈保护 SETBRS0;保护第0组工作寄存器,启用第1组工作寄存器MOVR2,#08H;LED待显示位数送R2 MOVR1,#00H;设定显示时间 MOVR3,#7FH;选中最右端LED MOVR0,#30H;显示缓冲区首址送R0 MOVA,R0;秒显示个位送ADISP1: MOVDPTR,#TAB ;指向字形表首址 MOVC A,A+DPTR ;查表取得字形码
13、MOVDPTR,#4402H ;指向8155 B口(段码口),MOV DPTR,#4402H ;指向8155 B口(段码口) MOVX DPTR,A;字形码送B口 MOVA,R3;取位选字 MOVDPTR,#4401H;指向8155 A口(位选口) MOVXDPTR,A;位码送A口 DJNZR1,$;延时0.5 ms DJNZR1,$;延时0.5 ms RRA;位选字移位 MOVR3,A;移位后的位选字送R3,INCR0;指向下一位缓冲区地址 MOVA,R0;缓冲区数据送ADJNZR2,DISP1;未扫描完,继续循环 CLRRS0;恢复第0组工作寄存器 POPACC ;A弹栈,恢复现场 RET
14、TAB:DB3FH,06H,5BH,4FH,66H;共阴极LED字形表 DB6DH,7DH,07H,7FH,6FH,;定时器中断服务程序CONT:PUSH ACC;保护现场 MOV TH0,#3CH;定时器1重置初值 MOV TL0,#0B0H MOV A,20H;秒计数器送A AJMP CONT1REN:AJMP REN1CONT1:DJNZ21H,REN;1秒定时未到,中断返回 MOV21H,#14H;重置50 ms计数初值 CLRP3.5 ;软件产生定时器1计数脉冲,NOP NOP SETBP3.5 INCA;1 s计数值加1 DAA;换算为十进制计数 JBCTF1,CONT2;60 s
15、到,转清零CONT3:MOV20H,A;计数值送60 s计数单元20H ANLA,#0FH;屏蔽高4位 MOV30H,A;秒表个位待显示数据送显示缓冲区 MOVA,20H SWAPA;60 s计数单元高、低4位数据互换,ANLA,#0FH;屏蔽高4位 MOV31H,A ;秒表十位待显示数据送显示缓冲区 AJMPREN1CONT2:MOVA,#00H AJMPCONT3REN1:POPACC;恢复现场 RET;中断返回 END,4. 实训总结与分析 (1) 例5.4与本实训相比,二者均是秒表,但差别较大。前者采用发光二极管显示,后者采用七段码LED(俗称数码管)显示,后者显示更直观;前者计时采用
16、软件延时,后者采用定时器中断,后者更准确;前者功能单一,程序一旦开始运行,中间过程无法控制,后者功能齐全,可随时启动、停止、清零,后者智能化程度更高。综上所述,后者更实用。 (2) 设计、调试大型程序时,需先应根据要求划分模块,优化结构;再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用;接着根据各模块性质和功能将各模块细化,设计出程序流程图;最后才根据各模块流程图编制具体程序。调试时应先调主程序,实现最基本最主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。,本实训将整个程序划分为键盘程序、动态显示程序、秒计时程序三大模块,根据
17、各自的特点确定键盘程序为主程序,动态显示程序为子程序,秒计时程序为定时器中断服务程序。主程序又细分为初始化程序、键盘查询程序、键盘扫描程序和键盘处理程序4大部分。三大模块之间的关系是:键盘程序在无键按下时,不断调用动态显示子程序;在有键按下时,先调用动态显示子程序消抖,再进入键盘处理程序,控制中断服务程序的运行;处理完毕后,再不断调用动态显示子程序。经上述处理后,三大模块运行协调一致,既保持了动态显示的稳定性,又保持了键盘的可靠性,还保持了秒计时的准确性,较好地实现了全部功能。,(3) 本实训只用到实验线路板8位LED显示中的两位,44键盘16个按键中的3个,因此,其功能还有较大的扩展空间。只
18、要将上述程序稍加改动即可实现秒、分、时、日显示,并可作全方位修改的实时时钟。如增加LED显示位数或将显示改为LCD显示模块,可实现年、月、周、日、时、分、秒显示。,7.1 单片机与键盘接口 7.1.1 键盘工作原理 1按键的分类 按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。,按键按照接口原理可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现
19、键盘的定义与识别。 全编码键盘能够由硬件逻辑自动提供与键对应的编码,此外,一般还具有去抖动和多键、窜键保护电路。这种键盘使用方便,但需要较多的硬件,价格较贵,一般的单片机应用系统较少采用。非编码键盘只简单地提供行和列的矩阵,其它工作均由软件完成。由于其经济实用,较多地应用于单片机系统中。下面将重点介绍非编码键盘接口。,2键输入原理 在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入是与软件结构密切相关的过程。 对于一组键或一个键盘,总有一个接口电
20、路与CPU相连。CPU可以采用查询或中断方式了解有无将键输入,并检查是哪一个键按下,将该键号送入累加器ACC,然后通过跳转指令转入执行该键的功能程序,执行完后再返回主程序。,3按键结构与特点 微机键盘通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便与通用数字系统的逻辑电平相容。 机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图7.2所示,抖动时间的长短与开关的机械特性有关,一般为510 ms。,图7.2 按键触点的机械抖动,在触点抖动期间检测按键的
21、通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施。这一点可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。 在硬件上可采用在键输出端加R-S触发器(双稳态触发器)或单稳态触发器构成去抖动电路。图7.3是一种由R-S触发器构成的去抖动电路,当触发器一旦翻转,触点抖动不会对其产生任何影响。,图7.3 双稳态去抖电路,电路工作过程如下:按键未按下时,a = 0,b = 1,输出Q = 1。按键按下时,因按键的机械弹性作用的影响,使按键产生抖动。当开关没有
22、稳定到达b端时,因与非门2输出为0反馈到与非门1的输入端,封锁了与非门1,双稳态电路的状态不会改变,输出保持为1,输出Q不会产生抖动的波形。当开关稳定到达b端时,因a = 1,b = 0,使Q = 0,双稳态电路状态发生翻转。当释放按键时,在开关未稳定到达a端时,因Q = 0,封锁了与非门2,双稳态电路的状态不变,输出Q保持不变,消除了后沿的抖动波形。当开关稳定到达a端时,因a = 0,b = 0,使Q = 1,双稳态电路状态发生翻转,输出Q重新返回原状态。由此可见,键盘输出经双稳态电路之后,输出已变为规范的矩形方波。,软件上采取的措施是:在检测到有按键按下时,执行一个10 ms左右(具体时间
23、应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态。同理,在检测到该键释放后,也应采用相同的步骤进行确认,从而可消除抖动的影响。 4. 按键编码 一组按键或键盘都要通过I/O口线查询按键的开关状态。根据键盘结构的不同,采用不同的编码。无论有无编码,以及采用什么编码,最后都要转换成为与累加器中数值相对应的键值,以实现按键功能程序的跳转。,5. 编制键盘程序 一个完善的键盘控制程序应具备以下功能: (1) 检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。 (2) 有可靠的逻辑处理办法。每次只处理一个按键
24、,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。 (3) 准确输出按键值(或键号),以满足跳转指令要求。,7.1.2 独立式按键 单片机控制系统中,往往只需要几个功能键,此时,可采用独立式按键结构。 1. 独立式按键结构 独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图7.4所示。 独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。,图7.4 独立式按键电路,2. 独立式
25、按键的软件结构 独立式按键的软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。图7.4中的I/O口采用P1口,请读者自行编制相应的软件。,7.1.3 矩阵式按键 单片机系统中,若使用按键较多时,通常采用矩阵式(也称行列式)键盘。 1. 矩阵式键盘的结构及原理 矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上,其结构如图7.5所示。 由图可知,一个44的行、列结构可以构成一个含有16个按键的键盘,显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。,图7.5
26、矩阵式键盘结构,矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到5V上。当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。然而,矩阵键盘中的行线、列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,因此,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。,2. 矩阵式键盘按键的识别 识别按键的方法很多,其中,最常见的方法是扫描法。下面以图7.5中8号键的识别为例来说明扫描法识别按键的过程。 按键按下时,与此键相连的行线与列线导通,行线在无键按下
27、时处在高电平。显然,如果让所有的列线也处在高电平,那么,按键按下与否不会引起行线电平的变化,因此,必须使所有列线处在低电平。只有这样,当有键按下时,该键所在的行电平才会由高电平变为低电平。CPU根据行电平的变化,便能判定相应的行有键按下。8号键按下时,第2行一定为低电平。然而,第2行为低电平时,能否肯定是8号键按下呢?,回答是否定的,因为9、10、11号键按下,同样会使第2行为低电平。为进一步确定具体键,不能使所有列线在同一时刻都处在低电平,可在某一时刻只让一条列线处于低电平,其余列线均处于高电平,另一时刻,让下一列处在低电平,依此循环,这种依次轮流每次选通一列的工作方式称为键盘扫描。采用键盘
28、扫描后,再来观察8号键按下时的工作过程,当第0列处于低电平时,第2行处于低电平,而第1、2、3列处于低电平时,第2行却处在高电平,由此可判定按下的键应是第2行与第0列的交叉点,即8号键。,3. 键盘的编码 对于独立式按键键盘,因按键数量少,可根据实际需要灵活编码。对于矩阵式键盘,按键的位置由行号和列号惟一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,高4位是行号,低4位是列号。如图7.5中的8号键,它位于第2行,第0列,因此,其键盘编码应为20H。采用上述编码对于不同行的键离散性较大,不利于散转指令对按键进行处理。因此,可采用依次排列键号的方式对按排进行编码。以图7.5中
29、的44键盘为例,可将键号编码为:01H、02H、03H、0EH、0FH、10H等16个键号。编码相互转换可通过计算或查表的方法实现。,4. 键盘的工作方式 对键盘的响应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键操作,又不要过多占用CPU的工作时间。通常,键盘的工作方式有三种,即编程扫描、定时扫描和中断扫描。 1) 编程扫描方式 编程扫描方式是利用CPU完成其它工作的空余时间,调用键盘扫描子程序来响应键盘输入的要求。在执行键功能程序时,CPU不再响应键输入要求,直到CPU重新扫描键盘为止。,键盘扫描程序一般应包括以下内
30、容:(1) 判别有无键按下。(2) 键盘扫描取得闭合键的行、列值。(3) 用计算法或查表法得到键值。(4) 判断闭合键是否释放,如没释放则继续等待。(5) 将闭合键键号保存,同时转去执行该闭合键的功能。,图7.6是一个48矩阵键盘电路,由图可知,其与单片机的接口采用8155扩展I/O芯片,键盘采用编程扫描方式工作。8155C口的低4位输入行扫描信号,A口输出8位列扫描信号,二者均为低电平有效。8155的IO/ 与P2.0相连, 与P2.1相连, 、 分别与单片机的 、 相连。由此可确定8155的口地址为 命令/状态口:0100H(P2未用口线规定为0) A 口:0101H B口:0102H C
31、口:0103H,图7.6 8155扩展I/O口组成的矩阵键盘,图7.6中,A口为基本输出口,C口为基本输入口,因此,方式命令控制字应设置为43H。在编程扫描方式下,键盘扫描子程序应完成如下几个功能: (1) 判断有无键按下。其方法为:A口输出全为0,读C口状态,若PC0PC3全为1,则说明无键按下;若不全为1,则说明有键按下。 (2) 消除按键抖动的影响。其方法为:在判断有键按下后,用软件延时的方法延时10 ms后,再判断键盘状态,如果仍为有键按下状态,则认为有一个按键按下,否则当作按键抖动来处理,(3) 求按键位置。根据前述键盘扫描法,进行逐列置0扫描。图7.6中,32个键的键值分布如下(键
32、值由4位十六进制数码组成,前两位是列的值,即A口数据,后两位是行的值,即C口数据,X为任意值):FEXE FDXE FBXE F7XE EFXE DFXE BFXE7FXE FEXD FDXD FBXD F7XD EFXD DFXD BFXD 7FXD FEXB FDXB FBXB F7XB EFXB DFXB BFXB 7FXB FEX7 FDX7 FBX7 F7X7 EFX7 DFX7 BFX7 7FX7,按键键值确定后,即可确定按键位置。相应的键号可根据下述公式进行计算:键号=行首键号+列号。图7.6中,每行的行首可给以固定的编号0(00H),8(08H),16(10H),24(18H)
33、,列号依列线顺序为07。 (4) 判别闭合的键是否释放。按键闭合一次只能进行一次功能操作,因此,等按键释放后才能根据键号执行相应的功能键操作。 键盘扫描程序流程图请参阅图7.1中的主程序流程图。 键盘扫描程序请参阅实训7源程序中的键盘查询程序、键盘扫描程序和按键查询子程序三部分。,实训7是矩阵式键盘的一种典型应用,与图7.6相比,8155入口地址不同,矩阵键盘列数不同,再就是为兼顾键盘和显示,防抖所用的延时子程序由显示子程序替代。 2) 定时扫描方式 定时扫描方式就是每隔一段时间对键盘扫描一次,它利用单片机内部的定时器产生一定时间(例如10 ms)的定时,当定时时间到就产生定时器溢出中断。CP
34、U响应中断后对键盘进行扫描,并在有键按下时识别出该键,再执行该键的功能程序。定时扫描方式的硬件电路与编程扫描方式相同,程序流程图如图7.7所示。,图7.7 定时扫描方式程序流程图,图7.7中,标志1和标志2是在单片机内部RAM的位寻址区设置的两个标志位,标志1为去抖动标志位,标志2为识别完按键的标志位。初始化时将这两个标志位设置为0,执行中断服务程序时,首先判别有无键闭合,若无键闭合,将标志1和标志2置0后返回;若有键闭合,先检查标志1,当标志1为0时,说明还未进行去抖动处理,此时置位标志1,并中断返回。由于中断返回后要经过10 ms后才会再次中断,相当于延时了10 ms,因此,程序无须再延时
35、。,下次中断时,因标志1为1,CPU再检查标志2,如标志2为0说明还未进行按键的识别处理,这时,CPU先置位标志2,然后进行按键识别处理,再执行相应的按键功能子程序,最后,中断返回。如标志2已经为1,则说明此次按键已做过识别处理,只是还未释放按键。当按键释放后,在下一次中断服务程序中,标志1和标志2又重新置0,等待下一次按键。 3) 中断扫描方式 采用上述两种键盘扫描方式时,无论是否按键,CPU都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入,因此,CPU经常处于空扫描状态。,为提高CPU工作效率,可采用中断扫描工作方式。其工作过程如下:当无键按下时,CPU处理自己的工作,当有键
36、按下时,产生中断请求,CPU转去执行键盘扫描子程序,并识别键号。 图7.8是一种简易键盘接口电路,该键盘是由8051 P1口的高、低字节构成的44键盘。键盘的列线与P1口的高4位相连,键盘的行线与P1口的低4位相连,因此,P1.4P1.7是键输出线,P1.0P1.3是扫描输入线。图中的4输入与门用于产生按键中断,其输入端与各列线相连,再通过上拉电阻接至+5 V电源,输出端接至8051的外部中断输入端。,具体工作如下:当键盘无键按下时,与门各输入端均为高电平,保持输出端为高电平;当有键按下时,端为低电平,向CPU申请中断,若CPU开放外部中断,则会响应中断请求,转去执行键盘扫描子程序。,图7.8
37、 中断扫描键盘电路,7.2 单片机与显示器接口,7.2.1 LED显示和接口 常用的LED显示器有LED状态显示器(俗称发光二极管)、LED七段显示器(俗称数码管)和LED十六段显示器。发光二极管可显示两种状态,用于系统状态显示;数码管用于数字显示;LED十六段显示器用于字符显示。本节重点介绍LED七段显示器。 例7.1 用定时/计数器模拟生产线产品计件,以按键模拟产品检测,按一次键相当于产品计数一次。检测到的产品数送P1口显示,采用单只数码管显示,计满16次后从头开始,依次循环。系统采用12 MHz晶振。,图7.9 模拟生产线产品计件数码管显示电路,解:根据题意可设计出硬件电路如图7.9所示
38、。,其源程序可设计如下: ORG1000H MOVTMOD,#60H ;定时器1工作在方式2 MOVTH1,#0F0H ;定时器1置初值 MOVTL1,#0F0H SETBTR1 ;启动定时器1MAIN: MOVA,#00H ;计数显示初始化 MOVP1,#0C0H ;数码管显示0,DISP:JBP3.3,DISP;监测按键信号 ACALL DELAY;消抖延时 JB P3.3,DISP;确认低电平信号 DISP1:JNB P3.3,DISP1;监测按键信号 ACALL DELAY;消抖延时NB P3.3,DISP1;确认高电平信号CLRP3.5 ;T0引脚产生负跳变NOP NOP,SETBP3.5 ;T0引脚恢复高电平 INCA ;累加器加1MOVR1,A ;保存累加器计数值 ADDA,#08H ;变址调整 MOV CA,A+PC ;查表获取数码管显示值 MOVP1,A ;数码管显示查表值 MOVA,R1 ;恢复累加器计数值 JBC TF1,MAIN ;查询定时器1计数溢出 SJM P DISP ;16次不到继续计数,