?? 初學者寫的最簡單矩陣鍵盤掃描程序.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0048)http://www.51fuzi.com/BBS/Print.asp?ThreadID=254 -->
<HTML><HEAD><TITLE>初學者寫的最簡單矩陣鍵盤掃描程序</TITLE>
<META http-equiv=content-Type content=text/html;charset=gb2312>
<META content=嵌入式系統,單片機技術,網絡技術,電子技術實踐經驗... name=keywords>
<META content=關于微處理器軟硬件開發技術論壇 name=description>
<SCRIPT src="初學者寫的最簡單矩陣鍵盤掃描程序.files/BBSXP.js"></SCRIPT>
<SCRIPT src="初學者寫的最簡單矩陣鍵盤掃描程序.files/bbs.js"></SCRIPT>
<LINK href="初學者寫的最簡單矩陣鍵盤掃描程序.files/bbs.css" rel=stylesheet>
<META content="MSHTML 6.00.2900.3020" name=GENERATOR></HEAD>
<BODY onload=window.print()>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
<TBODY>
<TR>
<TD>- <B>夫子論壇首頁</B> ( http://www.51fuzi.com/BBS/Default.asp )<BR>--
<B>單片機技術論壇</B> ( http://www.51fuzi.com/BBS/ShowForum.asp?ForumID=6
)<BR>--- <B>初學者寫的最簡單矩陣鍵盤掃描程序 </B>(
http://www.51fuzi.com/BBS/ShowPost.asp?ThreadID=254 ) <BR><BR>
<HR>
<P>作者:kjf888<BR>發表時間:2006-8-28 9:18:41<BR><BR>
<P><BR>大小[2739] 更新時間[2006-7-1] 閱讀[4632]次/評論[0]次 歡迎度[ 600]
<BR> 這是站長初學者寫的最簡單、最詳細、效率最高的矩陣鍵盤掃描程序,只用了四條常用命令(MOV/送數、JB/高電平轉移、JMP/直接轉移、RET/子程序返回),保證初學者一看就懂!本程序已經在本站電子實驗板上驗證通過,占用CPU時間少,效率高,被選作單片機的測試程序!<BR> 矩陣按鍵掃描程序是一種節省IO口的方法,按鍵數目越多節省IO口就越可觀,本程序的思路跟書上一樣:先判斷某一列(行)是否有按鍵按下,再判斷該行(列)是那一只鍵按下。但是,在程序的寫法上,站長采用了最簡單的方法,使得程序效率最高。<BR> 本程序中,如果檢測到某鍵按下了,就不再檢測其它的按鍵,這完全能滿足絕大多數需要,又能節省大量的CPU時間。另外,本人認為鍵盤用延時程序來消除抖動,完全是浪費時間。試想,如果不用中斷執行(用中斷執行需要更多的硬件資源)的方法來掃描鍵盤,每秒鐘掃描20-100次,每次都要延時10-20MS的話,我們的單片機還有多少時間做正事呢?<BR> 其實,延時的這段時間,CPU可以做其它的事呀。所以,本鍵盤掃描程序的前面后面都可以加入少少代碼,既可以達到完美的消抖動效果,又可以擴展其它的功能(例如按鍵封鎖、按鍵長按等按鍵功能復用!)<BR> 本鍵盤掃描子程序名叫key,每次要掃描時用call
key調用即可。以下子程序內容:</P>
<P>key:mov p0,#00001111b;上四位和下四位分別為行和列,所以送出高低電壓檢查有沒有按鍵按下<BR>jmp
k10;跳到K10處開始掃描,這里可以改成其它條件轉移指令來決定本次掃描是否要繼續,例如減1為0轉移或者位為1或0才轉移,這主要用來增加功能,確認上一按鍵功能是否完成?是否相當于經過了延時?是否要封鎖鍵盤?<BR>goend:jmp
kend;如果上面判斷本次不執行鍵盤掃描程序,則立即轉到程序尾部,不要浪費CPU的時間<BR>k10:jb
p0.0,k20;掃描正式開始,先檢查列1四個鍵是否有鍵按下,如果沒有,則跳到K20檢查列2<BR>k11:mov
p0,#11101111b;列1有鍵按下時,P0.0變低,到底是那一個鍵按下?現在分別輸出各行低電平<BR>jb
p0.0,k12;該行的鍵不按下時,p0.0為高電平,跳到到K12,檢查其它的行<BR>mov
r1,#1;如果正好是這行的鍵按下,將寄存器R0寫下1,表示1號鍵按下了<BR>k12:mov p0,#11011111b<BR>jb
p0.0,k13<BR>mov r1,#2;如果正好是這行的鍵按下,將寄存器R0寫下2,表示2號鍵按下了<BR>k13:mov
p0,#10111111b<BR>jb p0.0,k14<BR>mov
r1,#3;如果正好是這行的鍵按下,將寄存器R0寫下3,表示3號鍵按下了<BR>k14:mov p0,#01111111b<BR>jb
p0.0,kend;如果現在四個鍵都沒有按下,可能按鍵松開或干擾,退出掃描(以后相同)<BR>mov
r1,#4如果正好是這行的鍵按下,將寄存器R0寫下4,表示4號鍵按下了<BR>jmp kend;已經找到按下的鍵,跳到結尾吧</P>
<P>k20:jb p0.1,k30;列2檢查為高電平再檢查列3、4 <BR>k21:mov
p0,#11101111b;列2有健按下時,P0.0會變低,到底是那一行的鍵按下呢?分別輸出行的低電平<BR>jb
p0.1,k22;該行的鍵不按下時p0.0為高電平,跳到到K22,檢查另外三行<BR>mov
r1,#5;如果正好是這行的鍵按下,將寄存器R0寫下5,表示5號鍵按下了(以后相同,不再重復了)<BR>k22:mov
p0,#11011111b<BR>jb p0.1,k23<BR>mov r1,#6<BR>k23:mov p0,#10111111b<BR>jb
p0.1,k24<BR>mov r1,#7<BR>k24:mov p0,#01111111b<BR>jb p0.1,kend<BR>mov
r1,#8<BR>jmp kend;已經找到按下的鍵,跳到結尾吧(以后相同,不要重復了)</P>
<P>k30:jb p0.2,k40<BR>k31:mov p0,#11101111b<BR>jb p0.2,k32<BR>mov
r1,#9<BR>k32:mov p0,#11011111b<BR>jb p0.2,k33<BR>mov r1,#10<BR>k33:mov
p0,#10111111b<BR>jb p0.2,k34<BR>mov r1,#11<BR>k34:mov p0,#01111111b<BR>jb
p0.2,kend<BR>mov r1,#12<BR>jmp kend<BR> ………………更詳細內容請訪問<A
href="http://www.51dz.com/n.asp?id=12559&i=kjf888"
target=_blank>http://www.51dz.com/n.asp?id=12559&i=kjf888</A><BR></P>
<P></P>
<HR>
<P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD align=middle><IFRAME id=baiduframe border=0 marginWidth=0
frameSpacing=0 marginHeight=0
src="res://C:\WINDOWS\system32\shdoclc.dll/dnserror.htm"
frameBorder=0 width=670 scrolling=no
height=40> </IFRAME><BR><BR>Script Execution Time:15ms
</TD></TR></TBODY></TABLE>
<SCRIPT>BBSxpBottom()</SCRIPT>
<!--<iframe height=0 width=0 name=hiddenframe></iframe>--></P></TR></TBODY></TABLE></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -