;********************************************************
;
;            The LED flash control processing
;
;                                 Author : Seiichi Inoue
;********************************************************

	ifdef	__16F628A
        list            p=pic16f628a
        include         p16f628a.inc
	endif
	ifdef	__16F628
        list            p=pic16f628
        include         p16f628.inc
	endif

		__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _MCLRE_OFF & _LVP_OFF


        errorlevel      -302    ;Eliminate bank warning

;****************  Label Definition  ********************
ra0     equ     00              ;RA0 bit


	cblock	0x20
cnt500u			              ;500usec counter Address
cnt1m   		              ;1msec counter Address
cnt100m			              ;100msec counter Address
cnt500m			              ;500msec counter Address
cnt1s			              ;1sec counter Address

	endc

;*************  Pattern Data Definition  ****************
;                 '1':OFF   '0':ON

;******  Pattern 0  ******
p00     equ     b'11111110'
p01     equ     b'11111100'
p02     equ     b'11111000'
p03     equ     b'11110000'
p04     equ     b'11100000'
p05     equ     b'11000000'
p06     equ     b'10000000'
p07     equ     b'00000000'




;****************  Program Start  ***********************
        org     0               ;Reset Vector
        goto    init
        org     4               ;Interrupt Vector
        goto    init

;****************  Initial Process  *********************
        org     5
init
		movlw	0x07
		movwf	CMCON
	    bsf     STATUS,RP0      ;Change to Bank1 
        movlw   h'ff'           ;Set input mode data
        movwf   TRISA           ;Set PORTA to Input mode
        clrf    TRISB
	    bCf     STATUS,RP0      ;Change to Bank0
        movlw   h'ff'           ;Set LED off data
        movwf   PORTB           ;Output data



;***********  Pattern 0 Output Subroutine ***************
ptn0    movlw   p00             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p01             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p02             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p03             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p04             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p05             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p06             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p07             ;Set pattern data
        movwf   PORTB           ;Output data
        return
       



;********************************************************
;          Timer  Subroutine for 10MHz clock
;********************************************************

;*************  1msec Timer Subroutine  *****************
t1m     movlw   d'2'            ;(1)       Set loop cnt1
        movwf   cnt1m           ;(1)       Save loop cnt1
tm1lp1  movlw   d'249'          ;(1)*2     Set loop cnt2
        movwf   cnt500u         ;(1)*2     Save loop cnt2
tm1lp2  nop                     ;(1)*249*2 Time adjust
        nop                     ;(1)*249*2 Time adjust
        decfsz  cnt500u,f       ;(1)*249*2 cnt500u-1=0 ?
        goto    tm1lp2          ;(2)*248*2 No, continue
        decfsz  cnt1m,f         ;(1)*2     cnt1m-1=0 ?
        goto    tm1lp1          ;(2)       No. Continue
        return                  ;(2)       Yes. Cnt end
                                ;Total 2501*0.4usec=1msec

;*************  100msec Timer Subroutine  ***************
t100m   movlw   d'100'          ;Set loop counter
        movwf   cnt100m         ;Save loop counter
tm2lp   call    t1m             ;1msec subroutine
        decfsz  cnt100m,f       ;cnt100m - 1 = 0 ?
        goto    tm2lp           ;No. Continue
        return                  ;Yes. Count end


;*************  500msec Timer Subroutine  ***************
t500m   movlw   d'5'            ;Set loop counter
        movwf   cnt500m         ;Save loop counter
tm3lp   call    t100m           ;100msec subroutine
        decfsz  cnt500m,f       ;cnt500m - 1 = 0 ?
        goto    tm3lp           ;No. Continue
        return                  ;Yes. Count end

;**************  1sec Timer Subroutine  *****************
t1s     movlw   d'2'            ;Set loop counter
        movwf   cnt1s           ;Save loop counter
tm4lp   call    t500m           ;500msec subroutine
        decfsz  cnt1s,f         ;cnt1s - 1 = 0 ?
        goto    tm4lp           ;No. Continue
        return                  ;Yes. Count end


;********************************************************
;          END of LED flash control processing
;********************************************************

        end

