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

下載本文檔

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

文檔簡介

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

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

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

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

6、下key_value=1;/ 按鍵較多時(shí)可采用 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 )進(jìn)行準(zhǔn)確采樣,避免錯(cuò)誤輸入是非常有必要的。理想的鍵盤輸入特性如圖

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

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

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

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

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

14、IBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY xiaod IS/端口描述:clk輸入檢測時(shí)鐘;reset復(fù)位信號;din原始按鍵信號輸入;dout去抖動(dòng)輸出信號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弋碼描述了一個(gè)狀態(tài)機(jī),其狀態(tài)轉(zhuǎn)換圖如圖所示:圖5狀態(tài)轉(zhuǎn)換圖該狀態(tài)機(jī)有4個(gè)狀態(tài):S0、S1、S2、S3,其中前3個(gè)狀態(tài)輸出高電平,最后一個(gè)狀態(tài)輸出低電平。初始狀態(tài)為S0,設(shè)按鍵未按下時(shí)為高電平,按下則為低電平。在按鍵按下到完全生效期間有一系列的抖動(dòng),對于持續(xù)時(shí)間為1-2個(gè)時(shí)鐘周期的低電平抖動(dòng)將被消除,對于持續(xù)時(shí)間為3個(gè)或以上時(shí)鐘周期的低電平則認(rèn)為按鍵有效,輸出一個(gè)時(shí)鐘周期的低電平脈沖(讀者可以根據(jù)狀態(tài)轉(zhuǎn)換圖畫出相應(yīng)的時(shí)序圖進(jìn)行分析)。如果持續(xù)輸入為低電平,則每隔兩個(gè)時(shí)鐘周期輸出一個(gè)低電平,此時(shí)認(rèn)為按鍵處于 "長按 "輸入狀態(tài), 可以編程設(shè)置相應(yīng)功能。 在按鍵松開階段其抖動(dòng)也可以一樣被消除。適用于FPGA勺按鍵消抖方法還有一些,如計(jì)數(shù)器型、D觸發(fā)器型等,在此就不作介紹了。通過上面一些按鍵消抖方法的介紹分析,

溫馨提示

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

評論

0/150

提交評論