调用子程序后操作IO口会死循环?高手请进

2019-07-16 06:55发布

本帖最后由 gmsbr 于 2011-7-12 23:48 编辑

用着AT的片子,现在想用STC15F的,写了个蜂鸣器嘀一声的汇编程序,可是搞了两天,不管是用STC的89C52RC还是15F104,还有AT89S52,搞出来都是上电一直响,不能停止,今天不断改变代码结构,总算是能达到目的了,可是不明白为什么会这样,希望朋友们能告知一二,下面是程序代码:


COUNT1 EQU #64H                                   ;循环100次数
COUNT2 EQU #5H
MOV TMOD,#00H                                      ;STC的16位自动装载定时器0工作方式0,时钟6MHZ

DELAY_500MS: MOV R7,COUNT1              ;250US循环100次则是25MS后停止输出
R7LOOP: MOV R6,COUNT2                       ;50微秒周期*5=250US
             R6LOOP: LCALL DELAY1
;CPL BEEP 语句放在此处则会不停响,为什么呢?
              DJNZ R6,R6LOOP
  CPL BEEP                                           ;改放在此处则能够正常计数,按设定的次数倒计时完成输出后停止
DJNZ R7,R7LOOP
SETB BEEP
;------------------------50US延时子程序------------------------------------------
;MOV TMOD,#00H                              ;16位自动装载定时器0工作方式0
DELAY1: MOV TH1,#FFH                     ;装50US初值
               MOV TL1,#E7H
               SETB TR1                             ;启动定时器1
DELAY2: JBC TF1,DELAY3                   ;查询计数溢出转delay3,返回
AJMP DELAY2
DELAY3: RET


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。