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