您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 单片机实例之按键原理
课题三(实例)之按键任务一独立式按键控制的数码管显示任务二矩阵键盘数码管显示任务一独立式按键控制的数码管显示本任务是利用独立按键实现对数码进行控制,记录按键的次数,每当按下一次键时,计数器加1,将计数器的值送数码管显示,当计数器加到10时,则归零重新计数。设P0口连接按键,对Key1进行计数P1口连接数码管图6-2键盘控制原理图为了实现用按键控制LED的显示,首先要使单片机读入按键的状态,再根据键盘的状态去控制LED的亮灭。对LED的控制,在前面的课题中已经讲了,这里不再作重点讲解,仅仅作为一个键盘控制对象的例子。根据图6-2所示的硬件电路,每当按下按键时,单片机引脚P0.0将为低电平,程序运行时,需要检测P0.0引脚是否为低电平,若P0.0引脚为低电平,表示按键已按下。当每次按下按键时,则使P1口输出的数据变化一次,输出不同数据,对应的程序设计框图如图6-4所示。程序设计分析初始化计数器+1送显是否按下键否是图6-4键控计数显示流程图一、按键的特性作为机械按钮,键按下或者放开时,都存在着接通或断开的不稳定现象,从而使信号电平具有抖动现象,这种现象称为抖动。由于按键的抖动,使按键对应的输出电平若干个干扰脉冲,如图6-5所示。为了保证每按下一次按键,单片机程序只动作一次,就需要消除因按键的抖动现象而引起的错误动作,具体的处理方式分为硬件消除抖动和软件消除抖动,简称消抖。键盘电路原理抖动时间<10ms开关动作时间>100ms“1”“0”<10ms图6-5按键的波形二、硬件消抖图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为1;当键按下时,输出为0。此时即使因按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。硬件消抖动一般用于按键较少的情况。三、软件消抖如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。延时等待10ms仍有按键信号?Y有按键信号?NYN按键处理按键释放?NY图6-7软件消抖的流程图思考:为什么要等键释放?若不等会出现什么情况?1、C语言程序:#includereg51.HsbitP0_0=P0^0;unsignedcharcount;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voiddelay10ms(){unsignedchari,j;for(i=250;i0;i--)for(j=248;j0;j--);}voidmain(void){while(1){if(P0_0==0){delay10ms();if(P0_0==0){count++;if(count==10)count=0;while(P0_0==0);P1=table[count];}}}}练习:编写程序使得K0按下时显示1,K7按下时显示8,无键按下时显示0,有多键按下时显示P。89S51P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0abcdefgdpcom+5V100ΩP3.0P3.1P3.2P3.3P3.4P3.5P3.6P3.7K0K1K2K3K4K5K6K7共阳极任务二获取矩阵键盘的键值本任务目标是用矩阵键盘控制LED实现一个矩阵键盘的按键值。编写程序使得P0显示按键的行号,P2口显示按键的列号。89S51P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7abcdefgdpcom+5V共阳极P2.7P2.6P2.5P2.4P2.2P2.1P2.0abcdefgdpcom100Ω×2P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.70123456789ABCDEFE+5V5.1K×4键号L0L1L2L3P2.3C0C2C1C3行首号在单片机程序中,对多个键的处理应包括以下三项内容:键输入检查键盘是否有键被按下,并消除按键抖动。键译码(扫描法或反转法)即获取是哪个键按下,得到按键的行号,和列号;有时还需计算键码(每个按键编号,对于4*4的矩阵按键,键码共16个为[0,15])。键结束即检查按键是否抬起,这样使得一次按键只做一次处理。键处理根据键码执行不同按键处理程序段。一、键盘处理检查键盘是否有键被按下,并消除按键抖动。代码flag=0;P1=0x0F;//高四位是列线输出0,低四位是行线读入前写1if(P1&0x0F!=0x0F){delay();if(P1&0x0F!=0x0F)flag=1;}键输入扫描键盘行列式键盘的具体识别方法有扫描法和反转法。扫描法即用列线输出,行线输入(可交换行线和列线的输入、输出关系)。其中,列线逐列输出0,某行有键按下,行线有0输入,若无按键,行线输入全部为1。当有键按下时,根据行线和列线可最终确定哪个按键被按下。反转法行线和列线交换输入、输出,分两步获取按键的键号,但是在多键同时按下时不能准确判断。键译码代码获取行号temp=0;P1=0x0F;//低四位输入输入前写1//列为高四位低电平输出temp=P1;//读P1口temp=(~temp&0x0F);//屏蔽高四位switch(temp){case1:row=0;break;//p1.0被拉低case2:row=1;break;//p1.1被拉低case4:row=2;break;//p1.2被拉低case8:row=3;break;//p1.3被拉低default:row=16;//多个按键被按下,或无键按下}键译码——反转法代码获取列号P1=0xF0;//列高四位输入,输入前写1//行为低四位,低电平输出temp=P1;//读P1口temp=(~(temp4)&0x0F);switch(temp){case1:col=0;break;//p1.4被拉低case2:col=1;break;//p1.5被拉低case4:col=2;break;//p1.6被拉低case8:col=3;break;//p1.7被拉低default:col=16;//多个按键被按下,或无键按下}计算键值key=row*4+col;键译码——反转法代码获取列号(row,col)ucharcodescan[4]={0xEF,0xDF,0xBF,0x7F};for(i=0;i4;i++){P1=scan[i];//低四位输入扫描第0列,p1.4为低电平temp=P1;//读P1口temp=~(temp&0x0F);//屏蔽高四位if(temp==1)//p1.0被拉低row=0,col=I,break;elseif(temp==2)//p1.1被拉低row=1,col=i,break;elseif(temp==4)//p1.2被拉低row=2,col=i,break;elseif(temp==8)//p1.3被拉低row=3,col=i,break;elserow=16,col=16;//多个按键被按下,或无键按下}计算键值key=键译码——扫描法即检查按键是否抬起,这样使得一次按键只做一次处理。代码flag=0;P1=0x0F;if(P1&0x0F!=0){delay();if(P1&0x0F!=0)flag=1;}键结束根据键码执行不同按键处理程序段。代码unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};P0=table[row];P2=table[col];键处理主程序while(1){if(有键按下){键译码等待键结束键处理}}练习:编写程序使得P0显示键码的十位,P2口显示键码的个位。89S51P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7abcdefgdpcom+5V共阳极P2.7P2.6P2.5P2.4P2.2P2.1P2.0abcdefgdpcom100Ω×2P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.70123456789ABCDEFE+5V5.1K×4键号L0L1L2L3P2.3C0C2C1C3行首号任务三简易计算器本任务目标是用矩阵键盘控制数码管实现一个简易计算器。图4-7简易计算器的电路原理图在单片机程序中,对多个键的处理应包括以下三项内容:键输入检查键盘是否有键被按下,并消除按键抖动,获得或规定(单个按键)按键的键号。可以用动态显示函数代替消抖用的延时函数。键译码即获取是哪个键按下,用键值给各个按键编号,对于4*4的矩阵按键,键值共16个为[0,15]。可将键值分配为:数字键0~9、功能键0AH~0FH,是按键在物理位置上的人为规定数值。键结束键处理根据键值执行不同程序段。如:若键值属于数字,则调用显示数字子程序;若键值属于功能键,则进行多分支转移,执行各个功能程序段。键盘处理初始化有键按下?是否处理?有键按下?延时消抖(调用动态显示函数)调用键盘处理函数进行具体处理并置处理标志调用动态显示函数清处理标志没有已处理没有图4-10带动态显示的键盘消抖程序框图作业:编写程序用一个数码管静态显示矩阵按键的键码[0~F]。分别用扫描法、反转法实现键码识别。编写程序用两个数码管动态显示矩阵按键的键码[00~15]的十位和个位。
本文标题:单片机实例之按键原理
链接地址:https://www.777doc.com/doc-3557661 .html