1. 背景
1.1 機(jī)械按鍵硬件原理
機(jī)械按鍵是指在硬件電路中,通過機(jī)械按鍵開關(guān)實(shí)現(xiàn)電平信號的通斷來達(dá)到按鍵觸發(fā)的硬件組件,見圖1.1:
圖1.1
嵌入式等電子設(shè)計(jì)中,機(jī)械按鍵的檢測兩種方法:
● 掃描檢測:定時(shí)掃描IO口狀態(tài)
● 中斷檢測:啟用IO中斷
??此后的內(nèi)容都是圍繞定時(shí)掃描IO口狀態(tài)的方式展開的。
1.2 機(jī)械按鍵抖動(dòng)
1.2.1 抖動(dòng)原因
由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上就穩(wěn)定的接通,在斷開時(shí)也不會(huì)一下子徹底斷開,而是在閉合和斷開的瞬間伴隨了一連串的抖動(dòng)。設(shè)按鍵時(shí)間為Ta,抖動(dòng)時(shí)間Td,則Ta、Td的特性如下(見圖1.2.1):
● Ta≈100ms(最快50ms);
● Td≈10ms;
圖1.2.1
1.2.2 按鍵消抖
理想的按鍵波形是沒有抖動(dòng)的,但實(shí)際的波形是有電平抖動(dòng)的,對實(shí)際波形進(jìn)行數(shù)字化抽象后會(huì)發(fā)現(xiàn)數(shù)字信號存在毛刺,見圖1.2.2:
圖1.2.2
為了消除電平信號的毛刺,目前工程上有兩種手段,硬件消抖和軟件消抖:
A. 硬件消抖
● 在硬件電路上和按鍵并聯(lián)濾波電容
B. 軟件消抖
● 延時(shí)確認(rèn):當(dāng)檢測到按鍵狀態(tài)改變時(shí),先延時(shí)20ms,再次檢測按鍵;
● 持續(xù)采樣:持續(xù)采集按鍵狀態(tài),用數(shù)字狀態(tài)機(jī)邏輯來判斷按鍵動(dòng)作。
硬件消抖需要增加元器件,增加項(xiàng)目成本,軟件消抖采用延時(shí)確認(rèn)方式時(shí),軟件程序需要延時(shí)等待,延時(shí)過程不能進(jìn)行其他處理,對程序架構(gòu)不太友好,而持續(xù)采樣不會(huì)對程序流程造成阻塞,后續(xù)對持續(xù)采樣方式進(jìn)行深入闡述。
2. 數(shù)字邏輯狀態(tài)機(jī)的軟件實(shí)現(xiàn)
2.1 抽象建模
2.1.1 按鍵操作狀態(tài)抽象
一次按鍵動(dòng)作可以抽象為3個(gè)狀態(tài),按下、抬起、長按:
● 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ù)檢測器,只有輸入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è)沒有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)過上面的數(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合并為同一個(gè)狀態(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,可以選用兩個(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程序算法
定義每次掃描得到的按鍵電平信號狀態(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í)申請一個(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一起檢出,代碼精簡,效率高。當(dāng)然這種方式對系統(tǒng)實(shí)時(shí)性有要求,狀態(tài)會(huì)隨輸入改變而改變,同時(shí)耗費(fèi)系統(tǒng)定時(shí)器資源,需要定時(shí)查詢。
審核編輯 :李倩
-
機(jī)械
+關(guān)注
關(guān)注
8文章
1685瀏覽量
41886 -
Linux
+關(guān)注
關(guān)注
87文章
11509瀏覽量
213681 -
開源項(xiàng)目
+關(guān)注
關(guān)注
0文章
38瀏覽量
7459
原文標(biāo)題:3. 總結(jié)
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
AS32X601驅(qū)動(dòng)系列教程 GPIO_按鍵檢測詳解

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

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

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

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

基于狀態(tài)機(jī)和面向?qū)ο蟮乃枷朐O(shè)計(jì)按鍵檢測模塊

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

電容式觸摸按鍵的按鍵擴(kuò)展方法

機(jī)械振動(dòng)機(jī)械能守恒嗎
兩種常見的硬件消抖實(shí)現(xiàn)方式

為什么按鍵消抖那么重要

評論