;***** LED_flash.asm ******************************************************
;
;	LEDフラッシャー (The LED flash control processing)
;
;	origin:  http://www.hobby-elec.org/pic6_15.htm  by Seiichi Inoue
;
;	coding:  Ver. 1.00   2004/06/03  by Minoru Yamamoto 
;	update:  Ver. 1.10   2005/01/28  コードを全面的に書き換え
;	bugfix:  Ver. x.xx
;
;******************************************************* PicAsm 0176 ******

        list            p=pic16f84a
        include         p16f84a.inc
        errorlevel      -302    ;Eliminate bank warning

        __config _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

;==========================================================================
;	ラベル定義
;==========================================================================

ra0     equ     00              ;スイッチ1
ra1     equ     01              ;スイッチ2
ra2     equ     02              ;スイッチ3
ra3     equ     03              ;スイッチ4
ra4     equ     04              ;スイッチ5

cnt500u equ     0c              ;500μ秒ループカウンタ
cnt1m   equ     0d              ;1m 秒ループカウンタ
cnt100m equ     0e              ;100m 秒ループカウンタ
cnt500m equ     0f              ;500m 秒ループカウンタ
cnt1s   equ     10              ;1 秒ループカウンタ

;	Pattern Data 定義	'1':OFF  '0':ON

;	Pattern 0

p00     equ     b'11111110'
p01     equ     b'11111101'
p02     equ     b'11111011'
p03     equ     b'11110111'
p04     equ     b'11101111'
p05     equ     b'11011111'
p06     equ     b'10111111'
p07     equ     b'01111111'

;	Pattern 1

p10     equ     b'01111111'
p11     equ     b'10111111'
p12     equ     b'11011111'
p13     equ     b'11101111'
p14     equ     b'11110111'
p15     equ     b'11111011'
p16     equ     b'11111101'
p17     equ     b'11111110'

;	Pattern 2

p20     equ     b'01111110'
p21     equ     b'10111101'
p22     equ     b'11011011'
p23     equ     b'11100111'
p24     equ     b'11011011'
p25     equ     b'10111101'
p26     equ     b'01111110'

;	Pattern 3

p30     equ     b'11111110'
p31     equ     b'11111101'
p32     equ     b'11111010'
p33     equ     b'11110101'
p34     equ     b'11101010'
p35     equ     b'11010101'
p36     equ     b'10101010'
p37     equ     b'01010101'
p38     equ     b'10101011'
p39     equ     b'01010111'
p3a     equ     b'10101111'
p3b     equ     b'01011111'
p3c     equ     b'10111111'
p3d     equ     b'01111111'

;	Pattern 4

p40     equ     b'00000000'
p41     equ     b'11111111'
p42     equ     b'00000000'
p43     equ     b'11111111'
p44     equ     b'00000000'
p45     equ     b'11111111'
p46     equ     b'00000000'
p47     equ     b'11111111'
p48     equ     b'00000000'

;==========================================================================
;	プログラム開始
;==========================================================================

        org     0               ;Reset Vector
        goto    init
        org     4               ;Interrupt Vector
        goto    init            ;割り込みは使用しない

;==========================================================================
;	初期化処理
;==========================================================================

init    bsf     STATUS,RP0      ;Bank 1 
        movlw   h'ff'
        movwf   TRISA           ;PORTA（すべて入力）の設定
        clrf    TRISB           ;PORTB（すべて出力）の設定
        bcf     STATUS,RP0      ;Bank 0
        movlw   h'ff'           ;LED off data の設定
        movwf   PORTB           ;ポートB に出力

;==========================================================================
;	メイン・ルーチン
;==========================================================================

	; キースキャン処理

keyscan btfss   PORTA,ra0       ;スイッチ1 = ON か？
        goto    auto_Pattern    ;Yes.
        btfss   PORTA,ra1       ;スイッチ2 = ON か？
        call    ptn1
        btfss   PORTA,ra2       ;スイッチ3 = ON か？
        call    ptn2
        btfss   PORTA,ra3       ;スイッチ4 = ON か？
        call    ptn3
        btfss   PORTA,ra4       ;スイッチ5 = ON か？
        call    ptn4
        goto    keyscan

	; 自動パタン変更出力

auto_Pattern
        call    ptn0            ;Call Pattern 0
        call    ptn1            ;Call Pattern 1
        call    ptn0            ;Call Pattern 0
        call    ptn1            ;Call Pattern 1
        call    ptn2            ;Call Pattern 2
        call    ptn2            ;Call Pattern 2
        call    ptn2            ;Call Pattern 2
        call    ptn3            ;Call Pattern 3
        call    ptn5            ;Call Pattern 5
        call    ptn4            ;Call Pattern 4
        goto    keyscan

;==========================================================================
;	Pattern 0 出力 サブルーチン
;==========================================================================

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
        call    t100m           ;Wait 100msec
        movlw   h'ff'           ;Set LED off data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        return

;==========================================================================
;	Pattern 1 出力 サブルーチン
;==========================================================================

ptn1    movlw   p10             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p11             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p12             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p13             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p14             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p15             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p16             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p17             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   h'ff'           ;Set LED off data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        return

;==========================================================================
;	Pattern 2 出力 サブルーチン
;==========================================================================

ptn2    movlw   p20             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p21             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p22             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p23             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p24             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p25             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p26             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   h'ff'           ;Set LED off data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        return

;==========================================================================
;	Pattern 3 出力 サブルーチン
;==========================================================================

ptn3    movlw   p30             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p31             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p32             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p33             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p34             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p35             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p36             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p37             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p38             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p39             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p3a             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p3b             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p3c             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p3d             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   h'ff'           ;Set LED off data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        return

;==========================================================================
;	Pattern 4 出力 サブルーチン
;==========================================================================

ptn4    movlw   p40             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t1s             ;Wait 1sec
        movlw   p41             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t1s             ;Wait 1sec
        movlw   p42             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t1s             ;Wait 1sec
        movlw   p43             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t1s             ;Wait 1sec
        movlw   p44             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t1s             ;Wait 1sec

        btfss   PORTA,ra0       ;スイッチ1 = ON か？
        goto    pass            ;Yes.

        movlw   p45             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t1s             ;Wait 1sec
        movlw   p46             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t1s             ;Wait 1sec
        movlw   p47             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t1s             ;Wait 1sec
        movlw   p48             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t1s             ;Wait 1sec

pass    movlw   h'ff'           ;Set LED off data
        movwf   PORTB           ;Output data
        call    t1s             ;Wait 1sec
        return

;==========================================================================
;	Pattern 5 出力 サブルーチン
;==========================================================================

ptn5    movlw   p3d             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p3c             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p3b             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p3a             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p39             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p38             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p37             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p36             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p35             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p34             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p33             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p32             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p31             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   p30             ;Set pattern data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        movlw   h'ff'           ;Set LED off data
        movwf   PORTB           ;Output data
        call    t100m           ;Wait 100msec
        return

;==========================================================================
;	各種タイマ サブルーチン for 10MHz clock
;==========================================================================

	; 1m 秒タイマ サブルーチン

t1m     movlw   d'2'            ;(1)       
        movwf   cnt1m           ;(1)       1m 秒ループカウンタ = 2
tm1lp1  movlw   d'249'          ;(1)*2     
        movwf   cnt500u         ;(1)*2     500μ秒ループカウンタ = 249
tm1lp2  nop                     ;(1)*249*2 
        nop                     ;(1)*249*2 
        decfsz  cnt500u,F       ;(1)*249*2 500μ秒ループカウンタ - 1 = 0 か？
        goto    tm1lp2          ;(2)*248*2 No.

        decfsz  cnt1m,F         ;(1)*2     1m 秒ループカウンタ - 1 = 0 か？
        goto    tm1lp1          ;(2)       No.
        return                  ;(2)       
                                ;Total 2501*0.4usec=1msec

	; 100m 秒タイマ サブルーチン

t100m   movlw   d'100'
        movwf   cnt100m         ;100m 秒ループカウンタ = 100 を設定
tm2lp   call    t1m             ;1m 秒タイマ
        decfsz  cnt100m,F       ;100m 秒ループカウンタ - 1 = 0 か？
        goto    tm2lp           ;No.
        return

	; 500m 秒タイマ サブルーチン

t500m   movlw   d'5'
        movwf   cnt500m         ;500m 秒ループカウンタ = 5 を設定
tm3lp   call    t100m           ;100m 秒タイマ
        decfsz  cnt500m,F       ;500m 秒ループカウンタ - 1 = 0 か？
        goto    tm3lp           ;No.
        return

	; 1 秒タイマ サブルーチン

t1s     movlw   d'2'
        movwf   cnt1s           ;1 秒ループカウンタ = 2 を設定
tm4lp   call    t500m           ;500m 秒タイマ
        decfsz  cnt1s,F         ;1 秒ループカウンタ - 1 = 0 か？
        goto    tm4lp           ;No.
        return

        end			;END of LED flash control
