51单片机编程问题,为何程序只能执行键盘的第一次指令?以后的指令不执行

这是一个p2口四键盘控制p1口电平的程序,仿真的时候只执行第一个键盘指令,以后的都不执行了,我是新手,程序是自己写的,没有写抗干扰延时,请大家多多指教org0000hma... 这是一个p2口四键盘控制p1口电平的程序,仿真的时候只执行第一个键盘指令,以后的都不执行了,我是新手,程序是自己写的,没有写抗干扰延时,请大家多多指教
org 0000hmain:mov a,p2anl a,#0fhcjne a,#0fh,keymov a,#00hajmp overkey:cjne a,0eh,n1mov p1,#10101010bajmp overn1:cjne a,0dh,n2mov p1,#10111010bajmp overn2:cjne a,0bh,n3mov p1,#10001010bajmp overn3:cjne a,07h,overmov p1,#11111111bajmp overover: ret
end
展开
 我来答
zhxiufan
2014-03-09 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38387
国家科技进步奖

向TA提问 私信TA
展开全部
你编程大概是受C的影响,单片机中主程序要成一个循环,才能保证系统可靠运行。

org 0000h
main:
mov a,p2
anl a,#0fh
cjne a,#0fh,key
mov a,#00h
ajmp main
key:
cjne a,0eh,n1
mov p1,#10101010b
ajmp main
n1:
cjne a,0dh,n2
mov p1,#10111010b
ajmp main
n2:
cjne a,0bh,n3
mov p1,#10001010b
ajmp main
n3:
cjne a,07h,over
mov p1,#11111111b
ajmp main

end
追问
先谢谢你的耐心回答,我还想问一下,我的程序执行到ajmp over ,然后跳转到over: ret,,,,ret应该会回到main吧?是不是我哪里理解错了?  我明白你说的   就是想详细了解一下错误的原因 谢谢了
还有刚才试了一下,还是不能再次使用键盘输入命令,,只能扫描键盘一次。。。
追答
不能,你这样做的结果就是程序崩溃,因为RET返回的是栈顶弹出的两个字节作为地址的地方。当然你可以将over处改一下如下:
over:ajmp main
这样也可以。注意RET的程序段一定要用lcall来调用,不要用转移指令去执行。
还不能正常运行是与你的键盘处理不完善有关的,比如去抖处理,还有就是你比较时没加“#”
org 0000h
main:
mov a,p2
anl a,#0fh
cjne a,#0fh,key
mov a,#00h
ajmp main
key:
cjne a,#0eh,n1
mov p1,#10101010b
ajmp main
n1:
cjne a,#0dh,n2
mov p1,#10111010b
ajmp main
n2:
cjne a,#0bh,n3
mov p1,#10001010b
ajmp main
n3:
cjne a,#07h,over
mov p1,#11111111b
ajmp main

end
lgq1008
2014-03-09 · 超过20用户采纳过TA的回答
知道答主
回答量:62
采纳率:0%
帮助的人:61.3万
展开全部
你的循环程序写错了,你的程序每次都会执行到ajmp over ,所以程序就会停止,只能是一上电,在扫描第一遍时可以按照你的要求做,等一遍扫描完,程序已经停止所以按什么键都没反应,除非重新上电,所以,将你的ajmp over 改为 ajmp main ,这样应该可以循环了。
追问
先谢谢你的耐心回答,我还想问一下,我的程序执行到ajmp over ,然后跳转到over: ret,,,,ret应该会回到main吧?是不是我哪里理解错了?
还有刚才试了一下,还是不能再次使用键盘输入命令,,,是不是要每次把A清零一下呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式