在PROTEUS中做个AT89C51单片机接4X3矩阵键盘和LED数码管显示,汇编程序有问题,数码管不显示。汇编程序: 50
ORG0000HAJMPMAINORG0080HMAIN:MOVP0,#00HMOVP2,#00HMOVDPTR,#TABLCALLKEYPROMOVP2,A;十六进制数...
ORG 0000H
AJMP MAIN
ORG 0080H
MAIN:
MOV P0,#00H
MOV P2,#00H
MOV DPTR,#TAB
LCALL KEYPRO
MOV P2,A ; 十六进制数直接送出,4脚LED显示
MOVC A,@A+DPTR
MOV P0,A ; 八脚LED显示
LJMP MAIN
KEYPRO: ACALL KEXAM ; 检查是否有键按下
JZ KEYPRO ; 若无键按下,则转KEYPRO,继续等待并检查
ACALL KEXAM ; 再次检查是否有键按下
JZ KEYPRO ; 若无键按下,则转KEYPRO
KEY1: MOV R2,#0FEH ; 输出使第一行为低电平1111 1110
MOV R3,#00H ; 列值寄存器清零
MOV R4,#00H ; 行值寄存器清零
MOV R5,#4
KEY2: MOV P1,R2 ; 扫描行
MOV A,P3 ; 读入值
CPL A ; 按位取反,得到按下键所在列
MOV B,#10H
DIV AB
JNZ KEY4 ; 判断在哪一行,A不为零,按键在此行,转求列值
MOV A,R4 ; 此行无键按下,行值寄存器加03H
ADD A,#03H ; 行值寄存器加03H
MOV R4,A ; 求扫描过的行值和,刷新寄存器值
MOV A,R2 ; 低电平,为扫描下一行作准备
RL A ; A中内容左环移一位
MOV R2,A ; 准备扫描下一行,低电平
DJNZ R5,KEY2 ; 判断三行是否全部扫描完毕,未完,继续
ACALL KEYPRO ; 若全部完毕,无按键,等待下一次按键
KEY4: INC R3 ; 求列值
RR A ; 右环移一位
JNZ KEY4 ; 累加器中内容不等于零,则转KEY4 不等于零
;按键不在此列,查下一列
KEY5: MOV A,R4
ADD A,R3 ; 计算键值
LJMP MAIN
KEXAM:
MOV P1,#0F0H ; 使键盘行线会部为低待定
MOV A,P1 ; 读P1口
CPL A
ANL A,#0F0H
RET
TAB: DB 06H,5BH,4FH,66H,6DH ; 1,2,3,4,5
DB 7DH,07H,7FH,6FH,3FH ; 6,7,8,9,0
END 展开
AJMP MAIN
ORG 0080H
MAIN:
MOV P0,#00H
MOV P2,#00H
MOV DPTR,#TAB
LCALL KEYPRO
MOV P2,A ; 十六进制数直接送出,4脚LED显示
MOVC A,@A+DPTR
MOV P0,A ; 八脚LED显示
LJMP MAIN
KEYPRO: ACALL KEXAM ; 检查是否有键按下
JZ KEYPRO ; 若无键按下,则转KEYPRO,继续等待并检查
ACALL KEXAM ; 再次检查是否有键按下
JZ KEYPRO ; 若无键按下,则转KEYPRO
KEY1: MOV R2,#0FEH ; 输出使第一行为低电平1111 1110
MOV R3,#00H ; 列值寄存器清零
MOV R4,#00H ; 行值寄存器清零
MOV R5,#4
KEY2: MOV P1,R2 ; 扫描行
MOV A,P3 ; 读入值
CPL A ; 按位取反,得到按下键所在列
MOV B,#10H
DIV AB
JNZ KEY4 ; 判断在哪一行,A不为零,按键在此行,转求列值
MOV A,R4 ; 此行无键按下,行值寄存器加03H
ADD A,#03H ; 行值寄存器加03H
MOV R4,A ; 求扫描过的行值和,刷新寄存器值
MOV A,R2 ; 低电平,为扫描下一行作准备
RL A ; A中内容左环移一位
MOV R2,A ; 准备扫描下一行,低电平
DJNZ R5,KEY2 ; 判断三行是否全部扫描完毕,未完,继续
ACALL KEYPRO ; 若全部完毕,无按键,等待下一次按键
KEY4: INC R3 ; 求列值
RR A ; 右环移一位
JNZ KEY4 ; 累加器中内容不等于零,则转KEY4 不等于零
;按键不在此列,查下一列
KEY5: MOV A,R4
ADD A,R3 ; 计算键值
LJMP MAIN
KEXAM:
MOV P1,#0F0H ; 使键盘行线会部为低待定
MOV A,P1 ; 读P1口
CPL A
ANL A,#0F0H
RET
TAB: DB 06H,5BH,4FH,66H,6DH ; 1,2,3,4,5
DB 7DH,07H,7FH,6FH,3FH ; 6,7,8,9,0
END 展开
2012-06-20
展开全部
MOV A,P3 这是干嘛?
追答
这些地方改一改,按键显示那一块就没问题了
MAIN:
MOV P0,#00H
MOV P2,#00H
// MOV DPTR,#TAB
LCALL KEYPRO
DIS: MOV P2,A ; 十六进制数直接送出,4脚LED显示
MOV DPTR,#TAB
SUBB A,#5
MOVC A,@A+DPTR
MOV P0,A ; 八脚LED显示
LJMP KEYPRO
KEYPRO: ACALL KEXAM ; 检查是否有键按下
JZ KEYPRO
LCALL DELAY ; 若无键按下,则转KEYPRO,继续等待并检查
ACALL KEXAM ; 再次检查是否有键按下
JZ KEYPRO ; 若无键按下,则转KEYPRO
KEY2: MOV P1,R2 ; 扫描行
MOV A, P1 ; 读入值
CPL A ; 按位取反,得到按下键所在列
ANL A, #0F0H
// MOV B,#10H
//DIV AB
JNZ KEY4 ; 判断在哪一行,A不为零,按键在此行,转求列值
MOV A,R4 ; 此行无键按下,行值寄存器加03H
ADD A,#03H ; 行值寄存器加03H
MOV R4,A ; 求扫描过的行值和,刷新寄存器值
MOV A,R2 ; 低电平,为扫描下一行作准备
RL A ; A中内容左环移一位
MOV R2,A ; 准备扫描下一行,低电平
DJNZ R5,KEY2 ; 判断三行是否全部扫描完毕,未完,继续
ACALL KEYPRO ; 若全部完毕,无按键,等待下一次按键
KEY4: INC R3 ; 求列值
RRC A ; 右环移一位
JNC KEY4 ; 累加器中内容不等于零,则转KEY4 不等于零
;按键不在此列,查下一列
KEY5: LCALL KEXAM
JNZ KEY5
MOV A,R4
ADD A,R3 ; 计算键值
LJMP DIS
DELAY: MOV R6,#0FFH
LOP: MOV R7,#80H
LOOP: NOP
NOP
DJNZ R7,$
DJNZ R6,LOP
RET
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
显示程序没问题,将你的排阻去掉试试。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询