找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1448|回复: 4
收起左侧

下边这个单片机汇编按键程序的按钮为什么按第五次时不灵了?

[复制链接]
ID:798779 发表于 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

回复

使用道具 举报

ID:261025 发表于 2020-9-23 18:15 | 显示全部楼层
实测把RET换成   LJMP STOP;可以无限按
51hei截图202009231813331.jpg

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:798779 发表于 2020-9-23 20:58 来自手机 | 显示全部楼层
行了,谢谢!原因是什么呢
回复

使用道具 举报

ID:88256 发表于 2020-9-24 00:45 | 显示全部楼层
程序写得很乱,消抖的K0XD和K1XD根本就没用到。
程序错乱,应该是你胡乱使用RET造成的,JNB是跳转而不是调用,子程序结束后使用RET就会将堆栈弹出作为程序返回的地址,所以按沙发说的改用跳转指令就会正常了,RET只有在用ACALL或者LCALL调用的子程序结束后使用,不过也不是绝对的,也有特殊利用的时候。
回复

使用道具 举报

ID:782419 发表于 2020-9-25 10:04 | 显示全部楼层
还真有能看懂汇编的高手,真是强!看到汇编就头晕啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表