獨(dú)立按鍵根據(jù)其擊鍵持續(xù)時(shí)間可分為短按和長(zhǎng)按。在一鍵多功能技術(shù)中,短按和長(zhǎng)按所實(shí)現(xiàn)的功能是不一樣的。如MP3播放器中的下一曲按扭,短按時(shí)執(zhí)行的功能是選擇下一曲,而長(zhǎng)按時(shí)則是當(dāng)前歌曲的快進(jìn)。一般將按鍵按下的時(shí)間小于1S以?xún)?nèi)的稱(chēng)為短按鍵,按鍵按下超過(guò)1S的稱(chēng)為長(zhǎng)按。大部分單片機(jī)中所講述的按鍵都屬于短按功能。本節(jié)通過(guò)按鍵短按功能講述獨(dú)立按鍵的檢測(cè)及軟件防抖動(dòng)的基本方法。如圖所示的實(shí)驗(yàn)電路中,其按鍵檢測(cè)程序代碼如下:
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; //定義按鍵檢測(cè)中間變量
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: //沒(méi)鍵按下 退出
break;
}
}
}
獨(dú)立按鍵檢測(cè)技術(shù)一般是通過(guò)檢測(cè)與按鍵相連的I/O口線的狀態(tài)。由圖可知當(dāng)按鍵按下時(shí),與其連接的I/O口線將向單片機(jī)系統(tǒng)輸入低(單片機(jī)讀取的值是0)。因此通過(guò)檢測(cè)I/O口是否有低輸入可判斷是否有按鍵按下。上述程序能夠檢測(cè)到按鍵按下,檢測(cè)不到按鍵釋放的,每次只能檢測(cè)到一個(gè)按鍵,同一時(shí)刻有兩個(gè)或以上的按鍵按下時(shí)按鍵無(wú)效(無(wú)按鍵按下)。而且沒(méi)有添加軟件去抖動(dòng)功能,但是它提供了一種按鍵檢測(cè)的基本思路。另外讀者還可通過(guò)條件判斷語(yǔ)句if來(lái)檢測(cè)按鍵的狀態(tài)。下面介紹一種具有軟件防抖動(dòng)功能,能檢測(cè)按鍵釋放、閉合的程序。其程序在結(jié)構(gòu)上可分為兩部分:主函數(shù)、防抖動(dòng)延時(shí)函數(shù)。
主函數(shù)通過(guò)switch語(yǔ)句檢測(cè)出被按下的按鍵,并執(zhí)行被按下按鍵的任務(wù)。當(dāng)檢測(cè)到按鍵按下后并沒(méi)有馬上執(zhí)行按鍵的任務(wù)而是延時(shí)10ms躲開(kāi)按鍵機(jī)械抖動(dòng)(如果此時(shí)立即執(zhí)行按鍵功能,可能是誤動(dòng)作,因?yàn)橛锌赡苁峭饨绺蓴_引起瞬間起與按鍵相連的I/O口線為低電平)。然后再檢測(cè)按鍵是否還處在閉合狀態(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); //延時(shí)去抖動(dòng)
if(!SW1) //再次確認(rèn)SW1閉合
{
LED0=!LED0 ; //執(zhí)行SW1按下的功能
while(!SW1); //等待按鍵釋放
delay(5); //延時(shí)去抖動(dòng)
}
break;
case 0x1D: //判斷是不是SW2閉合
delay(10); //延時(shí)去抖動(dòng)
if(!SW2) //再次確認(rèn)SW2是否閉合
{
LED1=!LED1 ; //執(zhí)行SW2按下的功能
while(!SW2); //等待按鍵釋放
delay(5); //延時(shí)去抖動(dòng)
}
break;
case 0x1B: //判斷是不是SW3閉合
delay(10); //延時(shí)去抖動(dòng)
if(!SW3) //再次確認(rèn)SW3是否閉合
{
LED2=!LED2 ; //執(zhí)行SW3按下的功能
while(!SW3); //等待按鍵釋放
delay(5); //延時(shí)去抖動(dòng)
}
break;
case 0x17: //判斷是不是SW4閉合
delay(10); //延時(shí)去抖動(dòng)
if(!SW4) //再次確認(rèn)SW4是否閉合
{
LED3=!LED3 ; //執(zhí)行SW4按下的功能
while(!SW4); //等待按鍵釋放
delay(5); //延時(shí)去抖動(dòng)
}
break;
case 0x0F: //判斷是不是SW5閉合
delay(10); //延時(shí)去抖動(dòng)
if(!SW5) //再次確認(rèn)SW5是否閉合
{
LED4=!LED4 ; //執(zhí)行SW5按下的功能
while(!SW5) //等待按鍵釋放
delay(5); //延時(shí)去抖動(dòng)
}
break;
default: //沒(méi)鍵按下 退出
break;
}
}
}
-
單片機(jī)
+關(guān)注
關(guān)注
6023文章
44376瀏覽量
628297 -
Switch
+關(guān)注
關(guān)注
1文章
532瀏覽量
57924 -
檢測(cè)技術(shù)
+關(guān)注
關(guān)注
2文章
348瀏覽量
29014 -
獨(dú)立按鍵
+關(guān)注
關(guān)注
1文章
45瀏覽量
11519 -
按鍵檢測(cè)
+關(guān)注
關(guān)注
0文章
22瀏覽量
4812
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論