單片機(jī)89S51,4×4矩陣鍵盤,控制16個發(fā)光二極管
用單片機(jī)89S51,4×4矩陣鍵盤,控制16個發(fā)光二極管,程序有點錯誤哪位高手給指點一下。
我所做的矩陣鍵盤控制的發(fā)光二極管只有8個亮8個不亮,和P2口連接的亮和P0口連接的不亮,高手給點意見。
回答:
下列程序已經(jīng)經(jīng)過了 PROTEUS 驗證,可以滿足題目要求。
;----------------------------------------------------------
ORG 0000H
START:
MOV P0, #0 ;顯示初始化
MOV P2, #0 ;全亮
;----------------------------------------------------------
M_LOOP:
CALL KEY_SCAN
JB ACC.4, M_LOOP ;A=16, 就是沒有按下鍵
CALL DISPLAY
SJMP M_LOOP
;----------------------------------------------------------
KEY_SCAN: ;用反轉(zhuǎn)法掃描鍵盤
PUSH B
CLR A ;將用A保存按鍵信息
MOV P3, #0FH ;列線置低電平,行線置高電平
MOV B, P3
JNB B.0, L_J0 ;逐行掃描
JNB B.1, L_J1
JNB B.2, L_J2
JNB B.3, L_J3
MOV A, #16 ;沒有按鍵,A=16
SJMP KEY_END
;------------------------------
L_J3: INC ACC ;加行值
L_J2: INC ACC
L_J1: INC ACC
L_J0: RL A ;行號×4
RL A
;------------------------------
MOV P3, #0F0H ;行線列線電平互換
MOV B, P3
JNB B.4, R_J0 ;逐列掃描
JNB B.5, R_J1
JNB B.6, R_J2
JNB B.7, R_J3
MOV A, #16
SJMP KEY_END
;------------------------------
R_J3: INC ACC ;加列值
R_J2: INC ACC
R_J1: INC ACC
R_J0: ;A=0~F
KEY_END:
POP B
RET
;----------------------------------------------------------
DISPLAY:
MOV P1, A ;輸出到數(shù)碼顯示器
RL A ;乘以2,因為每個鍵值要顯示兩個字節(jié)
MOV B, A ;保存
MOV DPTR, #TABLE1 ;顯示碼表首地址
MOVC A, @A+DPTR ;根據(jù)鍵值查顯示碼
MOV P2, A ;輸出顯示
MOV A, B
INC A ;準(zhǔn)備查第二字節(jié)
MOVC A, @A+DPTR ;根據(jù)鍵值查顯示碼
MOV P0, A
RET
;----------------------------------------------------------
TABLE1:
DB 00H, 01H, 00H, 02H, 00H, 04H, 00H, 08H
DB 00H, 10H, 00H, 20H, 00H, 40H, 00H, 80H
DB 01H, 00H, 02H, 00H, 04H, 00H, 08H, 00H
DB 10H, 00H, 20H, 00H, 40H, 00H, 80H, 00H
END
;----------------------------------------------------------
用PROTEUS仿真圖像如下: