一、原理簡介
鍵盤接口電路是單片機系統設計非常重要的一環,作為人機交互界面里最常用的輸入設備。我們可以通過鍵盤輸入數據或命令來實現簡單的人機通信。在設計鍵盤電路與程序前,我們需要了解鍵盤和組成鍵盤的按鍵的一些知識。
1. 按鍵的分類
一般來說,按鍵按照結構原理可分為兩類,一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關等;另一類是無觸點式開關按鍵,如電氣式按鍵,磁感應按鍵等。前者造價低,后者壽命長。目前,微機系統中最常見的是觸點式開關按鍵(如本學習板上所采用按鍵)。
按鍵按照接口原理又可分為編碼鍵盤與非編碼鍵盤兩類,這兩類鍵盤的主要區別是識別鍵符及給出相應鍵碼的方法。編碼鍵盤主要是用硬件來實現對鍵的識別,非編碼鍵盤主要是由軟件來實現鍵盤的識別。
全編碼鍵盤由專門的芯片實現識鍵及輸出相應的編碼,一般還具有去抖動和多鍵、竄鍵等保護電路,這種鍵盤使用方便,硬件開銷大,一般的小型嵌入式應用系統較少采用。非編碼鍵盤按連接方式可分為獨立式和矩陣式兩種,其它工作都主要由軟件完成。由于其經濟實用,較多地應用于單片機系統中(本學習板也采用非編碼鍵盤)。
2. 按鍵的輸入原理
在單片機應用系統中,通常使用機械觸點式按鍵開關,其主要功能是把機械上的通斷轉換成為電氣上的邏輯關系。也就是說,它能提供標準的TTL 邏輯電平,以便與通用數字系統的邏輯電平相容。此外,除了復位按鍵有專門的復位電路及專一的復位功能外,其它按鍵都是以開關狀態來設置控制功能或輸入數據。當所設置的功能鍵或數字鍵按下時,計算機應用系統應完成該按鍵所設定的功能。因此,鍵信息輸入是與軟件結構密切相關的過程。 對于一組鍵或一個鍵盤,通過接口電路與單片機相連。單片機可以采用查詢或中斷方式了解有無按鍵輸入并檢查是哪一個按鍵按下,若有鍵按下則跳至相應的鍵盤處理程序處去執行,若無鍵按下則繼續執行其他程序。
3. 按鍵的特點與去抖
機械式按鍵再按下或釋放時,由于機械彈性作用的影響,通常伴隨有一定時間的觸點機械抖動,然后其觸點才穩定下來。其抖動過程如圖1(a) 所示,抖動時間的長短與開關的機械特性有關,一般為5 ~ 10 ms。從圖中可以看出,在觸點抖動期間檢測按鍵的通與斷狀態,可能導致判斷出錯。即按鍵一次按下或釋放被錯誤地認為是多次操作,這種情況是不允許出現的。為了克服按鍵觸點機械抖動所致的檢測誤判,必須采取去抖動措施,可從硬件、軟件兩方面予以考慮。一般來說,在鍵數較少時,可采用硬件去抖,而當鍵數較多時,采用軟件去抖。( 本學習板采用軟件去抖方式)。軟件去抖的流程圖如圖1(b) 所示。
圖1
從按鍵的去抖流程圖我們可以知道,檢測到有鍵按下時,應延時等待一段時間(可調用一個5ms~10ms的延遲子程序),然后再次判斷按鍵是否被按下,若此時判斷按鍵仍被按下,則認為按鍵有效,若此時判斷按鍵沒有被按下,說明為按鍵抖動或干擾,應返回重新判斷。鍵盤真正被按下才可進行相應的處理程序,此時基本就算實現了按鍵輸入,進一步的話可以判斷按鍵是否釋放。
二、電路詳解
電路圖如圖2 所示。
圖2
從圖2 中可知獨立式按鍵采用每個按鍵單獨占用一根I/O 口線結構。當按下和釋放按鍵時,輸入到單片機I/O 端口的電平是不一樣的,因此可以根據不同端口電平的變化判斷是否有按鍵按下以及是哪一個按鍵按下。從圖2(a) 中可以看出,按鍵和單片機引腳連接并加了上拉電阻,這樣當沒有按鍵按下的時候,I/O 輸入的電平是高電平,當有按鍵按下的時候,I/O 輸入的電平是低電平。
雖然獨立式按鍵電路配置靈活,軟件結構簡單,但每個按鍵必須占用一根I/O 口線,因此,在按鍵較多時,I/O 口線浪費較大。對于比較復雜的系統或按鍵比較多的場合,可以用到矩陣鍵盤,圖2(b) 中所示的為4×4的矩陣式鍵盤,其他矩陣式鍵盤的設計方法類似。
4×4 的矩陣式鍵盤由4 根行線和4 根列線交叉構成,按鍵位于行列的交叉點上,這樣就構成了16 個按鍵。其中交叉點的行列線是不連接的,當按鍵按下的時候,此交叉點處的行線和列線導通。圖2(b) 行線通過上拉電阻接到VCC 上。當無鍵按下時,行線處于高電平狀態;當有鍵按下時,行、列線在交點導通,此時,行線電平將由與此行線相連的列線電平決定。這是識別按鍵是否按下的關鍵。然而,矩陣鍵盤中的每條行線與4 條列線相交,交點的按鍵按下與否均影響該鍵所在行線和列線的電平,各按鍵間將相互影響,鍵分析時必須將行線、列線信號配合起來作適當處理,才能確定閉合鍵的位置。
值得注意的是本文介紹的矩陣鍵盤,在傳統的矩陣鍵盤的輸出端加了一個四輸入與門芯片74HC21。當四路輸入有一個為低電平的時候,輸出為低電平。將74HC21 的輸出端接到單片機的外部中斷0(P32 管腳)上,這樣在實時性要求較高的情況下,設P00~P03 為全低等待按鍵觸發,當任何一個按鍵按下的情況下,系統都會進入中斷服務程序,提高了鍵盤響應時間,在系統實時性要求較高的情況下非常實用。本文的全部源程序見www.ele169.com。
三、程序設計
本文設計實例關鍵程序如下。
獨立按鍵程序
……
#define keyio P0 ( 1)
#define key1 P0_3 ( 2)
……
keyio|=0X0F; ( 3)
if(key1==0) ( 4)
{
delay_nms(20); ( 5)
if(key1==0) ( 6)
{
while(key1==0); ( 7)
return 1; ( 8)
}
}
程序說明:
(1)定義按鍵管腳。
(2)定義按鍵連接管腳。
(3)將按鍵連接管腳輸出高電平,從而接收輸入。
(4)如果此時管腳所連接按鍵被按下。
(5)延時一段時間,去抖作業。
(6)如果此時按鍵仍然被按下,此時按鍵有效。
(7)等待按鍵抬起,死循環,如果按鍵一直按下則一直等待。
(8)返回鍵值。矩陣鍵盤程序
……
#define KEYIO P0 ( 1)
……
code ksp[4]={0x7F,0xBF,0xDF,0xEF}; ( 2)
unsigned char keypad_scan() ( 3)
{
char key,i; ( 4)
KEYIO=0xF0; ( 5)
if (KEYIO!=0xF0) ( 6)
{
for(i=0;i<=3;i++) ( 7)
{
delaykey(10); ( 8)
KEYIO=ksp[i]; ( 9)
delaykey(10); ( 10)
if(KEYIO!=ksp[i]) ( 11)
{
delaykey(10); ( 12)
key=KEYIO; ( 13)
while(KEYIO==key); ( 14)
return(key); ( 15)
}
}
}
}
程序說明:
(1)定義矩陣鍵盤管腳。
(2)將掃描時用到的管腳四種輸出電平狀態定義成一個數組。
(3)按鍵掃描程序。
(4)定義兩個臨時變量key,i。
(5)讓鍵盤管腳的高四位輸出高電平,第四位為低電平,為掃描按鍵準備。
(6)如果此時管腳狀態電平發生變化。
(7)將之前定義的數組中的值賦予管腳,開始逐次掃描。
(8)延時一段時間,去抖。
(9)輸出掃描按鍵的電平。
(10)再延時一段時間。
(11)如果此時按鍵管腳電平依舊不是輸出的默認電平,表示有鍵按下。
(12)延時一段時間,讓電平穩定。
(13)讀取當前按鍵管腳電平,即鍵值。
(14)等待按鍵抬起,死循環,如果按鍵一直按下則一直等待。
(15)返回鍵值。
四、調試要點與實驗現象
接好硬件,通過冷啟動方式將程序所生成的。hex文件下載到單片機運行后,打開串口調試助手軟件,設置好波特率9600,復位單片機,然后按下板上的4×4按鍵中的任意一個,并注意觀串口調試助手上的顯示。(見圖3),可以觀察到在接收窗口有按鍵的數據顯示。
圖3 按鍵通過串口調試助手顯示界面
此外,在本文所附的實驗程序中,其中與串口通信中調用了發送字符函數與發送字符串函數。在沒有仿真器和遇到需要顯示一些提示信息的時候,可以采用串口打印的方式,這樣不僅直觀方便而且不增加其他成本。
五、總結
本文介紹了單片機外接鍵盤的工作原理并給出了實例,通過該文,我們可以知道一個完善的鍵盤控制程序應具備以下功能:
(1) 檢測有無按鍵按下,并采取硬件或軟件措施,消除鍵盤按鍵機械觸點抖動的影響。
(2) 有可靠的邏輯處理辦法。每次只處理一個按鍵,其間對任何按鍵的操作對系統不產生影響,且無論一次按鍵時間有多長,系統僅執行一次按鍵功能程序。
(3) 準確輸出按鍵值(或鍵號),以滿足按鍵功能要求。對于矩陣鍵盤而言,必須將行線、列線信號配合起來作適當處理,才能確定閉合鍵的位置。
此外,按鍵的掃描方式有多種,本文中所述的是程序掃描方式,另外常見的還有定時掃描方式和中斷掃描方式,這些方式均可以在本學習板上實現,因此希望讀者結合前幾講的知識,自行進行程序的編寫與調試。
-
電路
+關注
關注
172文章
5966瀏覽量
172947 -
單片機
+關注
關注
6043文章
44622瀏覽量
638518
原文標題:跟我學51單片機(四):獨立-矩陣鍵盤應用與設計
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論