簡易按鍵消抖(使用ADC,短按 長按)

2021-09-28 22:36:01 字數 1191 閱讀 7860

按鍵是非常常用的小外設,要麼配上外部中斷,要麼直接接i/o口掃瞄狀態,我這邊因為埠不夠就用了adc功能。

先講短按

每個按鍵對應不同的電壓值,沒有按鍵按下時adc輸入通道接的是5v,按下之後我設計了以下幾種情況:

1.sw1 0v

2.sw2 2.5v

3.sw3 3.3v

4.sw4 3.8v

理論上配置完adc模組,開啟adc轉換,在每次adc轉換完成觸發中斷的時候就可以根據採集值確認按鍵是哪個了。

但是存在乙個問題,比如說我按下esc鍵,電壓下降是乙個過程,如果它下降到3.3v的時候一次採集就完成,那採集的值不就錯了嗎。

所以需要消抖,我這裡消抖的方式是這樣:

關於短按:

1.設定乙個大小為2的陣列key[2]

2.key[0]用於存最新的值,key[1]用於快取上一次的值

3.如果有鍵按下,如果key[0]和key[1]之間的差值(無論哪個大)大於100(這個數可根據不同的adc取樣的精度自己調整),則代表按鍵並不穩定

4.將key[1]的值更新為key[0],等待下一次中斷

5.直到key[1]和key[0]的差值小於100,代表按鍵穩定,可進行按鍵狀態判斷(此處置乙個狀態穩定flag)

6.等到按鍵鬆開時進行keystatus按鍵狀態的修改

關於長按:

我在sw2這個按鍵上做了簡單的長按功能

1.設定乙個keylong做累加統計,乙個keylong_flag作為進入長按狀態的標誌

2.當採集值穩定在sw2的範圍時(不必等檢測到按鍵鬆開)keylong++

3.當keylong的值大於設定(比如500)且keylong_flag==0(第一次進入長按)時,keystatus切換為sw2,並且將keylong清零,keylong_flag=1

4.第二次進入長按時,可將keylong的比較值設定小一些,讓長按帶來的效果切換更好一些

5.一旦按鍵鬆開,將keylong和keylong_flag清零

具體**如下:

這個是從我自己寫的專案中摘抄的部分,本來還有一些處理,但是和這個內容無關就刪去了

FPGA Verilog按鍵消抖

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

FPGA 按鍵消抖

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

按鍵消抖 有感

假設按鍵一般在20ms之內可以穩定,但是極端情況,抖動時間在50ms wire nedge 下降沿。按鍵按下 wire pedge 上公升沿,按鍵按回 assign nedge key a key b assign pedge key a key b 狀態分為 空 若檢測到下降沿則跳到按下狀態 按下...