聶麗文
(深圳職業(yè)技術(shù)學(xué)院 計算機工程學(xué)院,廣東 深圳 518055)
一種單片機鍵盤的實現(xiàn)方法
聶麗文
(深圳職業(yè)技術(shù)學(xué)院 計算機工程學(xué)院,廣東 深圳 518055)
介紹了一種單片機應(yīng)用系統(tǒng)中鍵盤的實現(xiàn)方法,該方法使用的單片機資源為一路A/D轉(zhuǎn)換和一個外部中斷,硬件主要包括一個串聯(lián)的電阻網(wǎng)絡(luò)、一個施密特觸發(fā)器;軟件采用中斷方式處理按鍵.該方法的原理是利用每個按鍵對應(yīng)的不同電阻對VCC進行分壓,再經(jīng)A/D轉(zhuǎn)換為其對應(yīng)的不同的數(shù)字量,且當(dāng)有鍵被按下時使施密特觸發(fā)器產(chǎn)生下降沿,引起單片機外部中斷,單片機通過中斷方式進行鍵盤處理.
單片機;鍵盤;A/D轉(zhuǎn)換;施密特觸發(fā)器.
在單片機應(yīng)用系統(tǒng)中經(jīng)常需要連接一些外部設(shè)備,其中鍵盤是構(gòu)成人機對話的一種基本方式,具有向單片機輸入數(shù)據(jù)、命令等功能,通常實現(xiàn)單片機鍵盤的方法有:獨立式鍵盤法、矩陣鍵盤法、專用鍵盤控制芯片法[1].
1)獨立鍵盤法.也稱為直接連接法,是將按鍵開關(guān)直接連接到單片機的I/O線上,一個按鍵連接一根I/O線.此方法硬件和軟件都較簡單.當(dāng)按鍵個數(shù)很少時,可以采用這種方法,有幾個按鍵就需要占用幾根I/O線,這種方法鍵盤占用單片機的I/O資源較多.
2)矩陣鍵盤法.一般地,當(dāng)按鍵個數(shù)大于8時,多采用此法,將按鍵排列成矩陣形式,將矩陣的行線和列線分別連接到單片機的I/O線,所占用單片機的I/O線數(shù)為該矩陣的行數(shù)與列數(shù)之和.可見,矩陣法雖然比獨立按鍵法占用的單片機I/O資源少,但當(dāng)按鍵較多時,仍然需要占用較多的單片機I/O資源.
3)專用鍵盤控制芯片法.有時受到單片機的I/O口數(shù)量的限制,不能采用上述方式實現(xiàn)鍵盤,則可以采用外圍專用鍵盤控制芯片(如具有I2C接口的鍵盤控制芯片ZLG7290)來實現(xiàn)單片機鍵盤.該方法可以實現(xiàn)多至64個按鍵組成的鍵盤,只需要占用3根單片機的I/O線.此法,硬件上添加了專用芯片,軟件上通過控制該芯片實現(xiàn)鍵盤功能.
文獻[2-3] 給出單片機A/D端口擴展鍵盤的方法,本文介紹另一種實現(xiàn)單片機鍵盤的方法,即通過A/D轉(zhuǎn)換法實現(xiàn)鍵盤輸入.
A/D轉(zhuǎn)換方法通過一個串聯(lián)電阻網(wǎng)絡(luò)、一個施密特觸發(fā)器、一路空閑的A/D,以中斷的方式實現(xiàn)單片機系統(tǒng)的鍵盤輸入,如圖1所示.占用單片機的資源僅為一路A/D和一個外部中斷.
2.1 工作原理
如圖1所示,該鍵盤電路由電阻R1至R8、按鍵K1至K8(不限于8個按鍵,可以多至幾十個)、公共電阻R、電容C、一個施密特觸發(fā)器、一路A/D組成.當(dāng)無按鍵被按下時,A/D的輸入電壓Vin為低,施密特觸發(fā)器輸出為高電平,中斷信號無效;當(dāng)有按鍵被按下時,Vin產(chǎn)生一定的電壓值,施密特觸發(fā)器的輸入端產(chǎn)生由零電壓向正電壓的變化,使施密特觸發(fā)器觸發(fā).這樣,施密特觸發(fā)器的輸出端就會產(chǎn)生一個下降沿,從而引起單片機中斷.
圖1 A/D轉(zhuǎn)換法實現(xiàn)鍵盤的原理圖
可以根據(jù)所選的施密特觸發(fā)器的不同,通過調(diào)整R1-R8以及R的值,使Vin的變化能夠引起施密特觸發(fā)器觸發(fā).也就是說,選擇各按鍵對應(yīng)的電阻值時要注意,按鍵對應(yīng)的電阻(R1至R8)值之和與公共電阻R對VCC的分壓產(chǎn)生的Vin應(yīng)高于施密特觸發(fā)器的觸發(fā)電壓,這樣才能保證每個按鍵按下時,都會使施密特觸發(fā)器觸發(fā),在其輸出端產(chǎn)生一個下降沿,從而引起單片機中斷.中斷程序流程圖如圖2所示.進入中斷服務(wù)程序后,啟動A/D,并置位按鍵標(biāo)志位.主程序流程圖如圖3所示.鍵盤處理模塊流程圖如圖4所示.在鍵盤處理模塊中,首先判斷按鍵標(biāo)志是否被置位,若是,則說明有按鍵被按下,則需讀取A/D轉(zhuǎn)換的結(jié)果.由于不同按鍵被按下時Vin不同,則A/D轉(zhuǎn)換結(jié)果值不同,對所讀取的A/D轉(zhuǎn)換的結(jié)果進行處理后即可據(jù)此判斷出被按下的是哪個鍵,獲取相應(yīng)鍵值,最后將按鍵標(biāo)志清除.
電容C和施密特觸發(fā)器,都保證了鍵盤在沒有按鍵被按下或按鍵抖動時,不會引起單片機中斷.只有當(dāng)按鍵被按下時,單片機中斷才會被觸發(fā).電容C的取值參考設(shè)計實例.
2.2 設(shè)計實例
圖2 中斷程序流程
圖3 主程序流程
圖4 鍵盤處理模塊流程
圖5 設(shè)計實例
如圖5所示,單片機使用STM32F103,它內(nèi)含12位線性A/D,VCC為3.6V,參考電壓VREF為3.6V,按鍵使用硅膠碳膜按鍵,施密特觸發(fā)器采用的是74HC14.
首先是公共電阻R和電容C的選擇.公共電阻R的阻值應(yīng)遠大于按鍵的接觸電阻,硅膠碳膜按鍵的接觸電阻小于100 Ω,此處電阻R選擇1 MΩ,電容C選用0.1μf.電容C宜選的小些,它影響到從按鍵按下至電容C充電至施密特觸發(fā)器被觸發(fā)引起單片機中斷的時間,也決定了按鍵的響應(yīng)時間.
其次是電阻R1~R8(本例以8個按鍵為例)的選擇.R1~R8都要選擇常用電阻序列中的值.方法是,先根據(jù)按鍵個數(shù)和VCC以及施密特觸發(fā)器的觸發(fā)電壓值假定各按鍵對應(yīng)的Vin值,計算出各按鍵對應(yīng)的電阻值,在常用電阻序列表中找出各電阻值的接近值.然后,再根據(jù)確定的R1~R8反過來計算出各按鍵對應(yīng)的Vin值即可.
在該實例中,選擇電阻R1~R8的步驟如下:
1)先預(yù)設(shè)各按鍵對應(yīng)的Vin的差值, 12位線性A/D,參考電壓VREF為3.6V,則A/D轉(zhuǎn)換的分辨率為0.879 mV,20倍的分辨率對應(yīng)的是17.6 mV,采用按鍵對應(yīng)的Vin的差值大于等于17.6mV即可.但在該例中,按鍵個數(shù)只有8個,我們可以選擇按鍵對應(yīng)的Vin的差值大些,如選擇按鍵對應(yīng)的Vin差值為0.1V,這樣我們預(yù)設(shè)8個按鍵K1~K8對應(yīng)的Vin1~Vin8的值分別為:3.5、3.4、3.3、3.2、3.1、3.0、2.9、2.8V.說明:當(dāng)鍵盤的按鍵個數(shù)增多時,可以減小按鍵對應(yīng)的Vin的電壓差(這里只要大于17.6mV即可),可見該例中可以擴充按鍵的個數(shù).考慮到采用的施密特觸發(fā)器74HC14,使其輸出產(chǎn)生下降沿翻轉(zhuǎn)的輸入電壓為2.17V(據(jù)74HC14的DC參數(shù)表可知,當(dāng)其VCC為3.6V時,使其輸出產(chǎn)生下降沿跳變的輸入電壓為3.6V*60%=2.17V),所以要保證各按鍵對應(yīng)的Vin都必須大于2.17V, 這樣的話,理論上按鍵的個數(shù)擴展至幾十個沒有問題.
2)根據(jù)上述預(yù)設(shè)的各按鍵對應(yīng)的Vin值,計算出各按鍵對應(yīng)的電阻值R1~R8,然后再在常用電阻序列表中找出阻值接近的電阻(注意電阻值要遠大于按鍵的接觸電阻).
據(jù)預(yù)估的Vin值求R1~R8的公式如下:(該例中VCC=3.6V, R=1 MΩ)
當(dāng)K1鍵按下時: [VCC/(R+R1)]*R=Vin1,可以求出R1;
當(dāng)K2鍵按下時:[VCC/(R+R1+R2)]*R=Vin2, 可以求出R2;
……
當(dāng)Ki鍵按下時: [VCC/(R+∑Ri)]*R=Vini(∑Ri=R1+R2+…+Ri),可以求出Ri.
例如,求R1時(由于單片機中A/D的輸入電阻很大,與R并聯(lián)時可以不考慮),K1接通,其它按鍵無論是斷開或接通,都有公式:[3.6V/(1 MΩ+R1)]*1 MΩ=3.5V,求得:R1≈28 KΩ,查常用電阻系列,選其中的接近值R1=27 KΩ(在“精度位5%的碳膜電阻的標(biāo)稱值系列”表中查找),最后確定了R1取值為27 KΩ.同理,得到其他的電阻值如圖5所示.
可見,當(dāng)有2個及以上的按鍵同時按下時,只有最低的一個按鍵有效.此方法不能識別2個及以上的按鍵同時按下.
由R1再反過來計算K1按下時,對應(yīng)的Vin值:
Vin1=3.6V*[1M Ω/(R1+1MΩ)]=3.505V,
則軟件處理時設(shè)置K1鍵的電壓有效值為:3.505V±(0.1V*20%),允許誤差為按鍵對應(yīng)的Vin的差值的20%. 則對應(yīng)于K1鍵,A/D輸出的取值范圍為:
上限:(3.505+0.02)/3.6*4096≈4011,
下限:(3.505-0.02)/3.6*4096≈3965.
則當(dāng)A/D連續(xù)采樣4個值都在3965~4011范圍內(nèi),就可以認為是此鍵K1被按下了.同理,可以計算出K1~K8鍵對應(yīng)的電壓為3.505~2.799V;得到K2~K8對應(yīng)的A/D輸出取值范圍.
綜上所述,此例中施密特觸發(fā)器采用74HC14,據(jù)其DC參數(shù)表可知,當(dāng)VCC為3.6V時,使其輸出產(chǎn)生下降沿翻轉(zhuǎn)的輸入電壓值約為2.17V,而上述各鍵被按下時對應(yīng)的電壓值遠高于該值.軟件處理中當(dāng)采樣值低于2V時均認為是抖動,舍棄.當(dāng)連續(xù)采樣4個電壓差值在按鍵對應(yīng)的電壓差值的20%(如此例中為0.1V*20%)內(nèi)時,才確定該按鍵被按下.
本文所述單片機鍵盤的實現(xiàn)方法已經(jīng)在多個單片機相關(guān)項目中應(yīng)用,能可靠地實現(xiàn)鍵盤的功能.在實際中若使用的單片機含有A/D且有一路空閑,且單片機的I/O資源較緊張時,采用此方法實現(xiàn)單片機鍵盤是個不錯的選擇.該方法不能處理多個按鍵同時按下的情況,當(dāng)多個按鍵同時被按下時,只有編號較低的按鍵有效.根據(jù)單片機的VCC以及所使用的施密特觸發(fā)器的不同,此法所能連接按鍵的個數(shù)有所不同,一般可連接十幾個到幾十個按鍵.
[1] 張毅剛.單片機原理及接口技術(shù)[M].北京:人民郵電出版社,2011.
[2] 常波.利用單片機A/D端口擴展鍵盤的方法[J].單片機與嵌入式系統(tǒng)應(yīng)用,2001(8):77.
[3] 尹授遠.通過單片機A/D方式實現(xiàn)鍵盤輸入的方法[J].儀器儀表用戶,2001(3):38-39.
A Method for Realizing MCU Keyboard
NlE Liwen
(School of Computer Engineering, Shenzhen Polytechnic, Shenzhen, Guangdong 518055, China)
This paper introduces a method to realize the keyboard in the application system of MCU, in which only one A/D channel and an external interrupt of MCU’s resources are used. In hardware, a resistance network and a Schmitt trigger are used. In software, MCU process keyboard by Interrupt mode. The principle of this method is to use the different resistance of each key to divide voltage of VCC, so MCU will get the different results of A/D. When a key is pressed, the Schmitt trigger will get a falling edge output, thus causing an external interrupt of MCU.
MCU; keyboard; A/D; Schmitt trigger
TP272
A
1672-0318(2016)01-0015-04
10.13899/j.cnki.szptxb.2016.01.003
2015-09-02
聶麗文(1966-),女,江蘇鎮(zhèn)江人,副教授,工學(xué)碩士,研究方向:計算機應(yīng)用.