按鍵介紹
? 按鍵種類(lèi)繁多绢淀,功能有簡(jiǎn)有繁皆的,極大的充斥著我們的生活。但是無(wú)論如何费薄,所有的按鍵其實(shí)都有一個(gè)原型栖雾,來(lái)源于同一種原理,所有的按鍵無(wú)論多復(fù)雜,多華麗赂鲤,都是從這樣一個(gè)原型發(fā)展而成的柱恤。好比你就算長(zhǎng)的再帥找爱,你也是只猩猩變來(lái)的,呵呵寺谤。我們平日所見(jiàn)到的絕大部分的按鍵吮播,其實(shí)都可以歸類(lèi)為一種,叫“接觸式按鍵”意狠。下圖為一個(gè)典型的接觸式按鍵(又稱(chēng)輕觸開(kāi)關(guān))。
?
? ? 需要特別說(shuō)明的是闷板,這里說(shuō)的“接觸”院塞,是指機(jī)械層面上的接觸,而不是感光或者某些特殊涂層(比如觸摸屏)一類(lèi)的接觸县遣。所以创泄,按鍵的工作特性其實(shí)是一種機(jī)械特性,下文會(huì)詳細(xì)說(shuō)明鞠抑。?
?
? ? ? ?如上圖搁拙,請(qǐng)對(duì)照?qǐng)D一想象,1箕速、2、3兴垦、4 分別對(duì)應(yīng)按鍵的四個(gè)引腳,其中藍(lán)色的線(xiàn)表示按鍵未被按下之時(shí)的狀態(tài)探越,我成為初始狀態(tài),它是不導(dǎo)通的枕屉;而綠色的線(xiàn)是卻永久導(dǎo)通的鲤氢。各位明白了么,其實(shí)是兩個(gè)相同的結(jié)構(gòu)連在一起了卷玉。我們只要將需要按鍵開(kāi)關(guān)作用的線(xiàn)路分別接在1、3 和2咆蒿、4 的任意取一組合蚂子,概括起來(lái)就是(1,2)食茎、(1,4)附迷、(3哎媚,2)、(3,4)四種組合衷快,都可以起到我們預(yù)期的開(kāi)關(guān)作用。
? ? 相信以上說(shuō)明使大家對(duì)按鍵的工作原理有了個(gè)比較清晰的認(rèn)識(shí)了淤毛,現(xiàn)在來(lái)說(shuō)說(shuō)一個(gè)小知識(shí)。先看下圖(圖4):
?
? ? ? ? ? 首先說(shuō)明的是低淡,上圖的連法是不允許的瞬项,因?yàn)楫?dāng)按鍵按下之后滥壕,電源和地短接兽泣,會(huì)將導(dǎo)線(xiàn)直接燒毀胁孙。但是此處用作特例,假設(shè)導(dǎo)線(xiàn)不會(huì)燒毀〕肀牵現(xiàn)在來(lái)提出一個(gè)問(wèn)題狂票,當(dāng)按鍵按下以后,請(qǐng)問(wèn)如果這時(shí)用萬(wàn)用表測(cè)量導(dǎo)線(xiàn)上任何一處的電壓闺属,得到的結(jié)果是VCC 還是GND 的電壓?
? ? ? ? 答案是:GND亚皂,即表示測(cè)出的電壓為0V国瓮。為什么呢,因?yàn)閷?dǎo)線(xiàn)上乃摹,對(duì)于兩端的電平是一種類(lèi)似于程序語(yǔ)言邏輯運(yùn)算里面的“與”,即對(duì)于導(dǎo)線(xiàn)兩端:有零即為零播歼,只有全為一是才為一肪康。理解了這點(diǎn),按鍵的工作前提就有了磷支。
? ? ? ?鍵盤(pán)分為編碼鍵盤(pán)和非編碼鍵盤(pán)。鍵盤(pán)上閉合鍵的識(shí)別由專(zhuān)用的硬件編碼器實(shí)現(xiàn)廓潜,并產(chǎn)生鍵編碼號(hào)或鍵值的稱(chēng)為編碼鍵盤(pán),如計(jì)算機(jī)鍵盤(pán)辩蛋。而靠軟件編程來(lái)識(shí)別的鍵盤(pán)稱(chēng)為非編碼鍵盤(pán),在單片機(jī)組成的各種系統(tǒng)中伤为,用的較多的是非編碼鍵盤(pán)据途。非編碼鍵盤(pán)又分為獨(dú)立鍵盤(pán)和行列式鍵盤(pán)(常說(shuō)的矩陣鍵盤(pán))。在這一講中我們介紹一下單片機(jī)中鍵盤(pán)使用位衩。
??? 單片機(jī)的IO口既可作為輸出也可作為輸入使用,當(dāng)檢測(cè)按鍵時(shí)用的是它的輸入功能糖驴,我們把按鍵的一端接地佛致,另一端與單片機(jī)的某個(gè)I/O口相連,開(kāi)始時(shí)先給該IO口賦一高電平跷睦,然后讓單片機(jī)不斷地檢測(cè)該I/O口是杏變?yōu)榈碗娖剑?dāng)按鍵閉合時(shí)抑诸,即相當(dāng)于該I/O口通過(guò)按鍵與地相連爹殊,變成低電平,程序一旦檢測(cè)到I/O口變?yōu)榈碗娖絼t說(shuō)明按鍵被按下层玲,然后執(zhí)行相應(yīng)的指令。
? ? ?我們先來(lái)說(shuō)一下辛块,按鍵常常遇到的問(wèn)題—抖動(dòng)問(wèn)題铅碍。
?
?
? ? ? ? ? 還以圖4為例,按鍵未按下之前胞谈,圖4按鍵左端的導(dǎo)線(xiàn)因?yàn)檫B在VCC 上而顯示高電平憨愉,右端顯示低電平配紫,按鍵按下后,按鍵閉合躺孝,整個(gè)導(dǎo)線(xiàn)都顯示低電平底桂,然后按鍵松開(kāi),又回到按鍵按下之前的電平狀態(tài)戚啥。如果只考察按鍵左端的電平變化猫十,應(yīng)該是上圖中所顯示的一個(gè)負(fù)脈沖波形呆盖。但是,實(shí)際上应又,正確的波形應(yīng)該是下圖。相比于上圖尤筐,大家都看到了在高低電平直接有一段鋸齒一樣的波形,這就是所謂的按鍵抖動(dòng)盆繁。
? ? ? ? ?為什么會(huì)有按鍵抖動(dòng)呢旬蟋,原因很簡(jiǎn)單,接觸式按鍵是靠機(jī)械的接觸來(lái)實(shí)現(xiàn)開(kāi)關(guān)作用的倾贰。這種接觸方式就注定了它要經(jīng)歷一個(gè)“接觸不穩(wěn)定——正在穩(wěn)定中——徹底穩(wěn)定”的一種過(guò)程。就好比你用手抓緊一顆石頭安寺,即使你一開(kāi)始就很用力的握緊吞彤,也不可能馬上就達(dá)到最緊的狀態(tài)叹放,也要經(jīng)歷一個(gè)從握住到最緊握的過(guò)程挠羔。那么在這個(gè)過(guò)程里,接觸式按鍵就處于一種徘徊在“閉合”與“斷開(kāi)”兩者之間的狀態(tài)俱恶。體現(xiàn)在電路中,就是在一小段時(shí)間內(nèi)有非常多的“按下——抬起”動(dòng)作合是。而這段抖動(dòng)的時(shí)間锭环,大概是10~20 毫秒,依不同的環(huán)境條件而定辅辩。
? ? ? 解決這個(gè)問(wèn)題常見(jiàn)的方法有軟件去抖動(dòng)和硬件去抖動(dòng)。
? ? ? 我們解釋一下抖動(dòng):關(guān)于按鍵去抖動(dòng)的解釋?zhuān)覀冊(cè)谑謩?dòng)按鍵的時(shí)候蛾茉,由于機(jī)械抖動(dòng)或是其它一些非人為的因素很有可能會(huì)造成誤識(shí)別撩鹿,一般手動(dòng)按下一次鍵然后接著釋放,按鍵兩片金屬膜接觸的時(shí)間大約為50ms 左右节沦,在按下瞬間到穩(wěn)定的時(shí)間為5-10ms,在松開(kāi)的瞬間到穩(wěn)定的時(shí)間也為5-10ms,如果我們?cè)偈状螜z測(cè)到鍵被按下后延時(shí)10ms 左右再去檢測(cè)稚机,這時(shí)如果是干擾信號(hào)將不會(huì)被檢測(cè)到获搏,如果確實(shí)是有鍵被按下,則可確認(rèn)常熙,以上為按鍵識(shí)別去抖動(dòng)的原理。
? ? 獨(dú)立鍵盤(pán)?
? ? 開(kāi)發(fā)板獨(dú)立按鍵電路圖如下:?
?
? ? 獨(dú)立按鍵一共8個(gè)仿贬,有對(duì)應(yīng)的插槽可以連接在單片機(jī)的任意IO口墓贿。去抖動(dòng)的方式蜓氨,我們采用軟件延時(shí)的方法队伟。過(guò)程如下:
先設(shè)置IO口為高電平(一般上電默認(rèn)就為高)
讀取IO口電平確認(rèn)是否有按鍵按下
如有IO電平為低電平后,延時(shí)幾個(gè)ms
再讀取該IO電平港令,如果任然為低電平,說(shuō)明對(duì)應(yīng)按鍵按下
執(zhí)行相應(yīng)按鍵的程序
? ?獨(dú)立鍵盤(pán)程序示例:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit led = P0^0; //設(shè)置燈的控制IO口
sbit k1? = P1^0; //設(shè)置按鍵的控制IO口
void delay(u16 i) //延時(shí)函數(shù)
{
? ? while(i--);
}
void keyprocess()
{
if(k1 == 0) //判斷按鍵是否按下
{
? ? delay(1000); //延時(shí)消抖
? ? if(k1 == 0)? //再次判斷按鍵是否按下
? ? {
? ? ? ? led = 1; //如果按鍵按下顷霹,則燈亮
? ? }
? ? else
? ? {
? ? ? ? led = 0; //如果按鍵沒(méi)有按下击吱,則燈滅
? ? }
}
}
void main()
{
? led = 0; //初始燈滅
? while(1)
? {
? keyprocess(); //處理按鍵事件
? }
}