单片机零基础入门(7):解决独立按键抖动的问题
一、按键抖动的原因
按键抖动的原因,如图所示:
如图所示,按键抖动在第一段和第三段这个过程中发生的,最大抖动时长(5-10ms)+(5-10ms)。
二、解决按键抖动的问题:
1、 分析,问题来源:
先判断一个按键是否按下,如图所示,按键抖动在第一段和第三段这个过程中发生的,最大抖动时长(5-10ms)+(5-10ms)。
那么,延时对应的时长既可解决此问题。
2、源代码
(1)按键消抖代码:
/*1、延时函数*/
void Delay20ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
/*2、消抖代码--------*/
int main()
{
if(P3_1 == 0) //按键1按下
{
Delay20ms(20); //延时20ms是为了消抖
//检查按键是否松开
while(P3_1 ==0);
Delay20ms(20);
.....
}
return 0;
}
(2)按键消抖应用代码:
假设现在需要按下按键1,点亮LED1,松开LED1灭。代码如下:
/*1、延时函数*/
void Delay20ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
/*2、消抖代码--------*/
int main()
{
if(P3_1 == 1) //检测按键按下
{
Delay20ms(20); //延时20ms是为了消抖
//检查按键是否按下
while(P3_1 ==1);
Delay20ms(20);
/*1个LED灯亮为:0111 1111*/
P2=0x01; //点亮1个LED灯
}
else if(P3_1 == 0) //检测按键松开
{
Delay20ms(20);
while(P3_1 ==0); //检测按键是否松开
Delay20ms(20);
P2=0XFF;
}
return 0;
}
-----------------人生在勤,不索何获!-------------