無延時按鍵程序精品文檔15頁_第1頁
無延時按鍵程序精品文檔15頁_第2頁
無延時按鍵程序精品文檔15頁_第3頁
無延時按鍵程序精品文檔15頁_第4頁
無延時按鍵程序精品文檔15頁_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、在使用單片機搭建有人機交互的系統(tǒng)時需要用到鍵盤,因為單片機工作時間都是納秒與毫秒級別,但是我們?nèi)梭w的反應(yīng)時間最少要0.2 秒,之間差距很大,現(xiàn)實過程中也會不小心碰到按鍵,正常的按下按鍵應(yīng)該是持續(xù)數(shù)十秒的穩(wěn)定。 一、按鍵電路 常用的非編碼鍵盤, 每個在使用單片機搭建有人機交互的系統(tǒng)時需要用到鍵盤,因為單片機工作時間都是納秒與毫秒級別,但是我們?nèi)梭w的反應(yīng)時間最少要 0.2 秒,之間差距很大,現(xiàn)實過程中也會不小心碰到按鍵,正常的按下按鍵應(yīng)該是持續(xù)數(shù)十秒的穩(wěn)定。一、按鍵電路常用的非編碼鍵盤, 每個鍵都是一個常開開關(guān)電路。計數(shù)器輸入脈沖最好不要直接接普通的按鍵開關(guān),因為記數(shù)器的記數(shù)速度非??? 按鍵、觸

2、點等接觸時會有多次接通和斷開的現(xiàn)象。我們感覺不到,可是記數(shù)器卻都記錄了下來。例如,雖然只按了 1 下 , 記數(shù)器可能記了 3 下。因此,使用按鍵的記數(shù)電路都會增加單穩(wěn)態(tài)電路避免記數(shù)錯誤。二、按鍵消抖通常的按鍵所用開關(guān)為機械彈性開關(guān) , 當機械觸點斷開、閉合時,電壓信號小型如下圖。由于機械觸點的彈性作用 , 一個按鍵開關(guān)在閉合時不會馬上穩(wěn)定地接通, 在 斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動 , 如下圖。抖動時間的長短由按鍵的機械特性決定,一般為5ms10m$這是一個 很重要的時間參數(shù),在很多場合都要用 到。按鍵穩(wěn)定閉合時間的長短則是由操作人員的按鍵動作決定的 , 一

3、般為零點幾秒至數(shù)秒。鍵抖動會引起一次按鍵被誤讀多次。為確保CPUM鍵的一次閉合僅作一次處理 , 必須去除鍵抖動。在鍵閉合穩(wěn)定時讀取鍵的狀態(tài) , 并且必須判別到鍵釋放穩(wěn)定后再作處理。按鍵的抖動 , 可用硬件或軟件兩種方法。三、硬件消抖在鍵數(shù)較少時可用硬件方法消除鍵抖動。下圖所示的RS觸發(fā)器為常用的硬件去抖。消抖電路如下圖中兩個“與非”門構(gòu)成一個RS觸發(fā)器。當按鍵未按下時,輸出為 1; 當鍵按下時, 輸出為 0。此時即使用按鍵的機械性能 , 使按鍵因彈性抖動而產(chǎn)生瞬時斷開 (抖動跳開B) , 中要按鍵不返回原始狀態(tài)A, 雙穩(wěn)態(tài)電路的狀態(tài)不改變, 輸出保持為 0, 不會產(chǎn)生抖動的波形。 也就是說 ,

4、 即使 B 點的電壓波形是抖動的 , 但經(jīng)雙 穩(wěn)態(tài)電路之后 , 其輸出為正規(guī)的矩形波。這一點通過分析RS觸發(fā)器的工作過程很容易得到驗證。利用電容的放電延時,采用并聯(lián)電容法,也可以實現(xiàn)硬件消抖:消抖電路如下四、軟件延時消抖如果按鍵較多 , 常用軟件方法去抖, 即檢測出鍵閉合后執(zhí)行一個延時程序,產(chǎn)生5ms10ms的延時,讓前沿抖動消失后再一次檢測鍵的狀態(tài)如果仍保持閉合狀態(tài)電平 , 則確認為真正有鍵按下。當檢測到按鍵釋放后也要給5m曉10ms的延時,待后沿抖動消失后才能轉(zhuǎn)入該鍵的處理程序。五、無延時的軟件消抖/*名稱:鍵盤掃描子函數(shù)功能:在按鍵穩(wěn)定期內(nèi)判斷鍵值,并返回鍵值*/uchar keysca

5、n(void)static char key_state = 0;static char key_value = 0;uchar key_press, key_return = 0;key_press=turn_left&turn_right;/ 讀按鍵 I/O 電平switch (key_state)case 0 :/ 按鍵初始態(tài)if (key_press=0) key_state = 1; /鍵被按下,但需要確認是否是干擾break;case 1 :/ 按鍵確認態(tài)if (key_press=0)/ 如有鍵按下則不是干擾,判斷鍵值if(turn_left=0)/ 判斷是哪一個按鍵被按

6、下key_value=1;/ 按鍵較多時可采用 switch 選擇結(jié)構(gòu)else if(turn_right=0)key_value=2;elsekey_value=0;狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)按鍵已抬起,屬于干擾,轉(zhuǎn)換到按鍵初始key_state = 2; /elsekey_state = 0; /態(tài)break;case 2 :if (key_press=1)key_return=key_value;/ 按鍵釋放后再輸出鍵值, 如果按下鍵就輸出則可省略key_valuekey_value=0;key_state = 0; / 如果按鍵釋放,轉(zhuǎn)換到按鍵初始態(tài)break;return key_retur

7、n; / 返回鍵值/*名稱:按鍵處理子函數(shù)功能:*/void key_operation(void)switch (keyscan()/ 根據(jù)鍵值不同,執(zhí)行不同的內(nèi)容hight_votage-=1;if(hight_votage<5)hight_votage=5;break;case 2:hight_votage+=1;if(hight_votage>25)hight_votage=25;break;default :break;系統(tǒng)的信號輸入中,鍵盤因其結(jié)構(gòu)簡單而被廣泛使用。因此,對鍵盤的輸入(邏輯 0 或 1 )進行準確采樣,避免錯誤輸入是非常有必要的。理想的鍵盤輸入特性如圖

8、1 所示:按鍵沒有按下時,輸入為邏輯1 ,一旦按下則輸入立刻變?yōu)檫壿?,松開時輸入則立刻變?yōu)檫壿?。圖 1 理想鍵盤輸入特性然而實際的鍵盤受制造工藝等影響,其輸入特性不可能如圖 1 完美。當按0 和 1 ,也就鍵按下時,在觸點即將接觸到完全接觸這段時間里,鍵盤的通斷狀態(tài)很可能已經(jīng)改變了多次。即在這段時間里,鍵盤輸入了多次邏輯是輸入處于失控狀態(tài)。如果這些輸入被系統(tǒng)響應(yīng),則系統(tǒng)暫時也將處于失控狀態(tài),這是我們要盡量避免的。在觸點即將分離到完全分離這段時間也是一樣的。實際鍵盤的輸入特性如圖 2 所示:圖 2 實際鍵盤輸入特性我們可以看到:鍵盤在輸入邏輯轉(zhuǎn)換時,實際上是產(chǎn)生了瞬時的高頻干擾脈沖。按鍵消抖

9、的目的在于消除此干擾,以達到接近圖 1 所示的理想輸入特性。有兩個階段可以設(shè)法消除此干擾: 1. 在鍵盤信號輸入系統(tǒng)之前(系統(tǒng)外); 2. 鍵盤信號輸入系統(tǒng)以后(系統(tǒng)內(nèi))。在信號輸入系統(tǒng)之前將抖動干擾消除,可以節(jié)省系統(tǒng)資源,提高系統(tǒng)對其他信號的響應(yīng)能力,也就是硬件消抖。一種比較巧妙的硬件消抖電路結(jié)構(gòu)如圖 3 所示:圖3用基本SR鎖存器構(gòu)成的消抖電路該電路利用基本SR鎖存器的記憶作用消除開關(guān)觸點振動所產(chǎn)生的影響。開關(guān) S 每切換一次,輸出端只有一次翻轉(zhuǎn),不存在抖動波形(讀者可以根據(jù)SR鎖存器功能自行分析,此處略)。但是使用SR鎖存器消抖只適用于單刀雙擲開關(guān),實際應(yīng)用當中常用的鍵盤多是兩個接線端的

10、按鍵。對此類按鍵的常用硬件消抖電路如圖 4 所示:圖 4 常用鍵盤硬件消抖電路第 7 頁此電路利用電容平波,再經(jīng)過施密特反相器整形之后就得到了沒有毛刺的 脈沖波。軟件消抖要占用系統(tǒng)資源,在系統(tǒng)資源充足的情況下使用軟件消抖更加簡單。軟件消抖的實質(zhì)在于降低鍵盤輸入端口的采樣頻率,將高頻抖動略去。實際應(yīng)用中通常采用延時跳過高頻抖動區(qū)間,然后再檢測輸入做出相應(yīng)處理。一般程序代碼如下:if (value = 0)/ 一旦檢測到鍵值Delay(); /延時20ms,有效濾除按鍵的抖動if (value = 0)/再次確定鍵值是否有效/執(zhí)行相應(yīng)處理這段軟消抖程序從機理上看不會有什么問題,通常在軟件程序不太&

11、quot;繁忙"的情況下也能夠很好的消抖并做相應(yīng)處理。但是如果在延時期間產(chǎn)生了中斷,則此中斷可能無法得到響應(yīng)。對于硬件資源豐富的FPGA統(tǒng),可以使用硬件來減輕軟件工作量,通常 稱之為“硬件加速"o在按鍵信號輸入到軟件系統(tǒng)前用邏輯對其進行一下簡單的處理即可實現(xiàn)所謂的"硬件消抖",verilog 代碼如下:/對輸入信號inpio硬件濾波,每20ms采樣一次當前值reg18:0 cnt; /20ms計數(shù)器always (posedge clk_25m or negedge rst_n)if(!rst_n) cnt <= 19'd0;else if

12、(cnt < 19'd500000) cnt <= cnt+1'b1;else cnt <= 19'd0;reg1:0 inpior; /當前inpio信號鎖存,每20ms鎖存一拍always (posedge clk_25m or negedge rst_n)if(!rst_n) inpior <= 2'b11;else if(cnt = 19'h7ffff) inpior <= inpior0,inpior;wire inpio_swin =inpior0 | inpior1;/ 前后 20ms兩次鎖存值都為0時才為0該

13、程序中設(shè)置了一個 20ms計數(shù)器,通過間隔20ms對輸入信號inpio采樣 兩次,兩次相同則認為鍵盤輸入穩(wěn)定,得到用硬件邏輯處理后的inpio_swin信號則是消抖處理過的信號。軟件程序就不再需要 delay()來 濾波了,也不會出現(xiàn)使用純軟件處理出現(xiàn)的 "中斷失去響應(yīng)”的情況了,這 就是"硬件加速”的效果。上述verilog 代碼采用間隔采樣來達到消抖的目的,對于不同物理特性的 鍵盤,最佳的間隔時間采樣時間也不同,因此還存在一些不穩(wěn)定因素。下 面介紹一種更好的軟消抖程序,同樣采用"硬件加速",不同之處在于使用了有限狀態(tài)機來實現(xiàn),其 VHDL弋碼如下:L

14、IBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY xiaod IS/端口描述:clk輸入檢測時鐘;reset復(fù)位信號;din原始按鍵信號輸入;dout去抖動輸出信號PORT(clk : IN STD_LOGIC ;reset : IN STD_LOGIC ;din : IN STD_LOGIC ;dout : OUT STD_LOGIC);END ENTITY;ARCHITECTURE RTL OF xiaod ISTYPE state IS( s0,s1,s2,s3);SIGNAL p

15、re_s, next_s: state;BEGINP0:PROCESS( reset, clk )BEGINif reset = '0' thenpre_s <= s0;elsif rising_edge( clk ) thenpre_s <= next_s;elsenull;end if;END PROCESS P0;P1:PROCESS( pre_s, next_s, din )BEGINcase pre_s iswhen s0 =>dout <= '1'if din = '1' thennext_s <= s0

16、;elsenext_s <= s1;end if;when si => dout <= '1'if din = '1' then next_s <= s0;else next_s <= s2;end if;when s2 => dout <= '1'if din = '1' then next_s <= s0;else next_s <= s3;end if;when s3 => dout <= '0'if din = '1' the

17、nnext_s <= s0;elsenext_s <= s1;end if;end case;END PROCESS P1;END RTL;該VHDL弋碼描述了一個狀態(tài)機,其狀態(tài)轉(zhuǎn)換圖如圖所示:圖5狀態(tài)轉(zhuǎn)換圖該狀態(tài)機有4個狀態(tài):S0、S1、S2、S3,其中前3個狀態(tài)輸出高電平,最后一個狀態(tài)輸出低電平。初始狀態(tài)為S0,設(shè)按鍵未按下時為高電平,按下則為低電平。在按鍵按下到完全生效期間有一系列的抖動,對于持續(xù)時間為1-2個時鐘周期的低電平抖動將被消除,對于持續(xù)時間為3個或以上時鐘周期的低電平則認為按鍵有效,輸出一個時鐘周期的低電平脈沖(讀者可以根據(jù)狀態(tài)轉(zhuǎn)換圖畫出相應(yīng)的時序圖進行分析)。如果持續(xù)輸入為低電平,則每隔兩個時鐘周期輸出一個低電平,此時認為按鍵處于 "長按 "輸入狀態(tài), 可以編程設(shè)置相應(yīng)功能。 在按鍵松開階段其抖動也可以一樣被消除。適用于FPGA勺按鍵消抖方法還有一些,如計數(shù)器型、D觸發(fā)器型等,在此就不作介紹了。通過上面一些按鍵消抖方法的介紹分析,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論