【摘 要】單片機矩陣鍵盤是常用的人機對話輸入設備,本文提出一種新的矩陣鍵盤掃描程序設計,可以大大李節(jié)省系統資源,提高效率。
【關鍵詞】單片機 矩陣鍵盤 掃描程序
鍵盤是微型計算機系統中最常用的人機對話輸入設備。在單片機應用系統中,為了控制系統的工作狀態(tài),以及向系統輸入數據,應用系統需要單獨設計專用的小鍵盤。矩陣按鍵掃描程序是一種節(jié)省系統資源的方法,按鍵數目越多節(jié)省的系統資源就越可觀,本程序的思路:先判斷某一列(行)是否有按鍵按下,再判斷該行(列)是那一只鍵按下。但是,在程序的寫法上,采用了最簡單的方法,使得程序效率最高。
一、設計理念
本程序中,如果檢測到某鍵按下了,就不再檢測其它的按鍵,這完全能滿足絕大多數需要,又能節(jié)省大量的CPU時間。另外,鍵盤用延時程序來消除抖動,完全是浪費時間。試想,如果不用中斷執(zhí)行(用中斷執(zhí)行需要更多的硬件資源)的方法來掃描鍵盤,每秒鐘掃描20-100次,每次都要延時10-20MS的話,單片機還有多少時間做正事呢?其實,延時的這段時間,CPU可以做其它的事務。所以,本鍵盤掃描程序的前面后面都可以加入一些代碼,既可以達到完美的消抖動效果,又可以擴展其它的功能(例如按鍵封鎖、按鍵長按等按鍵功能復用)。
二、設計程序
本鍵盤掃描子程序名叫key,每次要掃描時用call key調用即可。以下子程序內容:
key:mov p0,#00001111b; 上四位和下四位分別為行和列,所以送出高低電壓檢查有沒有按鍵按下
jmp k10; 跳到K10處開始掃描,這里可以改成其它條件轉移指令來決定本次掃描是否要繼續(xù),例如減1為0轉移或者位為1或0才轉移,這主要用來增加功能,確認上一按鍵功能是否完成?是否相當于經過了延時?是否要封鎖鍵盤?
goend:jmp kend; 如果上面判斷本次不執(zhí)行鍵盤掃描程序,則立即轉到程序尾部,不要浪費CPU的時間
k10:jb p0.0,k20; 掃描正式開始,先檢查列1四個鍵是否有鍵按下,如果沒有,則跳到K20檢查列2
k11:mov p0,#11101111b; 列1有鍵按下時,P0.0變低,到底是那一個鍵按下?現在分別輸出各行低電平
jb p0.0,k12; 該行的鍵不按下時,p0.0為高電平,跳到到K12,檢查其它的行
mov r1,#1; 如果正好是這行的鍵按下,將寄存器R0寫下1,表示1號鍵按下了
k12:mov p0,#11011111b
jb p0.0,k13
mov r1,#2;如果正好是這行的鍵按下,將寄存器R0寫下2,表示2號鍵按下了
k13:mov p0,#10111111b
jb p0.0,k14
mov r1,#3;如果正好是這行的鍵按下,將寄存器R0寫下3,表示3號鍵按下了
k14:mov p0,#01111111b
jb p0.0,kend;如果現在四個鍵都沒有按下,可能按鍵松開或干擾,退出掃描(以后相同)
mov r1,#4如果正好是這行的鍵按下,將寄存器R0寫下4,表示4號鍵按下了
jmp kend;已經找到按下的鍵,跳到結尾。
k20:jb p0.1,k30;列2檢查為高電平再檢查列3、4
k21:mov p0,#11101111b;列2有健按下時,P0.0會變低,到底是那一行的鍵按下呢?分別輸出行的低電平。
jb p0.1,k22;該行的鍵不按下時p0.0為高電平,跳到到K22,檢查另外三行。
mov r1,#5;如果正好是這行的鍵按下,將寄存器R0寫下5,表示5號鍵按下了(以后相同,不再重復了)。
k22:mov p0,#11011111b jb p0.1,k23 mov r1,#6
k23:mov p0,#10111111b jb p0.1,k24 mov r1,#7
k24:mov p0,#01111111b jb p0.1,kend mov r1,#8
jmp kend;已經找到按下的鍵,跳到結尾(以后相同,注釋不再重復)
k30:jb p0.2,k40
k31:mov p0,#11101111b jb p0.2,k32 mov r1,#9
k32:mov p0,#11011111b jb p0.2,k33 mov r1,#10
k33:mov p0,#10111111b jb p0.2,k34 mov r1,#11
k34:mov p0,#01111111b jb p0.2,kend mov r1,#12
jmp kend k40:jb p0.3,kend
k41:mov p0,#11101111b jb p0.3,k42 mov r1,#13
k42:mov p0,#11011111b jb p0.3,k43 mov r1,#14
k43:mov p0,#10111111b jb p0.3,k44 mov r1,#15
k44:mov p0,#01111111b jb p0.3,kend mov r1,#16
kend: ret
鍵盤掃描結束了,寄存器R1的值就直接表示了是那個鍵按下的,根據不同的鍵值去執(zhí)行不同的程序,從而實現了十六個矩陣鍵盤掃描,同樣原理,最多可以識別255個按鍵的矩陣掃描??梢悦看捂I盤掃描開始時檢查R0的值是否為0,只有在為0才掃描鍵盤,不為0就證明剛剛掃描過鍵值,相應的按鍵工作還沒有完成。但是必須記得,每個按鍵命令執(zhí)行完成后,要給R0寫上0,表示可以掃描鍵盤。
三、小結
本鍵盤掃描程序的優(yōu)點在于:不用專門的按鍵延時程序,提高了CPU效率,也不用中斷來掃描鍵盤,節(jié)省了硬件資源。另外,本鍵盤掃描程序,每次掃描占用CPU時最短,不論有鍵按下或者無鍵按下都可以在很短的時間完成一次掃描。
參考文獻:
[1]李伍元.淺談單片機非編碼鍵盤工作原理及設計方法[J]. 科技情報開發(fā)與經濟. 2009(02).
[2]鄭敏,楊坤濤.用AT89C2051自身接口實現溫度檢測數碼管動態(tài)顯示和鍵盤掃描[J].安徽科技學院學報. 2006(01)
[3]杜道山,白榮華,田秀英,李從心.伺服控制系統鍵盤掃描程序的處理[J]. 機床與液壓. 2005(01)
作者簡介:
譚艷(1984.04-),女,漢,研究生,助理講師,研究方向:電子工程。