2011-12-06 3 views
1

지금까지 작성한 코드는 HIGH 또는 LOW 스위치에 관계없이 항상 깜박입니다. 나는 하나의 스위치를 다른 스위치보다 빠르게 만드는 방법을 알아낼 수없는 것 같습니다. 왜냐하면 모든 스위치를 동일한 속도로 깜박이거나 안정적으로 유지하기 때문입니다 (깜박이지 않음). 아무도 나를 도울 수 있습니까?MPLab 어셈블리 언어 지연

작업 :

스위치 설정을 스캔의 깜박임 속도를 조정하고 그 스위치 설정에 따라 LED 프로그램을 작성하라.

귀하의 작업은 스위치 설정을 감지하고 각 스위치가 LOW에서 HIGH로 설정 될 때 LED의 깜박임 속도를 늦추는 프로그램을 작성하는 것입니다. 프로그램은 다음과 같아야합니다. 참고 : ICSA.asm 및 switches.asm에는 필요한 항목이 포함되어 있습니다.

  1. 스위치를 스캔하십시오.
    a. 스위치 1이 HIGH이면 깜박임 타이머를 변경하고 깜박이 게하십시오.
    b. 스위치 2가 HIGH이면 깜박임 타이머를 변경하고 깜박이 게하십시오.
    c. 스위치 3이 HIGH이면 깜박임 타이머를 변경하고 깜박이 게하십시오.
    d. 스위치 4가 HIGH이면 깜박임 타이머를 변경하고 깜박이 게하십시오.
    e. 스위치 5가 HIGH이면 깜박임 타이머를 변경하고 플래시를 느리게 만듭니다.
    f. 스위치 6이 HIGH이면 깜박임 타이머를 변경하고 플래시를 느리게 만듭니다.
    g. 스위치 7이 HIGH이면 깜박임 타이머를 변경하고 깜박이 게하십시오.
    h. 스위치 (8)가 HIGH 인 경우 깜짝 타이머를 변경하고

내 코드가 느린

  • 점멸 LED가
  • 고토 검사에게 스위치
  • 를 플래시합니다

    ;============================================================================= 
    ; Assembled using MPASM 7.4 
    ; Modified for 20Mhz at 9600 baud 
    ;============================================================================= 
    ; Include Files: p16f873A.inc V1.00 
    ;============================================================================= 
    ; The program 
    ; 1. Turns RB7 on and off 
    ; 2. Transmits characters 
    ; 
    ;============================================================================= 
    
    list p=16f873A, st=OFF, x=OFF, n=0 
    errorlevel -302 
    #include <p16f873A.inc> 
    __CONFIG _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_ON 
    ; 
    ;----------------------------------------------------------------------------- 
    ; RS232 Constants 
    RTS_OUTPUT EQU 1 ;Port B Pin 1 output for flow control 
    CTS_INPUT EQU 2 ;Port B Pin 2 input for flow control 
    BAUD_CONSTANT EQU 0x81 ;Constant for baud generator for 9600 baud 20MHz 
    
    
    ;----------------------------------------------------------------------------- 
    ;Variables in bank0 
    
        CBLOCK 0x20 
    
        counter1: 1 ;delay counter 
        counter2: 1 
        counter3: 1 
    
        ENDC 
    
    ;============================================================================= 
    ;Reset vector code 
    
        ORG 0x0000 
    
    ResetVector 
        pagesel Init_RS232  ;select page for Init_RS232 
        goto Init_RS232  ;go to Init_RS232 
    
    ;============================================================================= 
    ;Start of code 
        ORG 0x0600  ;Use page 6 
    
    ;Set up USART for asynchronous comms 
    ;Routine is only called once and can be placed in-line saving a call and return 
    ;This routine returns in bank0 
    
    Init_RS232 
        banksel PORTB   ;change to PORTB bank 
        bsf PORTB, RTS_OUTPUT ;set RTS off before setting as output 
        banksel TRISB   ;change to TRISB bank 
        bcf TRISB, RTS_OUTPUT ;enable RTS pin as output 
        movlw BAUD_CONSTANT ;set baud rate 
        movwf SPBRG 
        bsf TXSTA, BRGH   ;baud rate high speed option 
        bsf TXSTA, TXEN   ;enable transmission 
        banksel RCSTA   ;change to RCSTA bank 
        bsf RCSTA, CREN   ;enable reception 
        bsf RCSTA, SPEN   ;enable serial port 
    
    Init_TRISA 
    
    Init_TRISB 
        banksel TRISB  ;set i/o port data direction 
        bcf TRISB, 0x07  ;output=0 
    
    Send 
        banksel RCSTA 
        bcf RCSTA, CREN   ;disable reception - clear reception 
        bsf RCSTA, CREN   ;enable reception 
    
        pagesel Blink 
        call Blink 
    
    check 
    
        pagesel Send 
        goto Send 
    
    ;---------------------------------------------------------------------------- 
    Check_switches 
    
    ;output 0 to decoder 
        banksel PORTB 
        bcf PORTB, 0x04  ;output=0=RB4=decoder input A (low order) 
        bcf PORTB, 0x05  ;output=0=RB5=decoder input B 
        bcf PORTB, 0x06  ;output=0=RB6=decoder input C (high order)  
        nop     ;NOPs - 1 micro second delay to compensate for 4051 chips with slightly slower specifications 
        nop 
        nop 
        nop     
        nop 
        pagesel delay01 
        banksel PORTC 
        btfsc PORTC,0x05 ;RC5 
        call delay01 
    
    ;output 1 to decoder 
        banksel PORTB 
        bsf PORTB, 0x04  ;output=0=RB4=decoder input A (low order) 
        bcf PORTB, 0x05  ;output=0=RB5=decoder input B 
        bcf PORTB, 0x06  ;output=0=RB6=decoder input C (high order)  
        nop     ;NOPs to compensate for chips with slightly slower specifications 
        nop 
        nop 
        nop 
        nop 
        pagesel delay01 
        banksel PORTC 
        btfsc PORTC,0x05 ;RC5 
        call delay01 
    
    ;output 2 to decoder 
        banksel PORTB 
        bcf PORTB, 0x04  ;output=0=RB4=decoder input A (low order) 
        bsf PORTB, 0x05  ;output=0=RB5=decoder input B 
        bcf PORTB, 0x06  ;output=0=RB6=decoder input C (high order)  
        nop     ;NOPs to compensate for chips with slightly slower specifications 
        nop 
        nop 
        nop 
        nop 
        pagesel delay01 
        banksel PORTC 
        btfsc PORTC,0x05 ;RC5 
        call delay01 
    
    ;output 3 to decoder 
        banksel PORTB 
        bsf PORTB, 0x04  ;output=0=RB4=decoder input A (low order) 
        bsf PORTB, 0x05  ;output=0=RB5=decoder input B 
        bcf PORTB, 0x06  ;output=0=RB6=decoder input C (high order)  
        nop     ;NOPs to compensate for chips with slightly slower specifications 
        nop 
        nop 
        nop 
        nop 
        pagesel delay01 
        banksel PORTC 
        btfsc PORTC,0x05 ;RC5 
        call delay01 
    
    ;output 4 to decoder 
        banksel PORTB 
        bcf PORTB, 0x04  ;output=0=RB4=decoder input A (low order) 
        bcf PORTB, 0x05  ;output=0=RB5=decoder input B 
        bsf PORTB, 0x06  ;output=0=RB6=decoder input C (high order)  
        nop     ;NOPs to compensate for chips with slightly slower specifications 
        nop 
        nop 
        nop 
        nop 
        pagesel delay01 
        banksel PORTC 
        btfsc PORTC,0x05 ;RC5 
        call delay01 
    
    ;output 5 to decoder 
        banksel PORTB 
        bsf PORTB, 0x04  ;output=0=RB4=decoder input A (low order) 
        bcf PORTB, 0x05  ;output=0=RB5=decoder input B 
        bsf PORTB, 0x06  ;output=0=RB6=decoder input C (high order)  
        nop     ;NOPs to compensate for chips with slightly slower specifications 
        nop 
        nop 
        nop 
        nop 
        pagesel delay01 
        banksel PORTC 
        btfsc PORTC,0x05 ;RC5 
        call delay01 
    
    ;output 6 to decoder 
        banksel PORTB 
        bcf PORTB, 0x04  ;output=0=RB4=decoder input A (low order) 
        bsf PORTB, 0x05  ;output=0=RB5=decoder input B 
        bsf PORTB, 0x06  ;output=0=RB6=decoder input C (high order)  
        nop     ;NOPs to compensate for chips with slightly slower specifications 
        nop 
        nop 
        nop 
        nop 
        pagesel delay01 
        banksel PORTC 
        btfsc PORTC,0x05 ;RC5 
        call delay01 
    
    ;output 7 to decoder 
        banksel PORTB 
        bsf PORTB, 0x04  ;output=0=RB4=decoder input A (low order) 
        bsf PORTB, 0x05  ;output=0=RB5=decoder input B 
        bsf PORTB, 0x06  ;output=0=RB6=decoder input C (high order)  
        nop     ;NOPs to compensate for chips with slightly slower specifications 
        nop 
        nop 
        nop 
        nop 
        pagesel delay01 
        banksel PORTC 
        btfsc PORTC,0x05 ;RC5 
        call delay01 
    
        pagesel Check_switches 
        goto Check_switches 
    
    ;----------------------------------------------------------------------------  
    Blink 
        pagesel Light_on 
        call Light_on 
        pagesel delay01 
        call delay01 
        pagesel Light_off 
        call Light_off 
        pagesel delay01 
        call delay01 
        return 
    
    Light_on 
        banksel PORTB 
        bsf PORTB, 0x07  ;RB7 = power on high 
        return 
    
    Light_off 
        banksel PORTB 
        bcf PORTB, 0x07  ;RB7 = power off low 
        return  
    
    ;---------------------------------------------------------------------------- 
    delay01      ;152ms counter1=00, counter2=00 
        movlw 0x00 
        banksel counter1 
        movwf counter1 
        movlw 0x00 
        banksel counter2 
        movwf counter2 
        movlw 0x05 
        banksel counter3 
        movwf counter3 
    
    delay02 
        banksel counter1 ;1 
        nop     ;1 
        decfsz counter1  ;1 
        goto delay02 
        decfsz counter2 
        goto delay02 
        decfsz counter3 
        goto delay02 
        return 
    
    ;----------------------------------------------------------------------------- 
    ;Transmit byte in W register to USART 
    ; transmit_data_in_w 
    ; check for PORTB CTS_INPUT, clear to send with btfsc 
    ; check for PIR1 TXIF, transmit buffer empty with btfss 
    ; move w to TXREG to transmit byte 
    
    transmit_data_in_w 
        banksel PORTB  ;change bank to PORTB 
        ;btfsc PORTB, CTS_INPUT ;check CTS to see if data can be sent 
        ;goto $-1 
        btfss PIR1, TXIF ;check that buffer is empty 
        goto $-1 
        movwf TXREG  ;transmit byte 
        return 
    
    receive_data_in_w 
        banksel PORTB  ;change bank to PORTB 
        bcf  PORTB,RTS_OUTPUT ;set RTS on for data to be received 
        ;btfss PIR1,RCIF ;check if data received 
        ;goto $-1  ;wait until new data 
        movf RCREG,W  ;get received data into W 
        return 
    
        nop 
        nop 
        nop 
        nop 
        nop 
        nop 
        nop 
        nop 
    
        end 
    

    답변

    0

    그것은 것을 나타나지 않습니다 당신은 스위치를 스캐닝하고 있습니다. 무한 루프가 깜박이고 UART 수신기의 활성화를 전환 한 다음 반복합니다. Check_Switches 서브 루틴을 호출해야합니다.

    Send 
        banksel RCSTA 
        bcf RCSTA, CREN   ;disable reception - clear reception 
        bsf RCSTA, CREN   ;enable reception 
    
        pagesel Blink 
        call Blink 
    
    check 
    
        pagesel Send 
        goto Send