1、课题三(实例) 之按键,任务一 独立式按键控制的数码管显示任务二 矩阵键盘数码管显示,任务一 独立式按键控制的数码管显示,本任务是利用独立按键实现对数码进行控制,记录按键的次数,每当按下一次键时,计数器加1,将计数器的值送数码管显示,当计数器加到10时,则归零重新计数 。设P0口连接按键,对Key1进行计数P1口连接数码管,图6-2 键盘控制原理图,为了实现用按键控制LED的显示,首先要使单片机读入按键的状态,再根据键盘的状态去控制LED的亮灭。对LED的控制,在前面的课题中已经讲了,这里不再作重点讲解,仅仅作为一个键盘控制对象的例子。根据图6-2所示的硬件电路,每当按下按键时,单片机引脚P0
2、.0将为低电平,程序运行时,需要检测P0.0引脚是否为低电平,若P0.0引脚为低电平,表示按键已按下。当每次按下按键时,则使P1口输出的数据变化一次,输出不同数据,对应的程序设计框图如图6-4所示。,程序设计分析,一、按键的特性作为机械按钮,键按下或者放开时,都存在着接通或断开的不稳定现象,从而使信号电平具有抖动现象,这种现象称为抖动。由于按键的抖动,使按键对应的输出电平若干个干扰脉冲,如图6-5所示。为了保证每按下一次按键,单片机程序只动作一次,就需要消除因按键的抖动现象而引起的错误动作,具体的处理方式分为硬件消除抖动和软件消除抖动,简称消抖。,键盘电路原理,二、 硬件消抖图中两个“与非”门
3、构成一个RS触发器。当按键未按下时,输出为1;当键按下时,输出为0。此时即使因按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。,硬件消抖动一般用于按键较少的情况。,三、软件消抖如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms10ms的延时,待后沿抖动消失后才能转入
4、该键的处理程序。,思考:为什么要等键释放?若不等会出现什么情况?,1、C语言程序: #include sbit P0_0=P00; unsigned char count; unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; void delay10ms() unsigned char i,j;for(i=250;i0;i-)for(j=248;j0;j-); ,void main(void) while(1) if(P0_0=0) delay10ms();if(P0_0=0) count+;i
5、f(count=10) count=0; while(P0_0=0); P1=tablecount; ,2、汇编程序 ORG 00h START: MOV R1,#00H ;初始化R1为0, REL: JB P0.3,REL ;判断SP1是否按下LCALL DELAY ;若按下,则延时10ms左右JB P0.3,REL ;再判断SP1是否真得按下MOV A,R1MOV DPTR,#TABLEMOVC A,A+DPTRMOV P1,AINC R1JNB P0.3,$ ;等待SP1释放CJNE R1,#10,REL,SJMP START ;继续对K1按键扫描 DELAY: MOV R6,#20 ;
6、延时10ms子程序 L1: MOV R7,#248DJNZ R7,$DJNZ R6,L1RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DHDB 7DH,07H,7FH,6FHEND,练习:编写程序使得K0按下时显示1,K7按下时显示8,无键按下时显示0,有多键按下时显示P。,任务二 获取矩阵键盘的键值,本任务目标是用矩阵键盘控制LED实现一个矩阵键盘的按键值。,编写程序使得P0显示按键的行号,P2口显示按键的列号。,在单片机程序中,对多个键的处理应包括以下三项内容:键输入 检查键盘是否有键被按下,并消除按键抖动。 键译码(扫描法或反转法) 即获取是哪个键按下,得到按键的
7、行号,和列号;有时还需计算键码(每个按键编号,对于4*4的矩阵按键,键码共16个为0,15)。 键结束 即检查按键是否抬起,这样使得一次按键只做一次处理。 键处理 根据键码执行不同按键处理程序段。,一、键盘处理,检查键盘是否有键被按下,并消除按键抖动。代码 flag=0; P1=0x0F; /高四位是列线输出0,低四位是行线读入前写1 if(P1 ,键输入,扫描键盘行列式键盘的具体识别方法有扫描法和反转法。 扫描法 即用列线输出,行线输入(可交换行线和列线的输入、输出关系)。其中,列线逐列输出0,某行有键按下,行线有0输入,若无按键,行线输入全部为1。当有键按下时,根据行线和列线可最终确定哪个
8、按键被按下。 反转法 行线和列线交换输入、输出,分两步获取按键的键号,但是在多键同时按下时不能准确判断。,键译码,代码 获取行号temp = 0;P1=0x0F; /低四位输入 输入前写1/列为高四位 低电平输出temp=P1; /读P1口 temp=(temp /多个按键被按下,或无键按下,键译码反转法,代码 获取列号 P1=0xF0; /列高四位输入,输入前写1/ 行为低四位,低电平输出temp=P1; /读P1口 temp= (temp4) ,键译码反转法,代码 获取列号(row,col) uchar code scan4=0xEF,0xDF,0xBF,0x7F;for(i=0;i4;i
9、+)P1= scani; /低四位输入 扫描第0列,p1.4为低电平temp=P1; /读P1口 temp= (temp / 多个按键被按下,或无键按下 计算键值 key=,键译码扫描法,即检查按键是否抬起,这样使得一次按键只做一次处理。代码 flag=0; P1=0x0F; if(P1 ,键结束,根据键码执行不同按键处理程序段。代码 unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;P0= tablerow; P2= tablecol;,键处理,主程序,while(1) if(有键按下) 键译
10、码 等待键结束 键处理 ,练习:编写程序使得P0显示键码的十位,P2口显示键码的个位。,任务三 简易计算器,本任务目标是用矩阵键盘控制数码管实现一个简易计算器。,图4-7 简易计算器的电路原理图,在单片机程序中,对多个键的处理应包括以下三项内容:键输入检查键盘是否有键被按下,并消除按键抖动,获得或规定(单个按键)按键的键号。可以用动态显示函数代替消抖用的延时函数。 键译码即获取是哪个键按下,用键值给各个按键编号,对于4*4的矩阵按键,键值共16个为0,15。可将键值分配为:数字键09、功能键0AH0FH,是按键在物理位置上的人为规定数值。 键结束 键处理根据键值执行不同程序段。如:若键值属于数字,则调用显示数字子程序;若键值属于功能键,则进行多分支转移,执行各个功能程序段。,键盘处理,图4-10 带动态显示的键盘消抖程序框图,作业:,编写程序用一个数码管静态显示矩阵按键的键码0F。分别用扫描法、反转法实现键码识别。编写程序用两个数码管动态显示矩阵按键的键码0015的十位和个位。,