我正在编写一个程序,它会关闭和打开红色,黄色和绿色LED,以匹配交通信号灯的功能。但是,当我在调试器中运行它并逐步执行(我使用的是MPLAB X IDE)时,它似乎在调用函数'LOOP1'后停止。 PORTD中反映的值是LOOP1完成后应保留的值,而不是LOOP6完成后的值。有什么想法吗?
list p=18f4550, r=DEC
#include <p18f4550.inc>
CONFIG LVP=OFF
CONFIG WDT=OFF
CONFIG MCLRE=OFF
CONFIG FOSC = INTOSCIO_EC
ORG 0x00
CBLOCK 0
DELAY1:1
DELAY2:1
COUNTER:1
ENDC
START:
CLRF TRISD
CLRF PORTD
CLRF COUNTER
CLRF DELAY1
CLRF DELAY2
MOVLW 0x00
PRIMARYLOOP:
CALL LOOP1
CALL LOOP2
CALL LOOP3
CALL LOOP4
CALL LOOP5
CALL LOOP6
GOTO PRIMARYLOOP
LOOP1:
MOVLW b'00010010'
MOVWF PORTD
MOVLW 0x01
MOVWF COUNTER
CALL DELAYMAIN
RETURN
LOOP2:
MOVLW b'01000010'
MOVWF PORTD
MOVLW 0x05
MOVWF COUNTER
CALL DELAYMAIN
RETURN
LOOP3:
MOVLW b'00100010'
MOVWF PORTD
MOVLW 0x03
MOVWF COUNTER
CALL DELAYMAIN
RETURN
LOOP4:
MOVLW b'00010010'
MOVWF PORTD
MOVLW 0x01
MOVWF COUNTER
CALL DELAYMAIN
RETURN
LOOP5:
MOVLW b'01000010'
MOVWF PORTD
MOVLW 0x05
MOVWF COUNTER
CALL DELAYMAIN
RETURN
LOOP6:
MOVLW b'00100010'
MOVWF PORTD
MOVLW 0x03
MOVWF COUNTER
CALL DELAYMAIN
RETURN
DELAYMAIN:
DECFSZ DELAY1,1
GOTO DELAYMAIN
DECFSZ DELAY2,1
GOTO DELAYMAIN
DECFSZ COUNTER,0,0
RETURN
END
答案 0 :(得分:0)
您正在跳过DELAYMAIN中的返回指令,导致执行超出程序范围。其余的内存可能包含NOP
指令,因此控制将继续,直到PC回绕到0并且程序重新启动。
只需在最后GOTO
之后添加缺少的BRA
(或DECFSZ
)指令,它就应该进入第二个循环。您还需要更改DECFSZ
的目的地以写入寄存器,或者在COUNTER > 1
时永远不会完成。