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