单片机89S51,4×4矩阵键盘,控制16个发光二极管
扫描二维码
随时随地手机看文章
用单片机89S51,4×4矩阵键盘,控制16个发光二极管,程序有点错误哪位高手给指点一下。
我所做的矩阵键盘控制的发光二极管只有8个亮8个不亮,和P2口连接的亮和P0口连接的不亮,高手给点意见。
回答:
下列程序已经经过了 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: ;用反转法扫描键盘
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 ;输出到数码显示器
RL A ;乘以2,因为每个键值要显示两个字节
MOV B, A ;保存
MOV DPTR, #TABLE1 ;显示码表首地址
MOVC A, @A+DPTR ;根据键值查显示码
MOV P2, A ;输出显示
MOV A, B
INC A ;准备查第二字节
MOVC A, @A+DPTR ;根据键值查显示码
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仿真图像如下: