您现在的位置: 主页 > MCU > 单片机技术应用 > 单片机89S51,4×4矩阵键盘,控制16个发光二极管 -
本文所属标签:
为本文创立个标签吧:

单片机89S51,4×4矩阵键盘,控制16个发光二极管 -

来源: 网络用户发布,如有版权联系网管删除 2018-09-07 

[导读]
用单片机89S51,4×4矩阵键盘,控制16个发光二极管,程序有点错误哪位高手给指点一下。我所做的矩阵键盘控制的发光二极管只有8个亮8个不亮,和P2口连接的亮和P0口连接的不亮,高手给点意见。回答:下列

单片机89S51,4×4矩阵键盘,控制16个发光二极管,程序有点错误哪位高手给指点一下。
我所做的矩阵键盘控制的发光二极管只有8个亮8个不亮,和P2口连接的亮和P0口连接的不亮,高手给点意见。

回答:

本文引用地址: http://www.21ic.com/app/mcu/201806/764405.htm

下列程序已经经过了 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仿真图像如下:




              查看评论 回复



嵌入式交流网主页 > MCU > 单片机技术应用 > 单片机89S51,4×4矩阵键盘,控制16个发光二极管 -
 

"单片机89S51,4×4矩阵键盘,控制16个发光二极管 -"的相关文章

网站地图

围观()