按鍵消抖原理
一、首先來回顧一下按鍵延時消抖
按鍵由於是機械結構,按下的時候難免產生抖動,一般抖動會在按下的時候與鬆開的時候產生,抖動時間大概是10ms
於是針對按鍵抖動就有了延時消抖的一種簡單的解決方法:
二、按鍵消抖代碼
方法一: 按下按鍵損耗的時間取決於按下按鍵到鬆開的時間,至少10ms,按下按鍵後CPU不再執行其他指令,直到按鍵鬆開,應用能力弱
void main(void)
{
while(1)
{
if(key==0) //讀P1.0引腳,如果引腳爲低電平,則進入if
{
delay_ms(10); //延時10ms消抖
if(key==0) //再次判斷按鍵是否按下,防止干擾,增強穩定
{
led = !led;//led狀態改變
while(key==0);//等待按鍵鬆開,防止往下執行
}
}
}
}
方法二: 按下按鍵損耗的時間大約10ms,鬆開按鍵時損耗10ms,累計20ms,按下按鍵期間可以進行其他操作,應用能力較強
void main(void)
{
int status=0; //按鍵標誌位
while(1)
{
if(status==1 && key==1) //判斷按鍵是否鬆開
{
delay_ms(10); //延時消抖
if(key==1 && status==1) //再次判斷,排除是外界雜波干擾
{
status=0; //更改標誌防止循環執行判斷鬆開程序
}
}
if(key==0 && status==0)//判斷按鍵是否按下
{
delay_ms(10);//延時消抖
if(key==0 && status==0) //再次判斷,排除是鬆開狀態或外界雜波干擾
{
status=1;//防止循環執行按鍵控制程序
led=!led;
}
}
}
}
可以看到,延時消抖最大的弊端就是有延時,至少要消耗10ms~20ms的時間,對於我們來說10ms或許很短,但對於一些高性能的MCU來說,那就是能執行幾萬條指令的時間
按鍵定時器消抖
一、按鍵消抖
按鍵消抖一般分爲4步:
1、判斷按鍵是否按下
2、消抖
3、再次判斷按鍵是否按下
4、等待按鍵鬆開
二、定時器消抖原理
1、判斷按鍵是否按下,
2、若檢測到有按鍵按下,則開啓定時器,開啓定時中斷,定時時間爲10ms 左右,使得按鍵按下10ms後進入定時中斷,進入中斷的時候按鍵抖動時間已過
3、在定時器中斷中再次判斷按鍵是否按下
4、關閉定時器,等待按鍵鬆開
代碼:
#include <reg51.h>
sbit key=P1^0; //定義key爲P1.0
sbit led=P2^0; //定義LED爲P2.0
void main(void)
{
TMOD|=0X01;//選擇爲定時器0模式,工作方式1,僅用TR0打開啓動。
TH0=(65536-10000)/256; //給定時器賦初值,定時10ms
TL0=(65536-10000)%256;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=0;//關閉定時器
while(1)
{
if(key==0) //讀P1.0引腳,如果引腳爲低電平,則進入if
{
TR0=1;//打開定時器
}
}
}
/*定時器中斷*/
void Timer0() interrupt 1
{
TH0=(65536-10000)/256; //給定時器賦初值,定時10ms
TL0=(65536-10000)%256;
TR0=0;//關閉定時器
if(key==0) //再次判斷按鍵是否按下
{
led=!led;
while(key==0); //等待按鍵鬆開
}
}