|
按鍵在電路中是很重要的一個器件。我們與單片機交流中用的最多的一種方式,通過按鍵可以控制LED燈的亮滅,擋位的切換,開關(guān)機操作等等?傊,按鍵在我們單片機學(xué)習(xí)中是不可或缺的。
談到按鍵,最重要的當(dāng)然是按鍵的消抖。在我們的電路中,按鍵通常是接上拉電阻,在按鍵沒有被按下的時候,電路是處于高電平的狀態(tài);當(dāng)按鍵被按下的時候,電路處于低電平的狀態(tài),此時確定按鍵就被按下。但是,當(dāng)按鍵被按下的瞬間,會處于電平不穩(wěn)定,這種不穩(wěn)定可能會導(dǎo)致單片機多次檢測到低電平,這樣就會觸發(fā)多次控制,這種狀態(tài)不是我們想要的結(jié)果。那么,消抖是由為重要的。最常用的消抖方法是利用延時的方法來濾除抖動部分。一般在50ms就足夠了。
//按鍵控制LED燈亮滅
#define LED_ON 13
#define LED_OFF 13
#define KEY_PIN 2
#define uint8_t unsigned char
#define uint16_t unsigned int
uint8_t bitShortClick=0; //按鍵短按標(biāo)志
uint8_t bitLock=0; //按鍵自鎖標(biāo)志
uint8_t u8cnt=0; //按鍵延時時間計時
uint8_t ledsta=0;
void setup() {
// put your setup code here, to run once:
pinMode(13,OUTPUT);
pinMode(KEY_PIN,INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
key_scan();
key_service();
led_ctr();
}
void key_scan()
{
int val=digitalRead(KEY_PIN);
if(val==HIGH)
{
u8cnt=0;
bitLock=0;
}
else if(bitLock==0)
{
u8cnt++;
if(u8cnt>50) //這里沒用延時,但相當(dāng)于延時,按下超過50次才確認按下
{
bitLock=1; //按鍵自鎖標(biāo)志,按鍵松開自動清零
bitShortClick=1; //按鍵短按觸發(fā),調(diào)用完及時清零,防止一直觸發(fā),切記
}
}
}
void key_service()
{
if(bitShortClick==1)
{
bitShortClick=0;
if(ledsta==0)
{
ledsta=1;
}
else
{
ledsta=0;
}
}
}
void led_ctr()
{
switch(ledsta)
{
case 0:
digitalWrite(LED_OFF,LOW);
break;
case 1:
digitalWrite(LED_ON,HIGH);
break;
}
}
|
評分
-
查看全部評分
|