目次>5章 第2ステップ(色々な実験)>(3)LEDの明るさを序所に変える>ソース

LEDの明るさを序所に変える(ソース)

更新日2005.9.5

以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。

; ========================== ここから ==============================
;   CLOCK   10MHz
;   PORTB   0:LED緑,1:LED赤
;
;   緑のLED(RB0)の明るさを序所に変える
;
        LIST    P=PIC16F84A  ; LIST宣言で、使用するPICをPIC16F84Aと定義する
        INCLUDE P16F84A.INC  ; 設定ファイルp16f84a.incを読み込む

        __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF


t_cycle  EQU    0Ch         ; 1サイクルをカウントする(0〜63)
t_width  EQU    0Dh         ; RB0をONにしている時間(0〜63)
t_count  EQU    0Eh         ; 10mS毎の現在カウンタ(0〜63)

T_04cnt  EQU    0Fh         ; 0.4mSタイマ用カウンタ

        ORG     0           ; リセットベクタ(0番地)を指定する。
INIT
    ; << PICの初期化 >>
        BSF     STATUS,RP0  ; ファイルレジスタSTATUSのRP0をセット(1)する → バンク1
        CLRF    TRISB       ; ファイルレジスタTRISBをクリア(0) → PORTBは全て出力
        BCF     STATUS,RP0  ; STATUSのRP0をクリア(0) → バンク0

    ; << カウンタの初期化 >>
        MOVLW   01h  
        MOVWF   PORTB       ; RB0:ON,RB1:OFFにする
        CLRF    t_cycle
        CLRF    t_width
        CLRF    t_count

    ; << メイン処理 >>
LOOP
        INCF    t_count,F   ; t_countを+1し
        MOVF    t_width,W
        SUBWF   t_count,W   ; t_count >= t_width
        BTFSC   STATUS,C    ;  ならば
        BCF     PORTB,0     ; RB0をOFFにする

        CALL    T04mS       ; 0.4mS待つ

        INCF    t_cycle,F   ; t_cycleを+1し
        MOVLW   30
        SUBWF   t_cycle,W   ; t_cycle < 30
        BTFSS   STATUS,C    ;  ならば
        GOTO    LOOP        ; LOOPに戻る

      ; t_cycle ≧ 30 の時(1サイクル経過した時)は以下の処理をする
        CLRF    t_cycle     ; 0 → t_cycle
        CLRF    t_count     ; 0 → t_count
        BSF     PORTB,0     ; RB0をONにする

        INCF    t_width,F   ; t_widthを+1し
        MOVLW   30
        SUBWF   t_width,W   ; t_width >= 30
        BTFSC   STATUS,C    ;  ならば
        CLRF    t_width     ; 0 → t_width

        GOTO    LOOP        ; LOOPに戻る


    ; << 0.4mS待つサブルーチン >>   
T04mS
        MOVLW   0F9h        ; F9h=249
        MOVWF   T_04cnt     ;  (ループ回数として249をセット)
T04LP   NOP                 ; 何もせず1サイクル消費
        DECFSZ  T_04cnt,F   ; ループ回数−1して0になったら次の命令をスキップ
        GOTO    T04LP
        RETURN              ; このサブルーチン呼出し元に戻る

        END                 ; プログラムの終了をアセンブラに指示する

; ========================== ここまで ==============================