基礎操作之按鍵消抖

2021-08-20 21:50:03 字數 1653 閱讀 2740

機械彈性開關:

當機械觸點斷開、閉合時,由於機械觸點的彈性作用,乙個按鍵開關在閉合時不會馬上就穩定的接通,在斷開時也不會一下子徹底斷開,而是在閉合和斷開的瞬間伴隨了一連串的抖動;

當檢測到按鍵狀態變化時,不是立即去響應動作,而是先等待閉合或斷開穩定後再進行處理。即為按鍵消抖

按鍵消抖:可分為硬體消抖和軟體消抖。

硬體消抖就是在按鍵上併聯乙個電容,如圖 8-11 所示,利用電容的充放電特性來對抖動過程中產生的電壓毛刺進行平滑處理,從而實現消抖。

* 但實際應用中,這種方式的效果往往不是很好,而且還增加了成本和電路複雜度,所以實際中使用的並不多。絕大多數情況下,我們是用軟體即程式來實現消抖的

軟體消抖

(1):延時消抖

最簡單的消抖原理,就是當檢測到按鍵狀態變化後,先等待乙個 10ms 左右的延時時間,讓抖動消失後再進行一次按鍵狀態檢測,如果與剛才檢測到的狀態相同,就可以確認按鍵已經穩定的動作了

//按鍵處理函式 //輸入模式選擇:mode:0,不支援連續按;1,支援連續按

//返回按鍵值********************=  ;

//0,沒有任何按鍵按下

//1,key0按下

//2,key1按下

//3,key2按下

//4,wkup按下 wk_up

//注意此函式有響應優先順序,key0>key1>key2>wk_up!!

u8 key_scan(u8 mode)

else if(key0==1&&key1==1&&key2==1&&wk_up==0)

key_up=1;

return 0;// 無按鍵按下

}

(2):利用定時器消抖

舉個例子:我們啟用乙個定時中斷,每 2ms 進一次中斷,掃瞄一次按鍵狀態並且儲存起來,連續掃瞄 8 次後,看看這連續 8 次的按鍵狀態是否是一致的。8 次按鍵的時間大概是 16ms,這 16ms 內如果按鍵狀態一直保持一致,那就可以確定現在按鍵處於穩定的階段,而非處於抖動的階段,如圖 8-12:

/* t0 中斷服務函式,用於按鍵狀態的掃瞄並消抖 */

void interrupttimer0() interrupt 1

else if (keybuf == 0xff)

else

{} //其它情況則說明按鍵狀態尚未穩定,則不對 keysta 變數值進行更新

}

利用之前的例子修改

u8 key_scan(u8 mode)

}else if(key0==1&&key1==1&&key2==1&&wk_up==0)

key_up=1;

return 0;// 無按鍵按下

FPGA之按鍵消抖

按鍵是一種常用的人機互動輸入介面,對於機械按鍵來說,在按下或彈起的時候,按鍵輸入值往往伴隨著輸入抖動。消除抖動的方式有很多種,以下是用fpga實現按鍵消抖。實現原理 當檢測到按鍵按下 一般按下為低電平 時開始計時 用計數器實現 大概10ms後檢測按鍵狀態,如果按鍵狀態為低電平,說明按鍵按下,輸出低電...

FPGA Verilog按鍵消抖

硬體 鋯石a4開發板,altera ep4ce10f17c8 語言 verilog hdl 原理 機械式按鍵大概有20ms的抖動,所以檢測到按鍵變化後等20ms再判斷一次,如果鍵值相同才視為有效 頂級模組按鍵切換led顯示 module key led,key,clock,reset input c...

FPGA 按鍵消抖

今天簡單的說說按鍵消抖,原理特別好理解,其實就是延時,做一定時間的延時後取值一次,就能夠得到特定的消抖後的狀態了。為什麼要消抖?見圖 我們可以看到,但按鍵按下的那一刻,存在一段時間的抖動,同時在釋放按鍵的一段時間裡也是存在抖動的,這就可能導致狀態在識別的時候可能檢測為多次的按鍵,因為執行過程中普通的...