<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 比較好的按鍵處理方法以及實(shí)例

比較好的按鍵處理方法以及實(shí)例

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò ) 收藏
按鍵是單片機最常用的輸入設備了。按下接通,松開(kāi)分斷,本來(lái)是 很簡(jiǎn)單的事情,由于現在我們使用的單片機實(shí)在是一個(gè)非常高速的裝置,由于它的高速,使得本來(lái)不被人們重視的機械觸點(diǎn)在接通和斷開(kāi)瞬間的多次快速彈跳問(wèn)題變 得突出起來(lái)。常規的方法就是一旦發(fā)現按鍵動(dòng)作,就人為加上10-20毫秒的延時(shí),等觸點(diǎn)穩定下來(lái)以后再進(jìn)行(例如判斷按鍵碼)。同時(shí)為了不至于把 一次按鍵當做多次按鍵,通常就是等待按鍵確實(shí)釋放以后再執行鍵碼對應的程序。詳細過(guò)程參見(jiàn)版主的“事無(wú)巨細,獨立按鍵”文。
延時(shí)法簡(jiǎn)單實(shí)用,編程也容易,使用非常普遍。
但是這個(gè)辦法有些缺點(diǎn),1是加上延時(shí)后,在延時(shí)期間單片機什么也沒(méi)干,就在那里兜圈子耗時(shí)間,如果這時(shí)有其他事情需要處理也只好放一放,降低了運行 效率。2是對一些需要較復雜按鍵功能的情況例如區別長(cháng)按鍵和短按鍵難于實(shí)現。
那么其他的辦法是有,例如中斷法,不按鍵就不查詢(xún),直到按鍵觸發(fā)外部中斷。但是單片機通常外部中斷口很少而按鍵較多,給應用造成不便。
下面就介紹一個(gè)新的按鍵查詢(xún)方法:狀態(tài)機法。說(shuō)明如下:
1,給按鍵設定3種狀態(tài):狀態(tài)0:無(wú)按鍵,狀態(tài)1:已經(jīng)按下,狀態(tài)2:已經(jīng)釋放。按鍵可以一直處于狀態(tài)0,也可以由狀態(tài)0轉為狀態(tài)1,也可以由狀態(tài)1轉為 狀態(tài)2,然后恢復到狀態(tài)0。如此順序循環(huán)。
2,通過(guò)定時(shí)(例如定時(shí)器中斷)每隔一段時(shí)間(例如10毫秒)檢查一下按鍵 狀態(tài),根據上次檢查的狀態(tài)和當前的狀態(tài)比較,來(lái)確定應該做什么。在上述時(shí)間間隔內,單片機就可以執行其他任務(wù)。一旦確認按鍵成立,就可以立即找出鍵碼并進(jìn) 行隨后的鍵碼處理程序而無(wú)需等待按鍵釋放,加上適當的處置也可以對比較復雜的按鍵進(jìn)行處理。
下面以一個(gè)具體的程序,詳細解釋怎么實(shí)現:讀鍵函數readkey()。無(wú)參數,返回鍵碼。4個(gè)按鍵連接在PC0...PC3引腳
///////////////////////定時(shí)器溢出中斷用于定時(shí)查鍵 大約10毫秒中斷一次
keyscan_t=0; //////這個(gè)全局變量是個(gè)定時(shí)器標志,定時(shí)中斷置1,外部請0
ISR(TIMER0_OVF_vect)
{
TCNT0=216; ////程序啟動(dòng)后設TCCR0=0X04;256分頻,每(256-216)*256微秒中斷一次
keyscan_t=1; ////定時(shí)時(shí)間到標志置1
PORTD=dispdata; ////其它刷新顯示功能和理無(wú)關(guān)
}

////////////////////////////////////
讀鍵函數
////////////////////////////////////
uchar readkey(void)
{
uchar keyval=0;//////keyvai是最終鍵碼,4個(gè)按鍵分別對應的鍵碼是0x0e,0x0d,0x0b,0x07
uchar newkey; ////////newkey是當前鍵碼,需要和上次鍵碼比較
static uchar keystate=0; ////狀態(tài)值,起始為0,注意它是靜態(tài)變量賦值后就保持到改寫(xiě)為止
uchar keyOK; /////////確認按鍵
static uchar lastkey; /////lastkey記錄上次檢查時(shí)的鍵碼,也是靜態(tài)變量
newkey=PINC&0X0F; /////鍵碼就是PC口低4位取值每次都要讀取
switch(keystate) //////按照狀態(tài)值進(jìn)行不同的處理,單片機啟動(dòng)后總是狀態(tài)0,
{
case 0: /////狀態(tài)0
if(newkey!=0x0f) //////如果有鍵
{
keystate=1; //////有鍵記下?tīng)顟B(tài)1
lastkey=newkey; /////有鍵就用當前鍵碼代替原來(lái)鍵碼等待下次檢查
}
break; //////如果無(wú)鍵直接跳出,有鍵進(jìn)行上述處理后跳出,注意有鍵狀態(tài)值已變
case 1: ///////如上次有鍵,這次就轉到狀態(tài)1
if(newkey==lastkey) /////這次讀取的鍵值如果和上次記錄的一樣,就是確認按鍵了
{
keyOK=1; //////置位按鍵標志
keyval=newkey; /////取得鍵碼
keystate=2; //////按鍵狀態(tài)下次要轉狀態(tài)2
}
else //////如果讀鍵和上次不同,不確認按鍵,除了不進(jìn)行以上處理還要把狀態(tài)值情0
keystate=0;
break; .///////跳出
case 2: /////////狀態(tài)2
if(newkey==0x0f) ///////如果10毫秒后仍然無(wú)鍵
keystate=0; //////下次回到狀態(tài)0
break;
}
return keyval; ////////返回鍵碼
}
////////////////////////////////

以上就是在調頻收音機里使用的獲取鍵碼程序。每10余毫秒定時(shí)中斷一次就執行一次。

本文引用地址:http://dyxdggzs.com/article/201611/321129.htm


關(guān)鍵詞: 按鍵處

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>