![]() |
發(fā)布時(shí)間: 2018-8-31 02:34
正文摘要:本人第一次發(fā)帖,如果有錯(cuò)誤,歡迎大家指正!!!有關(guān)按鍵消抖的話題已經(jīng)有很多人提出來了,在這里我把它進(jìn)行一個(gè)總結(jié)。希望能幫助到大家! 1.按鍵抖動(dòng)的原因 按鍵消抖通常的按鍵所用 ... |
看了樓主的貼子對(duì)按鍵消抖又有了新的理解 |
貼上宋學(xué)松的程序片段:此程序在1毫秒中斷程序中執(zhí)行 //將一行的 4 個(gè)按鍵值移入緩沖區(qū) keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1; keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2; keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3; keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4; //消抖后更新按鍵狀態(tài) for (i=0; i<4; i++) //每行 4 個(gè)按鍵,所以循環(huán) 4 次 { if ((keybuf[keyout][i] & 0x0F) == 0x00) { //連續(xù) 4 次掃描值為 0,即 4*4ms 內(nèi)都是按下狀態(tài)時(shí),可認(rèn)為按鍵已穩(wěn)定的按下 KeySta[keyout][i] = 0; } else if ((keybuf[keyout][i] & 0x0F) == 0x0F) { //連續(xù) 4 次掃描值為 1,即 4*4ms 內(nèi)都是彈起狀態(tài)時(shí),可認(rèn)為按鍵已穩(wěn)定的彈起 KeySta[keyout][i] = 1; } } //執(zhí)行下一次的掃描輸出 keyout++; //輸出索引遞增 keyout = keyout & 0x03; //索引值加到 4 即歸零 switch (keyout) //根據(jù)索引,釋放當(dāng)前輸出引腳,拉低下次的輸出引腳 { case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; } |
看了一下,你的狀態(tài)機(jī)消抖,你key_press!=0xff時(shí),表明有鍵按下,賦key_state=1,則執(zhí)行case=1語句,再判斷key_press!=0xff,就幾條語句,也就幾個(gè)微秒而已,延時(shí)很短的,這有問題。 還是手把手教你學(xué)51單片機(jī) 宋學(xué)松處理陣列按鍵程序來得好。 它的思路是:采用中斷的形式,1毫秒中斷,在1毫秒中斷中,使某一行為低電平,其它為高電平。然后把這一行中的按鍵狀態(tài)緩存在狀態(tài)字節(jié)數(shù)組中(4*4的二維數(shù)組中),有四行,則要執(zhí)行4次,花4毫秒才能把各個(gè)按鍵的狀態(tài)存儲(chǔ)一遍。存儲(chǔ)的字節(jié)先左移一位,然后從最低位移入狀態(tài)位(列狀態(tài)),1為按鍵沒按下,0表示按下。通過16次,16毫秒掃描,就存儲(chǔ)了四次矩陣按鍵狀態(tài),這樣存儲(chǔ)在字節(jié)的低四位中。 假設(shè)4次都是1,表明已穩(wěn)定彈起,假設(shè)4次都為0,表明穩(wěn)定鍵下,如果不全是1或是0,則在按鍵過渡期。只要把這16這字節(jié)的數(shù)組與0x0f按位與,就能判斷是不是穩(wěn)定按下,或是穩(wěn)定彈出,如果是,就返回某按鍵值為1或是0,使代表按鍵消抖狀態(tài)的二維數(shù)組中的某個(gè)數(shù)為1或是0 |
寫的非常詳細(xì) |
程序啰里啰唆,采樣后僅判斷2次,完全沒這個(gè)必要的邏輯,后面的keycode重新賦值也根本沒必要,采樣出來本來已經(jīng)是按鍵值,沒必要再次轉(zhuǎn)換。除非還有其他的采樣,要放在一個(gè)8位的byte里面去識(shí)別。 |
使用硬件去抖動(dòng)電路:1)RS觸發(fā)器去抖動(dòng),2)單穩(wěn)觸發(fā)器——74HC221,3)同相器組成的積分去抖動(dòng)電路。 |
哎呀,你為什么把每個(gè)按鍵都定義呢,直接橫掃縱掃不就行了 |
謝謝大佬 |
樓主寫的非常詳細(xì) 好資料,51黑有你更精彩!!! |
很棒的分析,感謝分享。 |
分析很透,佩服這些大神 |
分析很透徹!好辦法! |
感謝樓主,非常好的資料,很有用。 |
oh,在不解壓下可以打開,解壓了反而打不開了,是我的原因。 |
不錯(cuò),萬丈高樓平地起,越是看似簡(jiǎn)單的東西,越要用心去學(xué)。謝謝樓主分享。 |
非常好的資料,謝謝樓主 |
樓主寫的很好,先收藏研究一下 |
樓主寫的非常詳細(xì) 好資料,51黑有你更精彩!!! |
Powered by 單片機(jī)教程網(wǎng)