本發(fā)明涉及到一種電路輕觸開關(guān),用這種輕觸開關(guān)構(gòu)成的矩陣鍵盤的檢測變得非常簡單,另外,單片機(jī)只需要通過一個(gè)中斷源和若干個(gè)普通io口與矩陣鍵盤相連就可以以中斷的方式完成矩陣鍵盤檢測。
背景技術(shù):
鍵盤是微型計(jì)算機(jī)系統(tǒng)最基本最常見的輸入設(shè)備,一般鍵盤由多個(gè)輕觸開關(guān)構(gòu)成。根據(jù)輕觸開關(guān)的排列方式,鍵盤可以分為線性鍵盤和矩陣鍵盤。在按鍵多的場合,我們常采用矩陣鍵盤,矩陣鍵盤將輕觸開關(guān)排成n行m列,每個(gè)按鍵占據(jù)行列的一個(gè)交點(diǎn),這樣需要連線的數(shù)目就是n+m,這樣便可檢測n*m個(gè)輕觸開關(guān)。而傳統(tǒng)的輕觸開關(guān)為兩端式,當(dāng)我們摁住開關(guān)時(shí),這兩端導(dǎo)通,自然狀態(tài)下兩端為開路,不導(dǎo)通。這種兩端輕觸開關(guān)構(gòu)成的矩陣鍵盤的譯鍵方法常有行掃描法和線反轉(zhuǎn)法,以行掃描法來說,行掃描法需要依次置低矩陣鍵盤行線上的電平,再讀取端口的值以得到被按下按鍵的編碼,這種檢測方法在程序上較為繁瑣,不夠簡單,需要經(jīng)過幾個(gè)步驟才能識別出被按下的輕觸開關(guān)。另外,這些方法需要處理器以查詢的方式對按鍵掃描檢測,這就要求處理器不斷讀取io的電平狀態(tài),這種按鍵檢測的方式在實(shí)時(shí)系統(tǒng)中往往是不適宜的,而且以查詢的工作方式檢測按鍵就導(dǎo)致cpu無法工作在低功耗模式,會提高整個(gè)系統(tǒng)的功耗。如果要用中斷的方式檢測矩陣鍵盤,則需要將行(列)線連接到具有中斷能力的io口,而對于某些低端的處理器外部中斷資源是很少的,無法提供足夠的具有中斷能力的io口。由傳統(tǒng)兩端輕觸開關(guān)構(gòu)成的矩陣鍵盤有這兩大缺點(diǎn):檢測不夠簡單和無法工作以中斷的工作方式完成檢測。而這兩大缺點(diǎn)是由傳統(tǒng)兩端輕觸開關(guān)的特性所決定的,為了解決克服這些缺點(diǎn),本發(fā)明從輕觸開關(guān)的結(jié)構(gòu)上提出了一種新的思路。
技術(shù)實(shí)現(xiàn)要素:
為了簡化矩陣鍵盤的檢測,并使單片機(jī)只需要通過一個(gè)中斷源和若干個(gè)普通io口與矩陣鍵盤相連就可以以中斷的方式完成矩陣鍵盤檢測。
本發(fā)明采用的技術(shù)方案是:一種三端輕觸開關(guān),其特征是:由三個(gè)接觸端構(gòu)成,自然狀態(tài)下,這三個(gè)端兩兩開路,摁住開關(guān)時(shí),這三個(gè)端兩兩短路。
鍵盤連接方式:三端輕觸開關(guān)的三個(gè)端是相同的,為便于表述,將三端輕觸開關(guān)的三個(gè)端分別編號為0、1、2,對于m*n個(gè)輕觸開關(guān),將其排列成m行n列,每一行n個(gè)三端輕觸開關(guān)的1端由行線相連,各行分別記為row_1~row_m,每一列的m個(gè)三端輕觸開關(guān)的0端由列線相連,各列分別記為line_1~line_n,所有m*n個(gè)輕觸開關(guān)的2端連接到一起記為com端,所有三端輕觸開關(guān)構(gòu)成了m行n列的矩陣鍵盤。
查詢工作方式:行線row_1~row_m分別與單片機(jī)io口相連相連,列線line_1~line_n分別與單片機(jī)io口相連,com端接地;單片機(jī)通過讀取矩陣鍵盤相連的io口的值得到行線和列線上的電平狀態(tài),每一個(gè)按鍵被按下都對應(yīng)唯一的行線和列線上的一個(gè)電平狀態(tài),所以就可以通過單片機(jī)讀取行線和列線上的電平狀態(tài)來識別出被按下的按鍵,這就實(shí)現(xiàn)了單片機(jī)以查詢的工作方式檢測整個(gè)矩陣鍵盤。
中斷工作方式1:行線row_1~row_m分別與單片機(jī)io口相連相連,列線line_1~line_n分別與單片機(jī)io口相連,將com端接到單片機(jī)的外部中斷引腳,接下來以中斷的方式檢測整個(gè)矩陣鍵盤,將外部中斷設(shè)置為下降沿觸發(fā),與行線列線相連的io口設(shè)置為推挽輸出模式并全部輸出低電平,這樣,只要有任意一個(gè)按鍵被按下,com端電平便會被拉低,中斷觸發(fā),進(jìn)入中斷服務(wù)程序,在中斷服務(wù)程序中,首先將中斷引腳設(shè)置為輸出模式并輸出低電平,再將與行線列線相連的io口設(shè)置為上拉輸入模式,單片機(jī)再讀取行線列線的值,通過讀取行線列線的電平狀態(tài)便可以識別出被按下的按鍵,等待按鍵釋放,識別完成后再將外部中斷設(shè)置為下降沿觸發(fā),與行線列線相連的io口設(shè)置為推挽輸出模式并全部輸出低電平,單片機(jī)繼續(xù)等待中斷的來臨,這就實(shí)現(xiàn)了單片機(jī)以中斷的工作方式檢測整個(gè)矩陣鍵盤。
中斷工作方式2:行線row_1~row_m分別與單片機(jī)io口相連相連,列線line_1~line_n分別與單片機(jī)io口相連,每根行線和每根列線都分別連接一個(gè)電阻,所有電阻的另一端連接到高電平;所有行線或者所有列線或者所有行線和列線連接到一個(gè)與門電路的輸入端,與門電路的輸出端連接到單片機(jī)的外部中斷引腳,將外部中斷設(shè)置為下降沿觸發(fā);將com端接到低電平;任意一個(gè)按鍵被按下,其中一根行線和一根列線的電平被拉低,與門電路輸出端輸出一個(gè)低電平,中斷觸發(fā),進(jìn)入中斷服務(wù)程序,在中斷服務(wù)程序中,利用中斷服務(wù)程序讀取輸入的鍵的位置。
本發(fā)明的有益效果是:這種結(jié)構(gòu)的輕觸開關(guān)構(gòu)成的矩陣鍵盤的檢測變得和線性鍵盤一樣簡單,并單片機(jī)只需要通過一個(gè)中斷源和若干個(gè)普通io口與矩陣鍵盤相連就可以以中斷的方式完成矩陣鍵盤檢測。用中斷的方式檢測矩陣鍵盤不僅提高了整個(gè)單片機(jī)系統(tǒng)的實(shí)時(shí)性,提高了效率,還允許系統(tǒng)在休眠模式下工作,有按鍵按下時(shí)才觸發(fā)中斷喚醒cpu,這樣做也降低了系統(tǒng)的功耗,節(jié)約能源,同時(shí)能夠鍵盤的使用壽命。
附圖說明
原理圖1是三端輕觸開關(guān)的基本結(jié)構(gòu),有0,1,2三個(gè)端,每個(gè)端引出引腳;
原理圖2給出了一種由傳統(tǒng)兩端輕觸開關(guān)構(gòu)成的4*4矩陣鍵盤的連接方法;
原理圖3給出了一種由三端輕觸開關(guān)構(gòu)成的4*4矩陣鍵盤以查詢方式工作的連接方法;
原理圖4給出了一種由三端輕觸開關(guān)構(gòu)成的4*4矩陣鍵盤以中斷方式工作的連接方法。
具體實(shí)施方式
原理圖2給出了一種由傳統(tǒng)兩端輕觸開關(guān)構(gòu)成的4*4矩陣鍵盤的連接方法和實(shí)現(xiàn)鍵盤檢測的方法,根據(jù)原理圖2,行線row_1~row_4分別與單片機(jī)p1^0~p1^3(表示p1端口的0~3位,有的教材或者編程語言表示為p1.0~p1.3,本處的表示方法也是常見的標(biāo)示符號之一,下同;同時(shí),在單片機(jī)中有的端口是雙向口,或者稱為準(zhǔn)雙向口,即能夠輸出信息、也能輸入信息,此處的p1具有雙向口功能)相連并將p1^0~p1^3設(shè)置為推挽輸出模式,列線line_1~line_4分別與單片機(jī)p1^4~p1^7相連并將p1^4~p1^7設(shè)置為上拉輸入模式(懸空時(shí)引腳為高電平),采用行掃描法檢測矩陣鍵盤,依次將p1^0~p1^3單獨(dú)置為低電平,每設(shè)置一次低電平、都要讀取p1^4~p1^7檢測各列線的狀態(tài),來判斷是哪個(gè)按鍵按下(由于單片機(jī)的掃描速度遠(yuǎn)遠(yuǎn)快于人的輸入速度,現(xiàn)在單片機(jī)的頻率能夠達(dá)到300mhz,假定掃描需要100個(gè)周期,大約在微秒數(shù)量級,而人的輸入速度在0.1秒的數(shù)量級,因此,相對于人的輸入速度,掃描所需的時(shí)間能夠忽略)。具體實(shí)現(xiàn)方案:首先將p1^0輸出低電平,其余三條行線(p1^1、p1^2、p1^3)置為高電平,此時(shí)可以檢測第一行按鍵的狀態(tài),若key1被按下則line_4線電平被拉低,其余列線為高電平,若key2被按下則line_3線電平被拉低,其余列線為高電平,依此類推key3、key4,這樣通過讀取列線的電平的狀態(tài)就可以得到第一行按鍵的狀態(tài)。接著檢測第二行的按鍵,將p1^1輸出低電平,其余三條行線(p1^0、p1^2、p1^3)置為高電平,此時(shí)可以檢測第二行按鍵的狀態(tài),若key5被按下則line_4線電平被拉低,其余列線為高電平,若key6被按下則line_3線電平被拉低,其余列線為高電平,依此類推key7、key8,這樣通過讀取列線的電平的狀態(tài)就可以得到第二行按鍵的狀態(tài)。同理,再依次置低p1^2和p1^3的電平,其余列線為高電平,便可以分別檢測第三行和第四行按鍵的狀態(tài)。這樣就通過行掃描法檢測出了整個(gè)矩陣鍵盤。由于本身有由傳統(tǒng)兩端輕觸開關(guān)構(gòu)成,這種4*4矩陣鍵盤絕大多少通過查詢方式(單片機(jī)需要不斷讀取行線和列線的電平)檢測,而且可以看出檢測過程也較為復(fù)雜繁瑣。
接下來再給出了一種由本發(fā)明所描述的三端輕觸開關(guān)構(gòu)成的4*4矩陣鍵盤的連接方法和實(shí)現(xiàn)鍵盤檢測的方法。
首先給出以查詢方式實(shí)現(xiàn)鍵盤檢測的方法:根據(jù)原理圖3,行線row_1~row_4分別與單片機(jī)p1^0~p1^3相連,列線line_1~line_4分別與單片機(jī)p1^4~p1^7相連,com端接電源地(低電平)。p1^0~p1^7都設(shè)置為上拉輸入模式。單片機(jī)只需不斷讀取p1^0~p1^7即p1整個(gè)端口的值,便可得到整個(gè)矩陣鍵盤的狀態(tài)。當(dāng)按鍵s1被按下時(shí),與s1相連的行線與列線都與com端導(dǎo)通,被拉為低電平即p1^0和p1^7電平都為0,此時(shí)讀出p1端口的值為0x7e(0x標(biāo)示16進(jìn)制,十六進(jìn)制0x7e表示二進(jìn)制的01111110),p1^0~p1^7依次對應(yīng)一個(gè)字節(jié)的低位到高位,若s16被按下,與s16相連的行線與列線都與com端導(dǎo)通,被拉為低電平即p1^3和p1^4電平都為0,此時(shí)讀出p1端口的值為0xe7(二進(jìn)制的11100111),同理按鍵s1~s16被按下時(shí),依次對應(yīng)的p1端口的值為{0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed,0x7b,0xbb,0xdb,0xeb,0x77,0xb7,0xd7,0xe7},這樣只需要不斷讀取p1端口的值便可以得到按下按鍵的編碼進(jìn)而得到被按下按鍵的編號。相比于前面敘述的傳統(tǒng)二段輕觸開關(guān)構(gòu)成的矩陣鍵盤的檢測需要依次置低行線再讀取p1^4~p1^7的值來掃描檢測每一行的按鍵,這種由三端輕觸開關(guān)構(gòu)成的4*4矩陣鍵盤的檢測大大簡化,直接通過讀取p1端口的值便可以檢測整個(gè)矩陣鍵盤。
除了簡化了矩陣鍵盤的檢測,這種由三端輕觸開關(guān)構(gòu)成的矩陣鍵盤還可以很容易地以中斷的工作方式完成其檢測。接下來給出以中斷方式實(shí)現(xiàn)鍵盤檢測的方法:根據(jù)原理圖4,行線row_1~row_4分別與單片機(jī)p1^0~p1^3相連,列線line_1~line_4分別與單片機(jī)p1^4~p1^7相連,將com端接到單片機(jī)的外部中斷引腳,將外部中斷設(shè)置為下降沿觸發(fā),p1口設(shè)置為推挽輸出模式并全部輸出低電平,這樣,只要有任意一個(gè)按鍵被按下,com端電平便會被拉低,中斷觸發(fā),進(jìn)入中斷服務(wù)程序,在中斷服務(wù)程序中,首先將中斷引腳設(shè)置為輸出模式并輸出低電平,p1口設(shè)置為上拉輸入模式,單片機(jī)再讀取p1端口的值,通過讀取p1端口的值便可以得到被按下按鍵的編碼進(jìn)而得到被按下按鍵的編號,按鍵s1~s16被按下時(shí),依次對應(yīng)的p1端口的值為{0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed,0x7b,0xbb,
0xdb,0xeb,0x77,0xb7,0xd7,0xe7},得到被按下按鍵的編號后,再將p1口設(shè)置為輸出模式并輸出低電平,將外部中斷設(shè)置為輸入模式,退出中斷,這樣,單片機(jī)可以工作在低功耗休眠模式,在有按鍵按下時(shí)才將其喚醒。