;       7セグメントLED表示4桁カウンタ
;       (クロック 4MHz)
;
; [ ご注意 ]
;PIC プログラムには秋月電子製のライター・キットを使用しているため、アセン
;ブルにはキットに付属のアセンブラを使用しています。
;プログラム本体は PIC の基本命令だけでの構成に書き替えていますが、ヘッ
;ダー部分などが異なる場合がありますので、他のアセンブラを使用する場合は
;適宜変更してご利用下さい。
;
;

        include 16f84.h

        .16f84
        .osc    hs
        .pwrt   on
        .wdt    off
        .protect off

countsw equ     rb.0            ;カウント入力ポート

        org     0ch

d1      ds      1               ;カウント用
d2      ds      1
d3      ds      1
d4      ds      1

swlc    ds      1               ;swait でのループ回数
sd      ds      1               ;表示データ (0~9)
lc      ds      1               ;汎用、ループ用

        org     0
        goto    start
        org     4
        goto    start

start                           ;初期設定
        bsf     3h,5            ;ページ 1
        movlw   10000b
        movwf   85h             ;ポート ra の初期化
        movlw   00000001b
        movwf   86h             ;ポート rb の初期化
        bcf     3h,5            ;ページ 0

        clrf    d1              ;カウントデータの初期化
        clrf    d2
        clrf    d3
        clrf    d4

ct10:   btfsc   countsw         ;入力が 0 なら次をスキップ
        goto    ct12
        call    swait
        btfsc   countsw         ;入力が 0 なら次をスキップ
        goto    ct12            ;確かでないなら戻る

        incf    d1,1            ;加算
        movlw   10
        subwf   d1,0
        btfss   3h,2
        goto    ct11
        clrf    d1
        incf    d2,1
        movlw   10
        subwf   d2,0
        btfss   3h,2
        goto    ct11
        clrf    d2
        incf    d3,1
        movlw   10
        subwf   d3,0
        btfss   3h,2
        goto    ct11
        clrf    d3
        incf    d4,1
        movlw   10
        subwf   d4,0
        btfss   3h,2
        goto    ct11
        clrf    d4

ct11:   call    swait
        btfss   countsw         ;入力が 1 なら次をスキップ
        goto    ct11            ;入力が 1 になるのを待つ
        call    swait
        btfss   countsw         ;確かに入力が 1 に戻ったかを確認
        goto    ct11

ct12:   movlw   11111110b
        movwf   rb
        movlw   01101b
        movwf   ra              ;桁4へ表示
        movf    d4,0
        movwf   sd
        call    l7ptset
        call    wait

        movlw   11111110b
        movwf   rb
        movlw   01110b
        movwf   ra              ;桁 3 へ表示
        movf    d3,0
        movwf   sd
        call    l7ptset
        call    wait

        movlw   11111110b
        movwf   rb
        movlw   00111b
        movwf   ra              ;桁 2 へ表示
        movf    d2,0
        movwf   sd
        call    l7ptset
        call    wait

        movlw   11111110b
        movwf   rb
        movlw   01011b
        movwf   ra              ;桁 1 へ表示
        movf    d1,0
        movwf   sd
        call    l7ptset
        call    wait

        goto    ct10

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

l7ptset:                ;sd に指定された 0~9 の数字をセットする

        bcf     3h,0            ;キャリフラグのクリア
        rlf     sd,1            ;4倍
        rlf     sd,1
        movf    sd,0            ;sd の値を w にコピー
        addwf   pc,1            ;プログラム・カウンタに加算

        movlw   00000010b       ;0
        movwf   rb
        goto    pt10
        nop
        movlw   11100110b       ;1
        movwf   rb
        goto    pt10
        nop
        movlw   10010000b       ;2
        movwf   rb
        goto    pt10
        nop
        movlw   11000000b       ;3
        movwf   rb
        goto    pt10
        nop
        movlw   01100100b       ;4
        movwf   rb
        goto    pt10
        nop
        movlw   01001000b       ;5
        movwf   rb
        goto    pt10
        nop
        movlw   00001100b       ;6
        movwf   rb
        goto    pt10
        nop
        movlw   11100010b       ;7
        movwf   rb
        goto    pt10
        nop
        movlw   00000000b       ;8
        movwf   rb
        goto    pt10
        nop
        movlw   01100000b       ;9
        movwf   rb
pt10:
        return

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

swait:          ;カウント入力時のウェイト・ルーチン

        movlw   6               ;6回のループ
        movwf   swlc

swt10   movlw   11111110b
        movwf   rb
        movlw   01101b
        movwf   ra
        movf    d4,0
        movwf   sd
        call    l7ptset
        call    wait

        movlw   11111110b
        movwf   rb
        movlw   01110b
        movwf   ra
        movf    d3,0
        movwf   sd
        call    l7ptset
        call    wait

        movlw   11111110b
        movwf   rb
        movlw   00111b
        movwf   ra
        movf    d2,0
        movwf   sd
        call    l7ptset
        call    wait

        movlw   11111110b
        movwf   rb
        movlw   01011b
        movwf   ra
        movf    d1,0
        movwf   sd
        call    l7ptset
        call    wait

        decfsz  swlc,1
        goto    swt10

        return

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

wait:           ;ウェイトルーチン(1桁の表示時間)

        movlw   100
        movwf   lc
wt10    decfsz  lc,1
        goto    wt10
        return