单片机--矩阵键盘实验
目的:利用“模塊化單片機教學實驗平臺”,加深對單片機與矩陣鍵盤的接口電路設計以及程序設計的理解。
任務:1、學習獨立式按鍵的查詢識別方法。
2、非編碼矩陣鍵盤的行反轉法識別方法。
3、掌握鍵盤接口的基本特點,了解獨立鍵盤和矩陣鍵盤的應用方法。
4、掌握鍵盤接口的硬件設計方法,軟件程序設計和貼士排錯能力。
5、掌握利用Keil51軟件對程序進行編譯。
6、會根據實際功能,正確選擇單片機功能接線,編制正確程序。對實驗結果
1、MCS51系列單片機的P0~P3口作為輸入端口使用時必須先向端口寫入“1”。
2、用查詢方式檢測按鍵時,要加入延時(通常采用軟件延時10~20mS)以消除抖動。
3、識別鍵的閉合,通常采用行掃描法和行反轉法。行掃描法是使鍵盤上某一行線為低電平,而其余行接高電平,然后讀取列值,如讀列值中某位為低電平,表明有鍵按下,否則掃描下一行,直到掃完所有行。
行反轉法識別閉合鍵時,要將行線接一并行口,先讓它工作在輸出方式,將列線也接到一個并行口,先讓它工作于輸入方式,程序使CPU通過輸出端口在各行線上全部送低電平,然后讀入列線值,如此時有某鍵被按下,則必定會使某一列線值為0。然后,程序對兩個并行端口進行方式設置,使行線工作于輸入方式,列線工作于輸出方式,并將剛才讀得的列線值從列線所接的并行端口輸出,再讀取行線上輸入值,那么,在閉合鍵所在行線上的值必定為0。這樣,當一個鍵被接下時,必定可以讀得一對唯一的行線值和列線值。由于51單片機的并口能夠動態地改變輸入輸出方式,因此,矩陣鍵盤采用行反轉法識別最為簡便。
行反轉法識別按鍵的過程是:首先,將4個行線作為輸出,將其全部置0,4個列線作為輸入,將其全部置1,也就是向P1口寫入0xF0;假如此時沒有人按鍵,從P1口讀出的值應仍為0xF0;假如此時1、4、7、0四個鍵中有一個鍵被按下,則P1.6被拉低,從P1口讀出的值為0xB0;為了確定是這四個鍵中哪一個被按下,可將剛才從P1口讀出的數的低四位置1后再寫入P1口,即將0xBF寫入P1口,使P1.6為低,其余均為高,若此時被按下的鍵是“4”,則P1.1被拉低,從P1口讀出的值為0xBE;這樣,當只有一個鍵被按下時,每一個鍵只有唯一的反轉碼,事先為12個鍵的反轉碼建一個表,通過查表就可知道是哪個鍵被按下了。
使用掃描法通過矩陣鍵盤(2行4列,一共八個按鍵)控制8個LED燈的點亮。按下第一行第一列的按鍵使LED1點亮,其他LED熄滅;按下第一行第二列的按鍵使LED2點亮,其他LED熄滅;按下第一行第三列的按鍵使LED3點亮,其他LED熄滅;按下第一行第四列的按鍵使LED4點亮,其他LED熄滅;按下第二行第一列的按鍵使LED5點亮,其他LED熄滅;按下第二行第二列的按鍵使LED6點亮,其他LED熄滅;按下第二行第三列的按鍵使LED7點亮,其他LED熄滅;按下第二行第四列的按鍵使LED8點亮,其他LED熄滅。
圖1 LED電路圖
圖2 按鍵電路圖
注:把撥碼開關(DIP)撥到斷開的一側。該矩陣鍵盤只用到前兩行,即2*4的矩陣鍵盤。
表1 硬件連線表
| CPU_CORE_51 | MAIN_BOARD |
| P2:P1.0-P1.7 | J14:LINE0-COLUM3 |
| P3:P2.0-P2.7 | J48:LED1-LED8 |
注意:實驗箱的AT89S52單片機的晶振頻率為11.0592MHz!
①關掉實驗電源。將CPU 板插接在JK1、JK2 上,注意CPU 板的插接方向。按照前面連接關系表將硬件連接好。
②將AT89S52 芯片插在CPU 板的CPU 插座上(注意不要插反)。母板上電。
③運行Keil 開發環境,按照“模塊化單片機教學實驗平臺配套的實驗指導書1.2.3 節”介紹的方法建立工程exp11.uV2,CPU 為AT89S52,不包含啟動文件STARTUP.A51。
④編寫匯編語言源程序exp11.asm 完成基本實驗的功能。把源程序exp11.asm加入到工程exp11.uV2,并設置工程exp11.uV2 屬性,將其晶振頻率設置為11.0592MHz,選擇輸出可執行文件。
⑤構造(Build)工程exp11.uV2。
⑥通過PROGISP 燒寫軟件,利用ISP 下載線(見“模塊化單片機教學實驗平臺配套的實驗指導書1.3 節”)把HEX 文件下載到單片機中。
⑦下載成功后,通過按下不同按鍵,觀察LED1~7 的亮滅。
圖3 實驗結果圖
本次實驗需要先判別整個鍵盤有無按鍵按下,從第0列開始逐列檢測檢測,可以檢測出哪個按鍵被按下。然后用到去除按鍵的抖動。該實驗難度較高,相比以往實驗更考驗綜合能力。如何使用掃線法判斷所在行是實驗的難點所在。實驗中因為對掃線法的理解不深入,在實驗中沒能完成實驗。試驗后仔細閱讀書上的解釋和題本提供的案例程序,我知道了自己實驗失敗的原因所在,并重新設計了程序和實驗。通過學習后,對掃描鍵盤的程序更加了解,將理論上的結果和自己實驗做的結果相印證,對書本上知識掌握的更加牢固,對代碼程序有更加深刻的理解。在實驗中,對模板的使用更加熟練,對電路的連接更加熟練。我對于矩陣鍵盤的工作方式有了更進一步的認識,也對掃描法查詢矩陣鍵號的方法編寫有了更進一步的掌握。單片機提高重在實踐,想要學好單片機,軟件編程必不可少。
(1)基本實驗
ORG 0000H
LJMP MAIN
MAIN:MOV P1,#11110000B;給p1口送數11110000
MOV A,P1?????? ;獲取P1口的電平
XRL A,#11110000B
;將P1口電平與11110000異或運算
;若有按鍵按下,A不為0
JZ MAIN??????? ;無按鍵按鍵則返回
LCALL TIME_??? ;跳轉到延時程序
MOV P1,#11110000B
MOV A,P1
XRL A,#11110000B?? ;該部分操作與上述操作相同
MOV R3,A?????? ;保存此時A的值
JZ MAIN???? ???? ;確認有按鍵按下
MOV R0,#11110111B;掃描法判斷
MOV R1,#0????? ;R1存儲列的權值
I: ???MOV P1,R0????? ;將R0值傳遞給P1
MOV A,P1?????? ;讀取P1的值
AAA0:JNB ACC.4,AAA1
;如果ACC的第四位(即第一列)不為零
MOV R1,#0????? ;r1存0
LJMP OK???? ;跳轉到計算環節
AAA1: JNB ACC.5,AAA2 ;同上,判斷第二列
MOV R1,#01
LJMP OK
AAA2:JNB ACC.6,AAA3? ;同上,判斷第三列
MOV R1,#02
LJMP OK
AAA3: JNB ACC.7,AAA4 ;同上,判斷第四列
MOV R1,#03
LJMP OK
AAA4:MOV A,R0
JNB ACC.2,MAIN ;判斷是否結束
RR A??????? ;環移
MOV R0,A
MOV A,R1
MOV R1,A???
LJMP I
TIME_:MOV R0,#05
TT: ??MOV R1,#250
DJNZ R1,$
DJNZ R0,TT
RET
OK:???? ;判斷所在行并送數
MOV A,R1
ADD A,R0
MOV R0,A
MOV A,#1
INC R0
AAA:CJNE R0,#0,BBB
RL A
INC A
LJMP AAA
BBB:MOV P2,A
LJMP MAIN
END
(2)擴展實驗
ORG 0000H
LJMP MAIN
MAIN:MOV P1,#11110000B;送數11110000
MOV A,P1??? ;取當前P1的值
XRL A,#11110000B;與11110000與或運算
JZ MAIN???? ;如果為0則跳轉回
LCALL TIME_ ;延遲子系統
MOV P1,#11110000B
MOV A,P1
XRL A,#11110000B
JZ MAIN???? ;再次判斷確定非誤觸
MOV R3,A??? ;存儲當前A信息
MOV P1,#00001111B? ;判斷所在列
MOV A,P1
XRL A,#00001111B
MOV R4,A??? ;存至R4
MOV A,R3
JNB ACC.1,NEXT1
MOV R3,#4;若為第二行則若R3存4,否則存0
LJMP NEXT2
NEXT1: MOV R3,#0;判斷行,依次為0,1,2,3
NEXT2:MOV A,R4
JNB ACC.4,NEXT3
MOV R4,#0
LJMP NEXT7
NEXT3:JNB ACC.5,NEXT4
MOV R4,#1
LJMP NEXT7
NEXT4:JNB ACC.6,NEXT5
MOV R4,#2
LJMP NEXT7
NEXT5:MOV R4,#3
NEXT7:MOV A,R3
ADD A,R4????? ;將兩個權值相加
MOV P2,A????? ;送至P2
LJMP MAIN
TIME_:MOV R0,#05
TT:?? MOV R1,#250
DJNZ R1,$
DJNZ R0,TT
RET
END
總結
以上是生活随笔為你收集整理的单片机--矩阵键盘实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器无法接收微信公众号xml,得不到易
- 下一篇: flex 皮肤制作教程