目次>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 ; プログラムの終了をアセンブラに指示する ; ========================== ここまで ==============================