摘要:提出一種單片機(jī)控制的由按鍵和旋鈕組成的矩陣鍵盤的設(shè)計(jì)方法,并實(shí)現(xiàn)其在嵌入式Linux下與ARM的串行通信,從硬件和軟件的角度詳細(xì)介紹該方案的實(shí)現(xiàn)過程,給出了基本的硬件原理和按鍵掃描以及通信程序設(shè)計(jì)的方法。實(shí)驗(yàn)證明,此方案簡單可靠,ARM在Linux下可以準(zhǔn)確響應(yīng)鍵盤事件,已經(jīng)應(yīng)用于數(shù)字存儲示波器的研發(fā)中。
關(guān)鍵詞:單片機(jī);距陣鍵盤;嵌入式linux;串行通信
中圖分類號:TN41;TP33
文獻(xiàn)標(biāo)識碼:B
文章編號:1004—373X(2008)04—177—04
1 引 言
在現(xiàn)代工業(yè)控制系統(tǒng)和儀器設(shè)備中,鍵盤是不可缺少的輸入設(shè)備,是控制系統(tǒng)與操作人員交流的橋梁。操作人員可以通過外設(shè)鍵盤靈活地輸入各種參數(shù)以控制系統(tǒng)的運(yùn)行。考慮到本系統(tǒng)按鍵數(shù)量較多(23個按鍵和7個旋鈕),并且不想使用專用的鍵盤處理芯片,所以采用矩陣式鍵盤設(shè)計(jì)。單片機(jī)性能穩(wěn)定、價(jià)格低廉、功能強(qiáng)大,在儀器設(shè)備和電子消費(fèi)品中得到越來越廣泛的應(yīng)用。在單片機(jī)系統(tǒng)中,串行通信接口由于具有接口簡單、容易實(shí)現(xiàn)等優(yōu)點(diǎn)已經(jīng)被廣泛使用,成為一種常用的接口。例如,單片機(jī)通過串口和上位機(jī)ARM進(jìn)行通信,就能夠?qū)崿F(xiàn)遠(yuǎn)程控制并能利用ARM強(qiáng)大的數(shù)據(jù)處理功能和友好的控制界面。Linux由于具有內(nèi)核強(qiáng)大、開源、易擴(kuò)展和裁減以及豐富的硬件支持等許多優(yōu)點(diǎn),在嵌入式系統(tǒng)得到非常廣泛的應(yīng)用。特別是他的性能穩(wěn)定非常適合做工業(yè)控制。本文提出的鍵盤通信方案就是以嵌入式Linux和ARM 9處理器為軟硬件平臺,在便攜式嵌入式設(shè)備上的應(yīng)用表明其具有較好的穩(wěn)定性和實(shí)時(shí)性。
2 系統(tǒng)總體方案設(shè)計(jì)
基于本系統(tǒng)的具體要求采用單片機(jī)控制鍵盤與ARM進(jìn)行實(shí)時(shí)串行通信。單片機(jī)采用美國Atmel公司生產(chǎn)的低電壓,高性能CMOS 8位單片機(jī)AT89C2051,此款單片機(jī)是Atmel公司的一種精簡型51內(nèi)核單片機(jī)。ARM處理器采用三星公司的$3C2410 ARM9處理器,是16/32位RISC微處理器,主要用于低成本、低功耗和高性能手持設(shè)備和一般應(yīng)用的單片微處理器解決方案。由AT89C2051單獨(dú)管理鍵盤,實(shí)現(xiàn)鍵盤的識別譯碼工作,然后通過串口與ARM在Linux下進(jìn)行實(shí)時(shí)通信。圖1是系統(tǒng)總體框圖。

3 硬件設(shè)計(jì)
在本系統(tǒng)中,鍵盤由23個按鍵式開關(guān)和7個旋鈕開關(guān)構(gòu)成,相當(dāng)于37個按鍵式開關(guān),于是將鍵盤按照8×5的矩陣鍵盤結(jié)構(gòu)進(jìn)行組織,其中3列為按鈕式按鍵,另2列分別接7個旋鈕開關(guān)的A,B引出端。由于一般情況下ARM的CPU的任務(wù)較重,且I/O端口資源不足,所以使用專門的鍵盤掃描控制器完成對矩陣鍵盤的管理工作,該控制器即單片機(jī)AT89C2051,當(dāng)鍵盤控制器判斷到有按鍵事件發(fā)生,并判讀出相應(yīng)鍵碼后,就通過異步串行口與ARM通信,ARM的主CPU在接收到鍵碼后,會由硬件產(chǎn)生中斷并軟件響應(yīng),執(zhí)行相應(yīng)的處理程序。由于要實(shí)現(xiàn)符合RS 232的串行通信,還應(yīng)該用MAX 232芯片構(gòu)成串口電平轉(zhuǎn)換電路。圖2是系統(tǒng)硬件電路的示意圖,由于是ARM接收鍵盤發(fā)送的數(shù)據(jù),所以串行口采用2線制接法,即鍵盤和ARM的UART控制器的TXD和GND相互連接。

在圖2中,鍵盤矩陣的KH0~KH7共8根行線接至AT89C2051 P1口的P1.0~P1.7引腳,KV0~KV4共5根列線接至P3口的對應(yīng)引腳,P 3.1作為異步串口的發(fā)送端,用于和主CPU通信。
4 軟件設(shè)計(jì)
軟件部分的程序包括上位機(jī)單片機(jī)鍵盤掃描程序和下位機(jī)ARM的接收處理程序,下面分別介紹。
4.1鍵盤掃描程序設(shè)計(jì)與實(shí)現(xiàn)
本系統(tǒng)采用矩陣鍵盤接口設(shè)計(jì),在對按鍵進(jìn)行編碼時(shí)一般是先獲得按鍵的掃描碼,然后將其轉(zhuǎn)化為事先約定的按鍵編碼。雖然不同的按鍵接口方式對應(yīng)不同的按鍵識別方法,但無論哪種接口方式,按鍵的閉合與否都反映在電壓的高低上,因此系統(tǒng)可以通過檢測不同的電平狀態(tài)來識別按鍵是否按下。另外,采用掃描法識別按鍵,讓行線從KH0,KH1到KH7逐行置零電平,若KH0為零電平,KH1~KH7為高電平,此刻依次檢查各列電平變化,若某列電平由高變低則表示此列與KH0的交叉處的鍵盤被按下。其主程序流程如圖3所示。
結(jié)合本系統(tǒng)的具體情況,AT89C2051單片機(jī)僅用來進(jìn)行對鍵盤的管理,故可采用編程掃描方式,圖4為其鍵盤掃描子程序流程圖。
由于鍵盤面板中包括按鍵和旋鈕,所以在編程的時(shí)候要區(qū)別對待。對于按鍵,首先將第N行置低電平,其余行置高電平,讀取SW_data值,若其與之前的SW值相等,則表示有可能按鍵被按下,此刻直接讀取列號看是否有鍵被按下,若有則通過行列號來確定具體的按鍵碼值。若SW_data值與之前的SW值不同則表示可能是旋鈕的轉(zhuǎn)動。

在數(shù)字儀器中,旋鈕開關(guān)實(shí)際上是一個編碼開關(guān),他相當(dāng)于將2個按鍵式開關(guān)的一端連在一起成為公共端,另一端分別引出,稱之為引出端A和B。當(dāng)旋鈕開關(guān)旋動時(shí),旋鈕內(nèi)部與A,B相連的2個金屬簧片都會與接地的公共端相接,但是在時(shí)間上會有一個短暫的時(shí)間差,因此在A,B上就會產(chǎn)生如圖5所示的2個有一定相位差的脈沖信號。在鍵盤掃描過程中,如果能設(shè)法判斷出2路脈沖到達(dá)的相位關(guān)系,就可以知道旋鈕的旋動方向,從而進(jìn)行相應(yīng)的操作。有2種方法可以用來判別脈沖到達(dá)的先后順序,一種是硬件的辦法,即采用鑒相器,通過專門的電路判斷,再將結(jié)果送至CPU;還有一種就是用軟件的方法進(jìn)行判斷,從圖5中可以分析出,當(dāng)旋鈕左旋時(shí),A,B兩端電平信號的組合狀態(tài)是11-01-00-10的序列,且這樣的序列具有惟一性,同樣當(dāng)旋鈕右旋時(shí),A,B電平信號的組合狀態(tài)序列也是惟一的,通過判斷這A,B兩端電平信號的組合狀態(tài)是否符合以上2組預(yù)知序列的順序,同樣可以判斷出旋鈕的旋動方向。
另外,為了防止鍵盤的意外事件,在軟件中對按鍵抖動以及旋鈕的誤操作都做了相應(yīng)的處理。

需要注意的是,串口的設(shè)置非常重要,關(guān)系到串口能否正常工作。由于鍵盤發(fā)送的是單字節(jié)的16進(jìn)制數(shù)據(jù),所以必需將串口所對應(yīng)的終端設(shè)置成原始(RAW)工作方式,就是不必對輸入輸出處理。
初始化結(jié)束后就可以讀取鍵盤發(fā)送過來的數(shù)據(jù)。首先要打開串口:fd=open(“/dev/ttySl”,O_RDWR),接下來可以用read函數(shù)進(jìn)行讀取。這里為了使串口在請求的操作阻塞時(shí)能進(jìn)行其他操作,用select函數(shù)實(shí)現(xiàn)了多路復(fù)用式串口。另外還要注意的是ARM在Linux下的串口接收程序的波特率一定要和單片機(jī)鍵盤掃描程序的波特率一致,不然不會接收到正確的數(shù)據(jù)。下面是接收程序:
5 系統(tǒng)調(diào)試結(jié)果
測試的時(shí)候把鍵盤串口和ARM開發(fā)板的串口2相連,開發(fā)板的串口1和PC的串口相連。先把鍵盤掃描程序燒寫到單片機(jī)。在PC上打開串口工具DNW,在開發(fā)板上啟動Linux后下載串口接收程序并運(yùn)行。圖6是Linux下接收到的旋鈕和按鍵值。

圖7是在Qt/E環(huán)境下編寫的數(shù)字存儲示波器界面測試鍵盤通信的畫面,結(jié)果顯示鍵盤可以控制LCD中波形的打開、關(guān)閉、變換等操作。
6 結(jié) 語
近年來隨著Linux在國內(nèi)應(yīng)用范圍的日益壯大,在工業(yè)控制、數(shù)據(jù)采集等領(lǐng)域也必將越來越多地采用Linux,本文可以算作一個有益的嘗試。為了驗(yàn)證本系統(tǒng)的可靠性,在Linux下面用Qt/E編寫了帶有按鈕的數(shù)字示波器界面并移植到了ARM系統(tǒng)中。實(shí)驗(yàn)結(jié)果表明,數(shù)字示波器界面上面的按鈕能很好地響應(yīng)鍵盤的按鍵及旋鈕事件,系統(tǒng)穩(wěn)定可靠。當(dāng)然,要應(yīng)用到實(shí)際的項(xiàng)目中,還要根據(jù)實(shí)際情況具體考慮,靈活運(yùn)用,最終才能形成一個可靠的基于嵌入式linux的平臺。
