按鍵是非常常用的小外設,要麼配上外部中斷,要麼直接接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 狀態分為 空 若檢測到下降沿則跳到按下狀態 按下...