;********************************************************************
;   BLINK AND UART TEST
;   SWITCH ON AND OFF RA AND RB PORTS EVERY 4M CYCLE (8M CLOCKS)
;   FREQ = 0.50HZ @ 8MHZ   (2 SECONDS)
;   FREQ = 1.25HZ @ 20MHZ
;   FREQ = 1.50HZ @ 24MHZ
;   FREQ = 3.00HZ @ 48MHZ
;
;   SEND '1' AND '0' CHARS TO USART
;
;********************************************************************

    radix   DEC
    LIST    P=18F2550         ; change also: Configure->SelectDevice from Mplab
#INCLUDE    "P18F2550.INC"


;************************************************************
;                 LABELS AND MACROS
;************************************************************
    CBLOCK  0x00
    COUNT1
    COUNT2
    COUNT3
    ENDC

; SEND CHARACTER BY UART
SENDL  MACRO  CHAR
    MOVLW   CHAR
    MOVWF   TXREG
    ENDM


; SET OR RESET PORTA AND PORTB
SET_PORT  MACRO  CHAR
    MOVLW   CHAR
    MOVWF   LATA
    MOVWF   LATB
    ENDM


;************************************************************
;                 BOOTLOADER COMPATIBILITY
;************************************************************
    ORG     0x0000
    GOTO    MAIN
    ORG     0x0020


;***********************************************************
; MAIN FUNCTION: BLINK LEDS
;***********************************************************
MAIN
    MOVLW   B'00000000'          ; SET RB[2-7] AS OUTPUTS
    MOVWF   TRISB
    MOVLW   B'11000000'          ; SET RA[0-5] AS OUTPUTS
    MOVWF   TRISA
    BSF     RCSTA,  SPEN         ; ACTIVATE UART AFTER BOOTLOADER


MAIN_LBL1                        ; WHILE(1) {
    MOVLW   20                   ;    PAUSE 2M CYCLES (8M CLOCKS)
    RCALL   PAUSE_100KW

    SET_PORT   0xFF              ;    SWITCH ON OUTPUT
    SENDL   '1'                  ;    SEND '1' TO RS-232

    MOVLW   20                   ;    PAUSE 2M CYCLES (8M CLOCKS)
    RCALL   PAUSE_100KW

    SET_PORT   0x00              ;    SWITCH OFF OUTPUT
    SENDL   '0'                  ;    SEND '0' TO RS-232

    BRA     MAIN_LBL1            ; };


;***********************************************************
; PAUSE 10*W CYCLES (40 CLOCKS)
;
PAUSE_10W
    MOVWF   COUNT1, 0
    BRA     PAUSE_10W_LBL2
PAUSE_10W_LBL1
    RCALL   PAUSE_10W_LBL3           ; PAUSE 4 CYCLES
    NOP
    BRA     PAUSE_10W_LBL2
PAUSE_10W_LBL2
    DECFSZ  COUNT1, F, 0
    BRA     PAUSE_10W_LBL1
PAUSE_10W_LBL3
    RETURN


;***********************************************************
; PAUSE 1000*W CYCLES (1000 CLOCKS)
;
PAUSE_1KW
    MOVWF   COUNT2, 0
    BRA     PAUSE_1KW_LBL1
PAUSE_1KW_LBL1
    MOVLW   99
    RCALL   PAUSE_10W
    DECFSZ  COUNT2, F, 0
    BRA     PAUSE_1KW_LBL1
    RETURN


;***********************************************************
; PAUSE 100K*W CYCLES (400K CLOCKS)
;
PAUSE_100KW
    MOVWF   COUNT3, 0
PAUSE_100KW_LBL1
    MOVLW   100
    RCALL   PAUSE_1KW
    DECFSZ  COUNT3, F, 0
    BRA     PAUSE_100KW_LBL1
    RETURN

;***********************************************************
    END


