獨(dú)立按鍵根據(jù)其擊鍵持續(xù)時間可分為短按和長按。在一鍵多功能技術(shù)中,短按和長按所實現(xiàn)的功能是不一樣的。如MP3播放器中的下一曲按扭,短按時執(zhí)行的功能是選擇下一曲,而長按時則是當(dāng)前歌曲的快進(jìn)。一般將按鍵按下的時間小于1S以內(nèi)的稱為短按鍵,按鍵按下超過1S的稱為長按。大部分單片機(jī)中所講述的按鍵都屬于短按功能。本節(jié)通過按鍵短按功能講述獨(dú)立按鍵的檢測及軟件防抖動的基本方法。如圖所示的實驗電路中,其按鍵檢測程序代碼如下:
sbit LED0=P1^0; //定義LED0為P1.0口
sbit LED1=P1^1; //定義LED1為P1.1口
sbit LED2=P1^2; //定義LED2為P1.2口
sbit LED3=P1^3; //定義LED3為P1.3口
sbit LED4=P1^4; //定義LED4為P1.4口
void main(void)
{
unsigned char SW; //定義按鍵檢測中間變量
while(1)
{
SW=P2&0x1F; //屏蔽P2口高3位
switch(SW)
{
case 0x1E:
LED0=0 ; //執(zhí)行SW1按下的功能
break;
case 0x1D:
LED1=0 ; //執(zhí)行SW2按下的功能
break;
case 0x1B:
LED2=0 ; //執(zhí)行SW3按下的功能
break;
case 0x17:
LED3=0 ; //執(zhí)行SW4按下的功能
break;
case 0x0F:
LED4=0 ; //執(zhí)行SW5按下的功能
break;
default: //沒鍵按下 退出
break;
}
}
}
獨(dú)立按鍵檢測技術(shù)一般是通過檢測與按鍵相連的I/O口線的狀態(tài)。由圖可知當(dāng)按鍵按下時,與其連接的I/O口線將向單片機(jī)系統(tǒng)輸入低(單片機(jī)讀取的值是0)。因此通過檢測I/O口是否有低輸入可判斷是否有按鍵按下。上述程序能夠檢測到按鍵按下,檢測不到按鍵釋放的,每次只能檢測到一個按鍵,同一時刻有兩個或以上的按鍵按下時按鍵無效(無按鍵按下)。而且沒有添加軟件去抖動功能,但是它提供了一種按鍵檢測的基本思路。另外讀者還可通過條件判斷語句if來檢測按鍵的狀態(tài)。下面介紹一種具有軟件防抖動功能,能檢測按鍵釋放、閉合的程序。其程序在結(jié)構(gòu)上可分為兩部分:主函數(shù)、防抖動延時函數(shù)。
主函數(shù)通過switch語句檢測出被按下的按鍵,并執(zhí)行被按下按鍵的任務(wù)。當(dāng)檢測到按鍵按下后并沒有馬上執(zhí)行按鍵的任務(wù)而是延時10ms躲開按鍵機(jī)械抖動(如果此時立即執(zhí)行按鍵功能,可能是誤動作,因為有可能是外界干擾引起瞬間起與按鍵相連的I/O口線為低電平)。然后再檢測按鍵是否還處在閉合狀態(tài),如果仍然處在閉合狀態(tài),則執(zhí)行按鍵的任務(wù)。反之則退出。其程序代碼如下:
sbit SW1=P2^0; //定義SW1為P2.0口
sbit SW2=P2^1; //定義SW1為P2.1口
sbit SW3=P2^2; //定義SW1為P2.2口
sbit SW4=P2^3; //定義SW1為P2.3口
sbit SW5=P2^4; //定義SW1為P2.4口
sbit LED0=P1^0; //定義LED0為P1.0口
sbit LED1=P1^1; //定義LED1為P1.1口
sbit LED2=P1^2; //定義LED2為P1.2口
sbit LED3=P1^3; //定義LED3為P1.3口
sbit LED4=P1^4; //定義LED4為P1.4口
void main(void)
{
unsigned char SW;
while(1)
{
SW=P2&0x1F; //屏蔽P2口高3位
switch(SW)
{
case 0x1E: //判斷是不是SW1閉合
delay(10); //延時去抖動
if(!SW1) //再次確認(rèn)SW1閉合
{
LED0=!LED0 ; //執(zhí)行SW1按下的功能
while(!SW1); //等待按鍵釋放
delay(5); //延時去抖動
}
break;
case 0x1D: //判斷是不是SW2閉合
delay(10); //延時去抖動
if(!SW2) //再次確認(rèn)SW2是否閉合
{
LED1=!LED1 ; //執(zhí)行SW2按下的功能
while(!SW2); //等待按鍵釋放
delay(5); //延時去抖動
}
break;
case 0x1B: //判斷是不是SW3閉合
delay(10); //延時去抖動
if(!SW3) //再次確認(rèn)SW3是否閉合
{
LED2=!LED2 ; //執(zhí)行SW3按下的功能
while(!SW3); //等待按鍵釋放
delay(5); //延時去抖動
}
break;
case 0x17: //判斷是不是SW4閉合
delay(10); //延時去抖動
if(!SW4) //再次確認(rèn)SW4是否閉合
{
LED3=!LED3 ; //執(zhí)行SW4按下的功能
while(!SW4); //等待按鍵釋放
delay(5); //延時去抖動
}
break;
case 0x0F: //判斷是不是SW5閉合
delay(10); //延時去抖動
if(!SW5) //再次確認(rèn)SW5是否閉合
{
LED4=!LED4 ; //執(zhí)行SW5按下的功能
while(!SW5) //等待按鍵釋放
delay(5); //延時去抖動
}
break;
default: //沒鍵按下 退出
break;
}
}
}
-
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635400 -
Switch
+關(guān)注
關(guān)注
1文章
533瀏覽量
58244 -
檢測技術(shù)
+關(guān)注
關(guān)注
2文章
355瀏覽量
29077 -
獨(dú)立按鍵
+關(guān)注
關(guān)注
1文章
45瀏覽量
11566 -
按鍵檢測
+關(guān)注
關(guān)注
0文章
23瀏覽量
4836
發(fā)布評論請先 登錄
相關(guān)推薦
評論