《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于ARM9的多行列鍵盤設(shè)計(jì)及其驅(qū)動(dòng)實(shí)現(xiàn)
基于ARM9的多行列鍵盤設(shè)計(jì)及其驅(qū)動(dòng)實(shí)現(xiàn)
中電網(wǎng)
摘要: 本文以運(yùn)行ARM-Linux的AT91RM9200系統(tǒng)為基礎(chǔ),提出了一種在ARM9上擴(kuò)展特殊鍵盤的新設(shè)計(jì)方法,并對(duì)鍵盤擴(kuò)展的硬件設(shè)計(jì)和驅(qū)動(dòng)軟件開發(fā)都作了詳細(xì)說明。本設(shè)計(jì)方法利用數(shù)據(jù)鎖存方式替代了常規(guī)的GPIO擴(kuò)展,提高了系統(tǒng)硬件的資源利用率,這一思想也為在其他嵌入式設(shè)備擴(kuò)展多行列鍵盤提供了一種新的設(shè)計(jì)思路。
Abstract:
Key words :

1 引 言

許多嵌入式系統(tǒng),尤其是一些人機(jī)交互(HMI)較頻繁的嵌入式系統(tǒng),鍵盤是一種應(yīng)用最為廣泛的輸入設(shè)備。由于嵌入式設(shè)備的功能互異性,為其提供一種通用性鍵盤是不可行的,一般都需要根據(jù)嵌入式系統(tǒng)的實(shí)際功能來設(shè)計(jì)所需的特殊鍵盤,并實(shí)現(xiàn)相應(yīng)的驅(qū)動(dòng)程序。www.51kaifa.com

在嵌入式設(shè)備上擴(kuò)展鍵盤的常用方式是通過使用CPU的GPIO端口掃描實(shí)現(xiàn)的,顯然,這種方式會(huì)占用系統(tǒng)的GPIO資源,特別是在GPIO資源比較緊張而按鍵又較多的系統(tǒng),這個(gè)問題就特別突出。當(dāng)然,也可以通過外擴(kuò)GPIO(如8255等)或外擴(kuò)專用的鍵盤接口(如8279等)方式實(shí)現(xiàn),但這種方式顯然增加了系統(tǒng)的復(fù)雜度,在實(shí)際系統(tǒng)設(shè)計(jì)中頗感不便。

本文以在ARM9(AT91RM9200)嵌入式微處理器上實(shí)現(xiàn)一個(gè)POS機(jī)鍵盤(8×8)為例,呈現(xiàn)了一種在嵌入式設(shè)備上擴(kuò)展多行列鍵盤的新設(shè)計(jì)思路,并在ARM-Linux系統(tǒng)實(shí)現(xiàn)了鍵盤的驅(qū)動(dòng)程序。

2、接口電路的硬件設(shè)計(jì)

本文通過一個(gè)設(shè)計(jì)實(shí)例,說明如何使用一種比較簡(jiǎn)單的方式,來實(shí)現(xiàn)一個(gè)8×8的POS機(jī)矩陣鍵盤,POS機(jī)所采用的微處理器是AT91RM9200芯片。AT91RM9200是ATMEL公司生產(chǎn)的一款高性能的32位ARM9處理器,它是一款通用工業(yè)級(jí)ARM芯片,在工業(yè)控制、智能儀器儀表等領(lǐng)域內(nèi)得到了大量的應(yīng)用[3,4],其詳細(xì)芯片特性可參見文獻(xiàn)[2]。

在AT91RM9200上擴(kuò)展鍵盤,一般都是通過其GPIO端口來實(shí)現(xiàn)。AT91RM9200雖提供了4×32個(gè)可編程的GPIO端口。但為減小芯片體積和功耗,其許多GPIO端口都是與系統(tǒng)的外圍設(shè)備控制器端口或地址線、數(shù)據(jù)線進(jìn)行復(fù)用的,所以實(shí)際可用于擴(kuò)展的GPIO端口是很少的。而對(duì)于一個(gè)8×8鍵盤,若采用傳統(tǒng)的GPIO端口擴(kuò)展方式,則需要16個(gè)GPIO,這在一個(gè)比較復(fù)雜的POS系統(tǒng)中是很難滿足的,因此需要采用其他方式來解決這個(gè)問題。

圖1 鍵盤接口原理圖

本文通過數(shù)據(jù)鎖存的方式,充分利用32位處理器的數(shù)據(jù)寬度優(yōu)勢(shì),使用數(shù)據(jù)線來替代鍵盤擴(kuò)展所需的GPIO端口,從而減少對(duì)系統(tǒng)GPIO資源的占用。鍵盤接口的實(shí)現(xiàn)原理如圖1所示。在圖1所示的電路中,U1301(74LVCC4245)為三態(tài)緩沖器,U1302(74HC574)為鎖存器,系統(tǒng)工作原理描述如下:

U1301的nOE端連接系統(tǒng)的譯碼輸出nKey_CS,部件地址由系統(tǒng)譯碼電路決定,當(dāng)向該地址寫數(shù)據(jù)時(shí),nKey_CS信號(hào)為低電平,數(shù)據(jù)可以通過U1301,同時(shí),nKey_CS信號(hào)經(jīng)兩級(jí)反相器延時(shí)后作為鎖存信號(hào)將數(shù)據(jù)鎖存到U1302的輸出端,作為鍵盤的行掃描信號(hào),而鍵盤的列掃描信號(hào)則仍然使用系統(tǒng)的GPIO。依次向每行送出低電平信號(hào),同時(shí)檢測(cè)連接在GPIO的列信號(hào),即可實(shí)現(xiàn)對(duì)鍵盤的掃描。在本系統(tǒng)中,只使用了系統(tǒng)32位數(shù)據(jù)的低8位作為行掃描信號(hào),在實(shí)現(xiàn)8×8矩陣鍵盤掃描的情況下,僅需要占用8個(gè)GPIO口,如果采用同樣的方式,分別使用16位數(shù)據(jù)或32位數(shù)據(jù)作為行掃描信號(hào),則只需要占用4個(gè)或2個(gè)GPIO,顯然,與傳統(tǒng)的方式相比較,該方式可以大大節(jié)省系統(tǒng)的GPIO資源。

3、鍵盤的驅(qū)動(dòng)模塊設(shè)計(jì)

完成接口電路的設(shè)計(jì)之后,還需要編寫相應(yīng)的鍵盤驅(qū)動(dòng)模塊。本文采用AT91RM9200芯片中已經(jīng)運(yùn)行了ARM-Linux操作系統(tǒng),因此給鍵盤的驅(qū)動(dòng)程序開發(fā)提供了很大的方便。鍵盤的驅(qū)動(dòng)模塊可分為硬件初始化、文件操作函數(shù)的實(shí)現(xiàn)以及鍵盤掃描程序三個(gè)部分。

3.1 硬件初始化

鍵盤驅(qū)動(dòng)程序的開發(fā)模式與Linux系統(tǒng)中一般字符設(shè)備的驅(qū)動(dòng)開發(fā)步驟相似,關(guān)于Linux設(shè)備驅(qū)動(dòng)開發(fā)的詳細(xì)分析可參考文獻(xiàn)[1]。首先需完成的是驅(qū)動(dòng)程序模塊的初始化函數(shù)和清除函數(shù)。在初始化函數(shù)中,除完成模塊注冊(cè)外,還應(yīng)進(jìn)行硬件初始化,下面是本文根據(jù)AT91RM9200芯片的GPIO控制器的特性[2],在模塊的初始化函數(shù)中的硬件初始化的偽代碼。

……

設(shè)置所使用GPIO端口為GPIO控制器控制

設(shè)置所使用GPIO端口的類型為輸入

使能所使用GPIO端口的輸入毛刺濾波功能

使能相應(yīng)的GPIO控制器時(shí)鐘

取指定地址的虛擬地址并向地址寫入數(shù)據(jù)0x0

……

3.2 文件操作函數(shù)的實(shí)現(xiàn)

因?yàn)殒I盤在系統(tǒng)中一般只起輸入作用,因此在鍵盤驅(qū)動(dòng)程序的file_operations結(jié)構(gòu)中,必須實(shí)現(xiàn)的文件操作函數(shù)只有文件讀函數(shù)。

另外在實(shí)際應(yīng)用中,為防止鍵盤按鍵的丟失,被按下鍵的掃描代碼通常都放置在一個(gè)緩沖區(qū)內(nèi),直到應(yīng)用程序準(zhǔn)備處理一個(gè)按鍵為止。緩沖區(qū)大小一般視應(yīng)用系統(tǒng)的需求而定,本例中緩沖區(qū)大小取為20個(gè)按鍵代碼。而緩沖區(qū)的實(shí)現(xiàn)是以一個(gè)環(huán)形隊(duì)列的形式實(shí)現(xiàn)。當(dāng)按鍵按下后,掃描代碼將被放置在隊(duì)列的下一個(gè)空位置,若緩沖區(qū)已滿,則下一按鍵將會(huì)被丟棄。應(yīng)用程序則通過鍵盤的讀函數(shù)read()從緩沖區(qū)的位置指針處起,讀取所需個(gè)數(shù)的鍵碼;完成讀取操作后,還需將已被讀取的鍵碼從緩沖隊(duì)列中刪除,并更新緩沖區(qū)的位置指針。下面給出了本例中,實(shí)現(xiàn)的鍵盤讀函數(shù)key_read()的偽代碼:

ssize_t key_read(……)

{

定義并初始化變量;

if 緩沖區(qū)中可被讀取的鍵碼數(shù)大于0;

取得鍵碼放置緩沖區(qū)的自旋鎖;

計(jì)算此次讀操作可讀取的代碼個(gè)數(shù)M(緩沖區(qū)中可讀取的代碼個(gè)數(shù)與程序要求個(gè)數(shù)之間的較小者);

從緩沖區(qū)位置指針開始,從緩沖區(qū)中拷貝M個(gè)的鍵碼到用戶空間緩沖區(qū)內(nèi);

更新緩沖區(qū)的位置指針和緩沖區(qū)中還剩余的鍵碼個(gè)數(shù);

釋放自旋鎖

返回此次讀操作成功讀取的代碼個(gè)數(shù)。

Else

返回-1

}

3.3 鍵盤掃描程序

鍵盤的工作原理是通過鍵盤的行線和列線的狀態(tài)來判斷鍵盤中有無按鍵被按下。鍵盤掃描程序的功能就是用來判斷處于按下狀態(tài)的按鍵的具體位置及取得相應(yīng)的鍵碼值,因此掃描程序的設(shè)計(jì)是鍵盤驅(qū)動(dòng)模塊實(shí)現(xiàn)的核心。

鍵盤掃描程序的實(shí)現(xiàn)主要有兩種,即輪詢方式和中斷方式[5]。在本例中,利用操作系統(tǒng)定時(shí)器隊(duì)列與輪詢掃描方式結(jié)合的方法對(duì)鍵盤的驅(qū)動(dòng)程序進(jìn)行了設(shè)計(jì),主要是基于以下兩個(gè)方面的原因。其一是AT91RM9200芯片的中斷信號(hào)線是非常寶貴的硬件資源,每一組GPIO端口只配置了一根中斷信號(hào)線,即32個(gè)GPIO端口共享一條信號(hào)線。這樣若采用中斷方式,則至少需要占用一條芯片中斷信號(hào)線,對(duì)多行列的鍵盤,如果其所采用的GPIO端口不是來自于同一組時(shí),就需要占用多條中斷信號(hào)線。而且若其他設(shè)備使用的GPIO端口與鍵盤使用的GPIO口屬于同一組,那么在兩種設(shè)備的驅(qū)動(dòng)程序設(shè)計(jì)中,必須進(jìn)行中斷共享,這樣不僅使系統(tǒng)的軟件設(shè)計(jì)更為復(fù)雜,且易產(chǎn)生中斷丟失和中斷竟態(tài)等問題,使設(shè)備性能受到影響。其二鍵盤是系統(tǒng)中屬于一種相對(duì)低速的設(shè)備,采用輪詢方式完全可以滿足鍵盤的輸入要求。

ARM-Linux操作系統(tǒng)提供了良好的定時(shí)器機(jī)制,因此通過簡(jiǎn)單定時(shí)器操作,就可以實(shí)現(xiàn)以固定間隔對(duì)鍵盤的狀態(tài)進(jìn)行掃描并對(duì)按鍵事件進(jìn)程處理,固定間隔的大小可根據(jù)系統(tǒng)需求進(jìn)行配置,定義器的詳細(xì)操作可參見文獻(xiàn)[1]。如前所述,鍵盤掃描程序的功能就是對(duì)鍵盤的狀態(tài)進(jìn)行判斷和處理。若無按鍵按下,則掃描直接返回;若有按鍵按下,則對(duì)被按下鍵的位置進(jìn)行判斷,并將相應(yīng)的鍵碼值寫入緩沖區(qū)中。因?yàn)楸纠械逆I盤是為POS機(jī)配置,因此按鍵的準(zhǔn)確性是至關(guān)重要,因此在掃描代碼中對(duì)按鍵值進(jìn)行了多次驗(yàn)證,下面是本例中使用的鍵盤掃描程序的偽代碼:

int Scan_Keyboard()

{

定義并初始化變量;

取得鍵碼放置緩沖區(qū)的自旋鎖;

if 緩沖區(qū)中還有空;

① 依次判斷各GPIO口的狀態(tài),若無低電平,則無鍵按下,直接退出if語句;否則,有鍵按下,且當(dāng)前檢驗(yàn)的GPIO口連接的行線即為按鍵所在的行;

② 給鍵盤列線連接的數(shù)據(jù)線依次送入高電平,再通過判斷按鍵行線所在的GPIO端口的電平狀態(tài),得到按鍵所在的列;

延時(shí)一小段時(shí)間,以消除鍵盤抖動(dòng);

③ 再向給鍵盤列線連接的數(shù)據(jù)線全送低電平,使用代碼段①再次判斷是否有鍵按下,若有,則取得按鍵所在的行;

④ 同樣使用代碼段②重新判斷按鍵所在的列;

⑤ 判斷第一次得到的按鍵的行與列是否與第二次完全一樣,若完全相同,則可進(jìn)入下一步,否則退出if語句;

⑥ 重新向給鍵盤列線連接的數(shù)據(jù)線全送低電平,并判斷按鍵是否彈起,若仍處于按下狀態(tài),則繼續(xù)等待,否則根據(jù)行與列,轉(zhuǎn)化為相應(yīng)鍵值,并寫入緩沖區(qū);

if語句結(jié)束;

釋放自旋鎖;

函數(shù)返回 0;

}

完成驅(qū)動(dòng)程序代碼編寫后,就可以將鍵盤的驅(qū)動(dòng)程序加載到ARM-Linux內(nèi)核中了,既可以采用靜態(tài)加載方式,也可以采用動(dòng)態(tài)方式進(jìn)行加載。加載后,在應(yīng)用程序中鍵盤的編程使用方式與其他字符設(shè)備一樣。采用本文所述方式設(shè)計(jì)的鍵盤,目前已配置在筆者參與開發(fā)的POS機(jī)中交用戶使用,據(jù)用戶測(cè)試,鍵盤的輸入準(zhǔn)確率和反應(yīng)時(shí)間都達(dá)到了設(shè)計(jì)要求。

4、結(jié)束語

本文以運(yùn)行ARM-Linux的AT91RM9200系統(tǒng)為基礎(chǔ),提出了一種在ARM9上擴(kuò)展特殊鍵盤的新設(shè)計(jì)方法,并對(duì)鍵盤擴(kuò)展的硬件設(shè)計(jì)和驅(qū)動(dòng)軟件開發(fā)都作了詳細(xì)說明。本設(shè)計(jì)方法利用數(shù)據(jù)鎖存方式替代了常規(guī)的GPIO擴(kuò)展,提高了系統(tǒng)硬件的資源利用率,這一思想也為在其他嵌入式設(shè)備擴(kuò)展多行列鍵盤提供了一種新的設(shè)計(jì)思路。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲国产精品va在线看黑人动漫 | 99视频在线精品国自产拍免费观看| 久久久久免费观看| 欧美一级片一区| 国内精品免费午夜毛片| 欧美成人综合| 亚洲自拍三区| 性18欧美另类| 亚洲在线成人| 亚洲国产精品一区二区第一页| 欧美日韩国产999| 午夜精品久久久久久99热| 欧美一区国产在线| 亚洲国产婷婷香蕉久久久久久99| 欧美日韩在线一区| 久久久久久**毛片大全| 欧美一区二区三区在线视频 | 久久精品中文字幕免费mv| 亚洲大片在线| 日韩一级片网址| 亚洲免费观看高清在线观看 | 国产欧美综合一区二区三区| 久久激情婷婷| 亚洲毛片在线观看| 亚洲特级毛片| 在线播放中文一区| 国产精品美女www爽爽爽| 嫩草成人www欧美| 亚洲免费视频在线观看| 亚洲欧美一区二区三区极速播放 | 亚洲高清自拍| 亚洲免费电影在线| 亚洲欧美激情视频| 亚洲精品日韩在线| 国产亚洲免费的视频看| 欧美日韩精品| 欧美日精品一区视频| 蜜桃伊人久久| 久久av在线看| 亚洲视频中文字幕| 亚洲国产精品99久久久久久久久| 亚洲福利视频免费观看| 亚洲精品一级| 亚洲网站在线| 亚洲精品久久久蜜桃| 欧美一区日本一区韩国一区| 欧美在线免费观看| 亚洲日本理论电影| 亚洲制服av| 亚洲看片网站| 亚洲一区二区在线看| 欧美一区二区成人6969| 久久综合给合久久狠狠狠97色69| 午夜亚洲视频| 亚洲天堂偷拍| 久久国产视频网| 欧美福利视频一区| 国产精品福利在线观看| 欧美精品成人91久久久久久久| 久久国产精品一区二区| 毛片av中文字幕一区二区| 欧美日韩福利在线观看| 国产精品视频区| 国产精品激情电影| 国内免费精品永久在线视频| 日韩小视频在线观看| 亚洲欧美www| 亚洲精品国偷自产在线99热| 午夜精品久久久久久| 欧美成人精品三级在线观看| 国产精品美女久久久久av超清 | 国产精品网站在线观看| 亚洲黄色成人网| 亚洲欧美日韩综合| 日韩一区二区福利| 亚洲午夜精品视频| 在线亚洲高清视频| 99国产精品一区| 欧美亚洲一区| 一本一本久久a久久精品牛牛影视| 91久久久亚洲精品| 亚洲人www| 亚洲欧美在线一区二区| 你懂的国产精品永久在线| 国产精品一区视频网站| 国产精品乱码人人做人人爱| 亚洲第一天堂av| 亚洲国产天堂久久综合网| 亚洲综合视频一区| 夜夜嗨av一区二区三区四季av| 一区二区日韩免费看| 久久青草欧美一区二区三区| 另类综合日韩欧美亚洲| 国产精品久久久久久久9999 | 亚洲日本中文字幕区| 亚洲国产精品传媒在线观看| 亚洲影院一区| 在线一区日本视频| 蜜臀久久久99精品久久久久久| 国产美女精品在线| 一本不卡影院| 亚洲男人影院| 亚洲图片你懂的| 欧美大片在线影院| 加勒比av一区二区| 亚洲七七久久综合桃花剧情介绍| 亚洲精品视频免费| 亚洲电影一级黄| 久久精品国产999大香线蕉| 国产精品久久综合| 夜夜夜久久久| 亚洲一区www| 欧美视频你懂的| 在线视频精品| 亚洲女性裸体视频| 欧美午夜美女看片| 国产一区二区三区丝袜| 亚洲在线成人| 欧美一区二区三区四区高清| 国产精品久久久久久久app| 一区二区三区福利| 亚洲综合日韩在线| 国产精品久久久久久久久久妞妞| 99国内精品久久久久久久软件| 一本色道久久99精品综合| 欧美成人亚洲| 亚洲激情视频网| 9人人澡人人爽人人精品| 欧美日韩高清在线播放| 日韩亚洲欧美在线观看| 亚洲小视频在线观看| 欧美午夜精品一区| 亚洲免费在线观看视频| 欧美一区二区三区男人的天堂| 国产欧美一区二区精品婷婷| 小黄鸭精品aⅴ导航网站入口| 久久激情五月激情| 激情久久久久| 亚洲美女av在线播放| 99国产欧美久久久精品| 欧美日韩大陆在线| 亚洲视频欧美在线| 欧美一区二区免费| 国产视频精品va久久久久久| 亚洲欧洲精品一区| 日韩一级在线| 国产精品二区三区四区| 国产精品99久久久久久白浆小说| 亚洲欧美自拍偷拍| 国产真实久久| 亚洲精品网址在线观看| 欧美啪啪成人vr| 狠狠88综合久久久久综合网| 亚洲国产精品欧美一二99| 欧美激情区在线播放| 国产一区二区丝袜高跟鞋图片| 久久精品国产视频| 香蕉av777xxx色综合一区| 国产免费成人在线视频| 久久成人一区二区| 欧美一区二区三区在线免费观看| 国产日韩欧美在线看| 亚洲国产精品一区制服丝袜 | 欧美国产日产韩国视频| 一本色道久久综合亚洲91| 久久国产视频网| 亚洲欧洲日本mm| 欧美一区二区三区视频在线| 在线电影国产精品| 亚洲欧美欧美一区二区三区| 国内精品视频666| 亚洲视频中文字幕| 国内精品视频在线观看| 一区二区三区四区精品| 国产日韩欧美一区二区| 日韩午夜精品| 国产视频在线观看一区 | 久久久福利视频| 亚洲免费高清| 久久亚洲风情| 亚洲新中文字幕| 欧美国产一区二区在线观看| 亚洲自拍三区| 欧美日韩成人精品| 欧美在线免费| 欧美视频四区| 亚洲片在线观看| 国产亚洲精品bv在线观看| aa级大片欧美| 一区二区三区在线看| 亚洲欧美在线视频观看| 亚洲日本无吗高清不卡| 久久精品国产77777蜜臀| 亚洲看片免费| 麻豆精品在线播放| 亚洲欧美成人网| 欧美三级韩国三级日本三斤| 亚洲国产精品久久久久秋霞不卡| 国产精品天美传媒入口| 一二美女精品欧洲|