1. 背景
1.1 機械按鍵硬件原理
機械按鍵是指在硬件電路中,通過機械按鍵開關實現電平信號的通斷來達到按鍵觸發的硬件組件,見圖1.1:

圖1.1
嵌入式等電子設計中,機械按鍵的檢測兩種方法:
● 掃描檢測:定時掃描IO口狀態
● 中斷檢測:啟用IO中斷
??此后的內容都是圍繞定時掃描IO口狀態的方式展開的。
1.2 機械按鍵抖動
1.2.1 抖動原因
由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上就穩定的接通,在斷開時也不會一下子徹底斷開,而是在閉合和斷開的瞬間伴隨了一連串的抖動。設按鍵時間為Ta,抖動時間Td,則Ta、Td的特性如下(見圖1.2.1):
● Ta≈100ms(最快50ms);
● Td≈10ms;

圖1.2.1
1.2.2 按鍵消抖
理想的按鍵波形是沒有抖動的,但實際的波形是有電平抖動的,對實際波形進行數字化抽象后會發現數字信號存在毛刺,見圖1.2.2:

圖1.2.2
為了消除電平信號的毛刺,目前工程上有兩種手段,硬件消抖和軟件消抖:
A. 硬件消抖
● 在硬件電路上和按鍵并聯濾波電容
B. 軟件消抖
● 延時確認:當檢測到按鍵狀態改變時,先延時20ms,再次檢測按鍵;
● 持續采樣:持續采集按鍵狀態,用數字狀態機邏輯來判斷按鍵動作。
硬件消抖需要增加元器件,增加項目成本,軟件消抖采用延時確認方式時,軟件程序需要延時等待,延時過程不能進行其他處理,對程序架構不太友好,而持續采樣不會對程序流程造成阻塞,后續對持續采樣方式進行深入闡述。
2. 數字邏輯狀態機的軟件實現
2.1 抽象建模
2.1.1 按鍵操作狀態抽象
一次按鍵動作可以抽象為3個狀態,按下、抬起、長按:
● Keydown:一次按鍵操作的按下
● Keyup:一次按鍵操作的抬起
● Keypress:一次按鍵操作持續按住按鍵

圖2.1.1
2.1.2 系統抽象
將軟件掃描按鍵狀態的軟件系統進行數字邏輯電路抽象:
● 時鐘抽象:軟件每隔20ms采集一次按鍵的狀態;
● 狀態抽象:連續掃描3次得到狀態序列011時,keydown才置1;
● 邏輯電路抽象:可以抽象為串行數據檢測器,只有輸入011才置1,采用同步時序邏輯電路的設計思路。

圖2.1.2
2.2 數字邏輯算法實現
2.2.1 數字邏輯抽象
A. 變量定義
● Scankey:軟件定時掃描的按鍵IO口狀態(0/1);
● Keydown:一次按鍵操作的按下;
B. 狀態邏輯抽象
● 設按鍵輸入Scankey為X,輸出結果Keydown為Y;
● 設沒有1輸入以前的狀態為a;
● 設輸入一個1后為狀態為b;
● 設前后有兩個1輸入后狀態為c;
● 設連續有三個1狀態為d
C. 狀態轉換圖
經過上面的數字邏輯抽象后,可以得到狀態轉換圖和狀態轉換表:

圖2.2.1
2.2.2 求解過程
A. 化簡狀態轉換圖
通過上節的狀態轉換圖和狀態轉換表(圖2.2.1)可看出,狀態c和狀態d擁有相同的狀態轉換路徑,所以可以將狀態c和狀態d合并為同一個狀態c,化簡后得到相應的狀態轉換圖和狀態轉換表,見圖2.2.2.A:

圖2.2.2.A
B. 卡諾圖
根據狀態分配原則,狀態M=3,所以取觸發器位數n=2,可以選用兩個D觸發器:D0和D1,且輸出為Q0、Q1。如果取Q1Q0的狀態00、01、10分別代表狀態a、b、c,依據狀態轉換圖得到如下卡諾圖。

圖2.2.2.B
C. 分解卡諾圖
將卡諾圖分解,得到圖2.2.2.C:

圖2.2.2.C
D. 解方程
● 由Q1*、Q0*的卡諾圖,可得狀態方程:
Q1*=XQ0 +XQ1Q0*=XQ1ˊQ0ˊ
● 又因為D觸發器特性方程為Q*=D,所以有:
Q0* = D0Q1* = D1
● 結合狀態方程,得驅動方程:
D1 = XQ0 +XQ1D0 = XQ1ˊQ0ˊ
● 由Y的卡諾圖得輸出方程:
Y = XQ0
E. 轉為C程序算法
定義每次掃描得到的按鍵電平信號狀態的變量為Scankey,得按鍵按下Keydown相應C代碼:
D1=Scankey & (Q0 | Q1); D0=Scankey & (~Q0) & (~Q1); Keydown=Scankey & Q0;Q1=D1;Q0=D0;
系統設計時申請一個時鐘定時器資源,20sm觸發一次,每次觸發定時中斷時掃描得到按鍵電平狀態Scankey,并進行上述算法運算,得到Keydown狀態,同理可推出Keyup和Keypress的算法,感興趣者可自行推算。
3. 總結
上述數字狀態機軟件可以把一次按鍵操作的Keydown、Keyup、Keypress一起檢出,代碼精簡,效率高。當然這種方式對系統實時性有要求,狀態會隨輸入改變而改變,同時耗費系統定時器資源,需要定時查詢。
審核編輯 :李倩
-
機械
+關注
關注
8文章
1752瀏覽量
43618 -
Linux
+關注
關注
88文章
11760瀏覽量
219039 -
開源項目
+關注
關注
0文章
38瀏覽量
7607
原文標題:3. 總結
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
MAX16150:納米功耗按鍵開關控制器的卓越之選
如何進行按鍵檢測
晶臺KLH11LX系列丨施密特觸發器光耦在按鍵消抖中的應用
按鍵消抖的方法
硬件消抖方案元件參數的計算方法
新品 | Chain DualKey,可編程雙按鍵輸入開發板
ZTP800按鍵升級 | 0.3mm凸起,100萬次按鍵壽命,手感爆棚!
Key_Scan按鍵掃描函數詳解
BitsButton嵌入式按鍵處理框架
第六章 GPIO輸入——按鍵檢測
觸摸按鍵噪聲對策 瑞薩CTSU MCU在應對噪聲困擾時軟硬件設計注意點
SDRAM控制器設計之按鍵的處理
機械按鍵硬件原理
評論