标题:
下边这个单片机汇编按键程序的按钮为什么按第五次时不灵了?
[打印本页]
作者:
mnliuzh
时间:
2020-9-23 16:56
标题:
下边这个单片机汇编按键程序的按钮为什么按第五次时不灵了?
下边程序 在试验时 ,前四次按开关 可以正常到循环次数后 停下,但第五次按开关时 就不停了,关电重启后 也是一样,只有四次开关有效,不论是 K0 K1,或者是随便,只要达五次开关,就不停, 什么原因。
ORG 00H;
K0 EQU P0.0 ; 设定P0.0以 K0 代表示反转
K1 EQU P0.1 ; 设定P0.1以 K1 表示正转,
STOP: MOV P1 , #0FFH ; 电机停止; 开始扫描各按钮状态;
LOOP: JNB K0 , FM ; 是否按 K0 --是 则反转
JNB K1 , ZM ; 是否按 K1 -- 是则正转
JMP LOOP ; 跳到 LOOP 处循环扫描检查开关状况; ;开关消抖程序
K0XD: ACALL DELAY ; 按K0 的肖抖
JNB K0 , $ ; K0 放开否?
ACALL DELAY ; 放开削除抖动
JMP FM ; 转到反转处
K1XD: ACALL DELAY ; 按K1 的肖抖
JNB K1 , $ ; K1 放开否?
ACALL DELAY ; 放开削除抖动
JMP ZM ; 转到ZM处 ;反转300步子程序;
FM: MOV R1 , #00;
MOV R1 , #75 ; 走300步的脉冲数循环次数
FM1: MOV P1, #0F3H ; 第一步
ACALL DELAY ; 延时4MS
MOV P1, #0F9H ; 第二步
ACALL DELAY ; 延时4MS
MOV P1, #0FCH ; 第三步
ACALL DELAY ; 延时4MS
MOV P1, #0F6H ; 第四步
ACALL DELAY ; 延时4MS
DJNZ R1, FM1; 循环
RET; ; 正转300子程序ZM:
MOV R1 , #00 ;
MOV R1 , #75 ; 走300步的脉冲数循环次数
ZM1: MOV P1 , #0F6H ; 第一步
ACALL DELAY ; 延时4MS
MOV P1 , #0FCH ; 第二步
ACALL DELAY ; 延时4MS
MOV P1 , #0F9H ; 第三步
ACALL DELAY ; 延时4MS
MOV P1 , #0F3H ; 第四步
ACALL DELAY ; 延时4MS
DJNZ R1, ZM1; 循环
RET;
DELAY: MOV TMOD , #00000001B ; 延时时间4MS
SETB TR0 ;
MOV TL0 , #LOW(65336-4000);
MOV TH0 , #HIGH(65336-4000);
JNB TF0 , $ ;
CLR TF0 ;
RET ;
END
作者:
418854190
时间:
2020-9-23 18:15
实测把RET换成 LJMP STOP;可以无限按
51hei截图202009231813331.jpg
(162.71 KB, 下载次数: 32)
下载附件
2020-9-23 18:15 上传
作者:
mnliuzh
时间:
2020-9-23 20:58
行了,谢谢!原因是什么呢
作者:
hhdsdy
时间:
2020-9-24 00:45
程序写得很乱,消抖的K0XD和K1XD根本就没用到。
程序错乱,应该是你胡乱使用RET造成的,JNB是跳转而不是调用,子程序结束后使用RET就会将堆栈弹出作为程序返回的地址,所以按沙发说的改用跳转指令就会正常了,RET只有在用ACALL或者LCALL调用的子程序结束后使用,不过也不是绝对的,也有特殊利用的时候。
作者:
wufeng391
时间:
2020-9-25 10:04
还真有能看懂汇编的高手,真是强!看到汇编就头晕啊!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1