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