在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
展开
 我来答
做而论道
高能答主

2012-06-20 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
呵呵,这程序编写的!
……
LCALL KEYPRO ------调用子程序
MOV P2,A ; 十六进制数直接送出,4脚LED显示
……

子程序,应该使用RET指令返回,才能把A送到4脚LED显示。
但是 KEYPRO 中,没有返回。

并且在 KEYPRO 中,还有一个 LCALL KEYPRO 指令!
形成了递归,且永远不返回。
一会就把堆栈填满了。
匿名用户
2012-06-20
展开全部
MOV A,P3 这是干嘛?
追问

这是keil c51中程序图。

追答
这些地方改一改,按键显示那一块就没问题了 
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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhxiufan
2012-06-20 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38385
国家科技进步奖

向TA提问 私信TA
展开全部
显示程序没问题,将你的排阻去掉试试。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式