Assembly 如何在ASM中为PIC18系列正确编码延时?

Assembly 如何在ASM中为PIC18系列正确编码延时?,assembly,microcontroller,pic,Assembly,Microcontroller,Pic,我编写了一个典型的例子,8个LED灯打开和关闭,然后全部打开。所有这些都在一个循环中 我得到了一张图片18F4550,并将其编码为: List P=18F4550 ;Microcontrolador a utilizar include <P18F4550.inc> ;Definiciones de constantes ;********** Palabra de conficuración ******

我编写了一个典型的例子,8个LED灯打开和关闭,然后全部打开。所有这些都在一个循环中

我得到了一张图片18F4550,并将其编码为:

    List    P=18F4550               ;Microcontrolador a utilizar
    include <P18F4550.inc>          ;Definiciones de constantes


;**********   Palabra de conficuración  *******************************************
    CONFIG FOSC = INTOSC_EC ;INTOSC_EC          ; Internal oscillator                                
    CONFIG PWRT= ON             ; Power-up Timer Enable bit
    CONFIG BOR=OFF              ; Brown-out Reset disabled in hardware and software
    CONFIG WDT=OFF              ; WDT disabled
    CONFIG MCLRE=ON             ; MCLR pin enabled
    CONFIG PBADEN=OFF           ; PORTB<4:0> pins are configured as digital I/O
    CONFIG LVP=OFF              ; Single-Supply ICSP disabled
    CONFIG DEBUG = OFF                  ; Background debugger disabled
    CONFIG XINST = OFF          ; Extended Instruction disabled
;******************************Variables***********************************
    conta equ 0x00

;**********************************************************************************


    org     0x0000      
    movlw   0x62        
    movwf   OSCCON    
    clrf    TRISD      

CICLO   
    bcf PORTD,0         
    call RETARDO
    bsf PORTD,0       
    bcf PORTD,1
    CALL RETARDO

        bcf PORTD,1         
    call RETARDO
    bsf PORTD,1        
    bcf PORTD,2
    CALL RETARDO

        bcf PORTD,2         
    call RETARDO
    bsf PORTD,2      
    bcf PORTD,3
    CALL RETARDO    

        bcf PORTD,3        
    call RETARDO
    bsf PORTD,3       
    bcf PORTD,4
    CALL RETARDO    

        bcf PORTD,4        
    call RETARDO
    bsf PORTD,4      
    bcf PORTD,5
    CALL RETARDO        

        bcf PORTD,5         
    call RETARDO
    bsf PORTD,5       
    bcf PORTD,6
    CALL RETARDO        

        bcf PORTD,6        
    call RETARDO
    bsf PORTD,6       
    bcf PORTD,7
    CALL RETARDO    

        bcf PORTD,7       
    call RETARDO
    bsf PORTD,7   
        bcf PORTD,0
    CALL RETARDO        


bra  CICLO

RETARDO 
    movlw   .255  
    movwf   conta

    CICLO2
         DECFSZ   conta,F  

    bra  CICLO2

    nop
    nop
    nop
    nop



    return 


    end 
这是我的模拟图:


我做错了什么?我如何确保在4 MhZ下工作时的延迟为1秒?

假设您在单线程环境中运行,传统的延迟精确时间的方法是忙循环:例如,您可以从1到1000000计数。您可以通过检查微控制器上的指令计时,或通过反复试验来计算延迟的确切长度

繁忙等待的缺点,特别是对于长时间(数毫秒)延迟,是它会消耗电力。如果这是一个问题,您可以看到您的系统是否具有某种形式的“空闲等待和计时器中断”功能,这将使它在您等待时进入低功耗状态

bcf PORTD,0
bcf PORTD,1
bcf PORTD,2
bcf PORTD,3
bcf PORTD,4
bcf PORTD,5
bcf PORTD,6
CALL RETARDO
bsf PORTD,1
bsf PORTD,2
bsf PORTD,3
bsf PORTD,4
bsf PORTD,5
bsf PORTD,6
bsf PORTD,7
CALL RETARDO