通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上圳袒膏缯稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
抖动时间抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒,大家可以用示波器测试一下。键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
消抖有硬件消抖和软件消抖,这里硬件消抖不做分析,如有兴趣可以查阅相关资料
这里主要讲的是软件消抖
分析思路:
IO口去读取数值,是否为0,当读取到0时,延时10ms,再次读取是否为0.当确实是0的时候,说明按键按下。检测是否按键松掉,执行语句
程序如下:
If(key==0)//按键按下
{
Delay_ms(10);//延时10ms
If(key==0)//确认按键按下
{
执行语句;//按照题目要求编写
}
While(!Key);//等待按键释放
}
那怎么用一个开关控制一个小灯的开和关呢?仿真图如下:
程序:
#include<reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
voiddelay_ms(uint);
sbitled0=P0^0;
sbitkey1=P3^2;
voidmain()
{
uchari;
while(1)
{
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
i++;
i=i%2;
switch(i)
{
case0:led0=1;break;//关小灯
case1:led0=0;break;//开小灯
default:break;
}
}
while(!key1);
}
}
}
voiddelay_ms(uintz)//延时子程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}