1、按鍵消抖 通常的按鍵所用開(kāi)關(guān)為機(jī)械彈性開(kāi)關(guān),,當(dāng)機(jī)械觸點(diǎn)斷開(kāi),、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,,一個(gè)按鍵開(kāi)關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,,在斷開(kāi)時(shí)也不會(huì)一下子斷開(kāi)。因而在閉合及斷開(kāi)的瞬間均伴隨有一連串的抖動(dòng),,為了不產(chǎn)生這種現(xiàn)象而作的措施就是按鍵消抖,。抖動(dòng)時(shí)間的長(zhǎng)短由按鍵的機(jī)械特性決定,一般為5ms~10ms,。 消抖的方法有硬件消抖和軟件消抖兩種,。 硬件消抖在鍵數(shù)較少時(shí)可用硬件方法消除鍵抖動(dòng)。下圖所示的RS觸發(fā)器為常用的硬件去抖,。 圖中兩個(gè)'與非'門(mén)構(gòu)成一個(gè)RS觸發(fā)器,。當(dāng)按鍵未按下時(shí),輸出為0;當(dāng)鍵按下時(shí),,輸出為1,。此時(shí)即使用按鍵的機(jī)械性能,使按鍵因彈性抖動(dòng)而產(chǎn)生瞬時(shí)斷開(kāi)(抖動(dòng)跳開(kāi)B),,只要按鍵不返回原始狀態(tài)A,,雙穩(wěn)態(tài)電路的狀態(tài)不改變,輸出保持為0,,不會(huì)產(chǎn)生抖動(dòng)的波形,。也就是說(shuō),即使B點(diǎn)的電壓波形是抖動(dòng)的,,但經(jīng)雙穩(wěn)態(tài)電路之后,,其輸出為正規(guī)的矩形波。這一點(diǎn)通過(guò)分析RS觸發(fā)器的工作過(guò)程很容易得到驗(yàn)證,。 軟件消抖如果按鍵較多,,常用軟件方法去抖,即檢測(cè)出鍵閉合后執(zhí)行一個(gè)延時(shí)程序,,5ms~10ms的延時(shí),,讓前沿抖動(dòng)消失后再一次檢測(cè)鍵的狀態(tài),,如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下,。當(dāng)檢測(cè)到按鍵釋放后,,也要給5ms~10ms的延時(shí),待后沿抖動(dòng)消失后才能轉(zhuǎn)入該鍵的處理程序,。一般來(lái)說(shuō),,軟件消抖的方法是不斷檢測(cè)按鍵值,直到按鍵值穩(wěn)定,。實(shí)現(xiàn)方法:假設(shè)未按鍵時(shí)輸入1,,按鍵后輸入為0,抖動(dòng)時(shí)不定,??梢宰鲆韵聶z測(cè):檢測(cè)到按鍵輸入為0之后,延時(shí)5ms~10ms,,再次檢測(cè),,如果按鍵還為0,那么就認(rèn)為有按鍵輸入,。延時(shí)的5ms~10ms恰好避開(kāi)了抖動(dòng)期,。 2、鍵盤(pán)掃描 矩陣式鍵盤(pán)結(jié)構(gòu):輸出行線(xiàn)鎖存器,,輸入列線(xiàn)緩沖器,。 工作過(guò)程: 1.CPU先使行線(xiàn)P1.0為低,其余行線(xiàn)為高 2.CPU讀入輸入緩沖器的狀態(tài),,以確定哪條列線(xiàn)為0狀態(tài),,若此時(shí)P1.7為0,則'C'鍵按下,;若P1.5為0,,則'E'鍵按下 3.若輸入緩沖器(列線(xiàn))狀態(tài)全部為1,說(shuō)明P1.0行沒(méi)有鍵盤(pán)按下,,CPU急繼續(xù)使P1.1為0,,其余行線(xiàn)為高,再讀入輸入緩沖器的狀態(tài),,以確定哪條列線(xiàn)為0,,從而判斷是哪個(gè)鍵盤(pán)按下 4.當(dāng)判斷那個(gè)鍵盤(pán)按下后,程序轉(zhuǎn)入相應(yīng)的鍵盤(pán)處理程序 矩陣式鍵盤(pán)結(jié)構(gòu):輸出行線(xiàn)鎖存器,,輸入列線(xiàn)緩沖器,。 工作過(guò)程: 1.CPU先使行線(xiàn)P1.0為低,其余行線(xiàn)為高 2.CPU讀入輸入緩沖器的狀態(tài),,以確定哪條列線(xiàn)為0狀態(tài),,若此時(shí)P1.7為0,,則'C'鍵按下,;若P1.5為0,,則'E'鍵按下 3.若輸入緩沖器(列線(xiàn))狀態(tài)全部為1,說(shuō)明P1.0行沒(méi)有鍵盤(pán)按下,,CPU急繼續(xù)使P1.1為0,,其余行線(xiàn)為高,再讀入輸入緩沖器的狀態(tài),,以確定哪條列線(xiàn)為0,,從而判斷是哪個(gè)鍵盤(pán)按下 4.當(dāng)判斷那個(gè)鍵盤(pán)按下后,程序轉(zhuǎn)入相應(yīng)的鍵盤(pán)處理程序 把每個(gè)鍵都分成水平和垂直的兩端接入,,比如說(shuō)掃描碼是從垂直的入,,那就代表那一行所接收到的掃描碼是同一個(gè)bit,而讀入掃描碼的則是水平,,掃描的動(dòng)作是先輸入掃描碼,,再去讀取輸入的值,經(jīng)過(guò)比對(duì)之后就可知道是哪個(gè)鍵被按下,。 比如說(shuō)掃描碼送入01111111,,前面的0111是代表此時(shí)掃描第一行P1.0列,而后面的1111是讓讀取的4行接腳先設(shè)為VDD,,若此時(shí)第一行的第三列按鍵被按下,,那讀取的結(jié)果就會(huì)變成01111101(注意1111變成1101),其中LSB的第三個(gè)bit會(huì)由1變成0,,這是因?yàn)檫@個(gè)按鍵被按下之后,,會(huì)被垂直的掃描碼電位short,而把讀取的LSB的bit電位拉到0,,此即為掃描原理,。 3、實(shí)例電路 4,、掃描程序(僅供參考) //鍵盤(pán)掃描程序 uchar Keys_Scan() { uchar Tmp,KeyNo=0; //高四位置0,,放入四行 P1=0x0F; DeMS(1); Tmp =P1^0x0F; //判斷按鍵發(fā)生于0~3列的哪一列 switch(Tmp) { case 1:KeyNo=0;break; case 2:KeyNo=1;break; case 4:KeyNo=2;break; case 8:KeyNo=3;break; default:KeyNo=16; //無(wú)鍵按下 } //低四位置0,放入四列 P1=0xF0; Tmp =P1>>4^0x0F; //0~3行分別附加起始值0,,4,,8,12 switch (Tmp) { case 1:KeyNo +=0;break; case 2:KeyNo +=4;break; case 4:KeyNo +=8;break; case 8:KeyNo +=12; } return KeyNo; }
|
|