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

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

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

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

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

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