這是站長初學(xué)者寫的最簡單、最詳細(xì)、效率最高的矩陣鍵盤掃描程序,只用了四條常用命令(MOV/送數(shù)、JB/高電平轉(zhuǎn)移、JMP/直接轉(zhuǎn)移、RET/子程序返回),保證初學(xué)者一看就懂!本程序已經(jīng)在本站電子實(shí)驗(yàn)板上驗(yàn)證通過,占用CPU時(shí)間少,效率高,被選作單片機(jī)的測試程序! 矩陣按鍵掃描程序是一種節(jié)省IO口的方法,按鍵數(shù)目越多節(jié)省IO口就越可觀,本程序的思路跟書上一樣:先判斷某一列(行)是否有按鍵按下,再判斷該行(列)是那一只鍵按下。但是,在程序的寫法上,站長采用了最簡單的方法,使得程序效率最高。 本程序中,如果檢測到某鍵按下了,就不再檢測其它的按鍵,這完全能滿足絕大多數(shù)需要,又能節(jié)省大量的CPU時(shí)間。另外,本人認(rèn)為鍵盤用延時(shí)程序來消除抖動(dòng),完全是浪費(fèi)時(shí)間。試想,如果不用中斷執(zhí)行(用中斷執(zhí)行需要更多的硬件資源)的方法來掃描鍵盤,每秒鐘掃描20-100次,每次都要延時(shí)10-20MS的話,我們的單片機(jī)還有多少時(shí)間做正事呢? 其實(shí),延時(shí)的這段時(shí)間,CPU可以做其它的事呀。所以,本鍵盤掃描程序的前面后面都可以加入少少代碼,既可以達(dá)到完美的消抖動(dòng)效果,又可以擴(kuò)展其它的功能(例如按鍵封鎖、按鍵長按等按鍵功能復(fù)用。 字串2 本鍵盤掃描子程序名叫key,每次要掃描時(shí)用call key調(diào)用即可。以下子程序內(nèi)容:
key:MOV p0,#00001111b;上四位和下四位分別為行和列,所以送出高低電壓檢查有沒有按鍵按下 jmp k10;跳到K10處開始掃描,這里可以改成其它條件轉(zhuǎn)移指令來決定本次掃描是否要繼續(xù),例如減1為0轉(zhuǎn)移或者位為1或0才轉(zhuǎn)移,這主要用來增加功能,確認(rèn)上一按鍵功能是否完成?是否相當(dāng)于經(jīng)過了延時(shí)?是否要封鎖鍵盤? goend:jmp kend;如果上面判斷本次不執(zhí)行鍵盤掃描程序,則立即轉(zhuǎn)到程序尾部,不要浪費(fèi)CPU的時(shí)間 k10:jb p0.0,k20;掃描正式開始,先檢查列1四個(gè)鍵是否有鍵按下,如果沒有,則跳到K20檢查列2 k11:MOV p0,#11101111b;列1有鍵按下時(shí),P0.0變低,到底是那一個(gè)鍵按下?現(xiàn)在分別輸出各行低電平 jb p0.0,k12;該行的鍵不按下時(shí),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號鍵按下了 字串3 k14:MOV p0,#01111111b jb p0.0,kend;如果現(xiàn)在四個(gè)鍵都沒有按下,可能按鍵松開或干擾,退出掃描(以后相同) MOV r1,#4如果正好是這行的鍵按下,將寄存器R0寫下4,表示4號鍵按下了 jmp kend;已經(jīng)找到按下的鍵,跳到結(jié)尾吧
k20:jb p0.1,k30;列2檢查為高電平再檢查列3、4 k21:MOV p0,#11101111b;列2有健按下時(shí),P0.0會(huì)變低,到底是那一行的鍵按下呢?分別輸出行的低電平 jb p0.1,k22;該行的鍵不按下時(shí)p0.0為高電平,跳到到K22,檢查另外三行 MOV r1,#5;如果正好是這行的鍵按下,將寄存器R0寫下5,表示5號鍵按下了(以后相同,不再重復(fù)了) 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;已經(jīng)找到按下的鍵,跳到結(jié)尾吧(以后相同,不要重復(fù)了)
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 字串6 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
鍵盤掃描結(jié)束了,寄存器R1的值就直接表示了是那個(gè)鍵按下的,根據(jù)不同的鍵值去執(zhí)行不同的程序,從而實(shí)現(xiàn)了十六個(gè)矩陣鍵盤掃描,同樣原理,最多可以識別255個(gè)按鍵的矩陣掃描。 我們可以每次鍵盤掃描開始時(shí)檢查R0的值是否為0,只有在為0才掃描鍵盤,不為0就證明剛剛掃描過鍵值,相應(yīng)的按鍵工作還沒有完成。但是必須記得,每個(gè)按鍵命令執(zhí)行完成后,要給R0寫上0,表示可以掃描鍵盤。 本鍵盤掃描程序的優(yōu)點(diǎn)在于:不用專門的按鍵延時(shí)程序,提高了CPU效率,也不用中斷來掃描鍵盤,節(jié)省了硬件資源。另外,本鍵盤掃描程序,每次掃描占用CPU時(shí)最短,不論有鍵按下或者無鍵按下都可以在很短的時(shí)間完成一次掃描。 還有,本程序只使用幾條最常用的匯編命令,MOV/JB/JMP/RET,而這幾條命令是最常用、最易懂、最好學(xué)的命令!有的鍵盤掃描程序還用與呀、或呀、移位呀、查表呀,我都還沒有看懂。 字串5 當(dāng)然,以上只是站長初學(xué)單片機(jī)的一點(diǎn)個(gè)人見解,歡迎廣大單片機(jī)愛好者指正,希望大家將自己最認(rèn)可的鍵盤掃描程序公布出來,讓大家一起分享!最后,祝愿大家學(xué)習(xí)進(jìn)步!工作順利! 說明:本站數(shù)顯FM無線發(fā)射板中雖然不是用矩陣掃描,但是按鍵消抖動(dòng)原理和上面相同,按鍵功能復(fù)用原理也和上面相同,用起來感覺很好!在鍵盤的10MS延時(shí)過程中,CPU剛好可以去做幾件事并在10MS左右做完。所以,產(chǎn)品中凡是要用到按鍵掃描的,都可以讓CPU去做別的事情,鍵盤延時(shí)消抖動(dòng)唯一的好處就是,程序?qū)懫饋頃?huì)方便一點(diǎn)。 |
|