1. 背景
1.1 機械按鍵硬件原理
機械按鍵是指在硬件電路中,通過機械按鍵開關(guān)實現(xiàn)電平信號的通斷來達(dá)到按鍵觸發(fā)的硬件組件,見圖1.1:
圖1.1
嵌入式等電子設(shè)計中,機械按鍵的檢測兩種方法:
● 掃描檢測:定時掃描IO口狀態(tài)
● 中斷檢測:啟用IO中斷
??此后的內(nèi)容都是圍繞定時掃描IO口狀態(tài)的方式展開的。
1.2 機械按鍵抖動
1.2.1 抖動原因
由于機械觸點的彈性作用,一個按鍵開關(guān)在閉合時不會馬上就穩(wěn)定的接通,在斷開時也不會一下子徹底斷開,而是在閉合和斷開的瞬間伴隨了一連串的抖動。設(shè)按鍵時間為Ta,抖動時間Td,則Ta、Td的特性如下(見圖1.2.1):
● Ta≈100ms(最快50ms);
● Td≈10ms;
圖1.2.1
1.2.2 按鍵消抖
理想的按鍵波形是沒有抖動的,但實際的波形是有電平抖動的,對實際波形進(jìn)行數(shù)字化抽象后會發(fā)現(xiàn)數(shù)字信號存在毛刺,見圖1.2.2:
圖1.2.2
為了消除電平信號的毛刺,目前工程上有兩種手段,硬件消抖和軟件消抖:
A. 硬件消抖
● 在硬件電路上和按鍵并聯(lián)濾波電容
B. 軟件消抖
● 延時確認(rèn):當(dāng)檢測到按鍵狀態(tài)改變時,先延時20ms,再次檢測按鍵;
● 持續(xù)采樣:持續(xù)采集按鍵狀態(tài),用數(shù)字狀態(tài)機邏輯來判斷按鍵動作。
硬件消抖需要增加元器件,增加項目成本,軟件消抖采用延時確認(rèn)方式時,軟件程序需要延時等待,延時過程不能進(jìn)行其他處理,對程序架構(gòu)不太友好,而持續(xù)采樣不會對程序流程造成阻塞,后續(xù)對持續(xù)采樣方式進(jìn)行深入闡述。
2. 數(shù)字邏輯狀態(tài)機的軟件實現(xiàn)
2.1 抽象建模
2.1.1 按鍵操作狀態(tài)抽象
一次按鍵動作可以抽象為3個狀態(tài),按下、抬起、長按:
● Keydown:一次按鍵操作的按下
● Keyup:一次按鍵操作的抬起
● Keypress:一次按鍵操作持續(xù)按住按鍵
圖2.1.1
2.1.2 系統(tǒng)抽象
將軟件掃描按鍵狀態(tài)的軟件系統(tǒng)進(jìn)行數(shù)字邏輯電路抽象:
● 時鐘抽象:軟件每隔20ms采集一次按鍵的狀態(tài);
● 狀態(tài)抽象:連續(xù)掃描3次得到狀態(tài)序列011時,keydown才置1;
● 邏輯電路抽象:可以抽象為串行數(shù)據(jù)檢測器,只有輸入011才置1,采用同步時序邏輯電路的設(shè)計思路。
圖2.1.2
2.2 數(shù)字邏輯算法實現(xiàn)
2.2.1 數(shù)字邏輯抽象
A. 變量定義
● Scankey:軟件定時掃描的按鍵IO口狀態(tài)(0/1);
● Keydown:一次按鍵操作的按下;
B. 狀態(tài)邏輯抽象
● 設(shè)按鍵輸入Scankey為X,輸出結(jié)果Keydown為Y;
● 設(shè)沒有1輸入以前的狀態(tài)為a;
● 設(shè)輸入一個1后為狀態(tài)為b;
● 設(shè)前后有兩個1輸入后狀態(tài)為c;
● 設(shè)連續(xù)有三個1狀態(tài)為d
C. 狀態(tài)轉(zhuǎn)換圖
經(jīng)過上面的數(shù)字邏輯抽象后,可以得到狀態(tài)轉(zhuǎn)換圖和狀態(tài)轉(zhuǎn)換表:
圖2.2.1
2.2.2 求解過程
A. 化簡狀態(tài)轉(zhuǎn)換圖
通過上節(jié)的狀態(tài)轉(zhuǎn)換圖和狀態(tài)轉(zhuǎn)換表(圖2.2.1)可看出,狀態(tài)c和狀態(tài)d擁有相同的狀態(tài)轉(zhuǎn)換路徑,所以可以將狀態(tài)c和狀態(tài)d合并為同一個狀態(tài)c,化簡后得到相應(yīng)的狀態(tài)轉(zhuǎn)換圖和狀態(tài)轉(zhuǎn)換表,見圖2.2.2.A:
圖2.2.2.A
B. 卡諾圖
根據(jù)狀態(tài)分配原則,狀態(tài)M=3,所以取觸發(fā)器位數(shù)n=2,可以選用兩個D觸發(fā)器:D0和D1,且輸出為Q0、Q1。如果取Q1Q0的狀態(tài)00、01、10分別代表狀態(tài)a、b、c,依據(jù)狀態(tài)轉(zhuǎn)換圖得到如下卡諾圖。
圖2.2.2.B
C. 分解卡諾圖
將卡諾圖分解,得到圖2.2.2.C:
圖2.2.2.C
D. 解方程
● 由Q1*、Q0*的卡諾圖,可得狀態(tài)方程:
Q1*=XQ0 +XQ1Q0*=XQ1ˊQ0ˊ
● 又因為D觸發(fā)器特性方程為Q*=D,所以有:
Q0* = D0Q1* = D1
● 結(jié)合狀態(tài)方程,得驅(qū)動方程:
D1 = XQ0 +XQ1D0 = XQ1ˊQ0ˊ
● 由Y的卡諾圖得輸出方程:
Y = XQ0
E. 轉(zhuǎn)為C程序算法
定義每次掃描得到的按鍵電平信號狀態(tài)的變量為Scankey,得按鍵按下Keydown相應(yīng)C代碼:
D1=Scankey & (Q0 | Q1); D0=Scankey & (~Q0) & (~Q1); Keydown=Scankey & Q0;Q1=D1;Q0=D0;
系統(tǒng)設(shè)計時申請一個時鐘定時器資源,20sm觸發(fā)一次,每次觸發(fā)定時中斷時掃描得到按鍵電平狀態(tài)Scankey,并進(jìn)行上述算法運算,得到Keydown狀態(tài),同理可推出Keyup和Keypress的算法,感興趣者可自行推算。
3. 總結(jié)
上述數(shù)字狀態(tài)機軟件可以把一次按鍵操作的Keydown、Keyup、Keypress一起檢出,代碼精簡,效率高。當(dāng)然這種方式對系統(tǒng)實時性有要求,狀態(tài)會隨輸入改變而改變,同時耗費系統(tǒng)定時器資源,需要定時查詢。
審核編輯 :李倩
-
機械
+關(guān)注
關(guān)注
8文章
1660瀏覽量
41377 -
Linux
+關(guān)注
關(guān)注
87文章
11446瀏覽量
212663 -
開源項目
+關(guān)注
關(guān)注
0文章
38瀏覽量
7413
原文標(biāo)題:3. 總結(jié)
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
AS32X601驅(qū)動系列教程 GPIO_按鍵檢測詳解

觸摸按鍵噪聲對策 瑞薩CTSU MCU在應(yīng)對噪聲困擾時軟硬件設(shè)計注意點

SDRAM控制器設(shè)計之按鍵的處理

遠(yuǎn)心鏡頭應(yīng)用手機按鍵檢測

藍(lán)橋杯中GPIO輸入之按鍵實驗

基于FPGA實現(xiàn)按鍵消抖處理

機械振動機械能守恒嗎
兩種常見的硬件消抖實現(xiàn)方式

為什么按鍵消抖那么重要

如何在FPGA中實現(xiàn)按鍵消抖
【AWTK使用經(jīng)驗】如何響應(yīng)物理按鍵

評論