目次>5章 第2ステップ(色々な実験)>(6)LEDの明るさを序所に変える(TMR0割込み使用)>ソース
LEDの明るさを序所に変える(TMR0割込み使用)(ソース)
更新日2005.10.15
以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。
; ========================== ここから ==============================
; CLOCK 10MHz
; PORTB 0:LED緑,1:LED赤
;
; 緑のLEDの明るさを徐々に変える(TMR0使用)
;
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〜99)
t_width EQU 0Dh ; ONの時間(パルス幅)をカウント(0〜99)
t_add EQU 0Eh ; t_widthに加算する値(1 or −1)
save_st EQU 0Fh ; STATUSのセーブ領域
save_w EQU 010h ; W-regのセーブ領域
ORG 0 ; リセットベクタ(0番地)を指定する。
GOTO INIT ; 初期処理に行く
; << TMR0割込み処理 >>
ORG 4 ; 割込みベクタ(4番地)を指定する。
BCF INTCON,T0IF ; 割込みフラグクリア
MOVWF save_w ; W-regセーブ
SWAPF STATUS,W
MOVWF save_st ; STATUSレジスタセーブ
INCF t_cycle,F
MOVLW d'100'
SUBWF t_cycle,W
BTFSS STATUS,Z ; t_cycle = 100 ?
GOTO T0EXIT ; no
; yes
CLRF t_cycle ; 0 → t_cycle
MOVF t_add,W
ADDWF t_width,F ; t_widthにt_addを加算
BSF PORTB,0 ; RB0をON
T0EXIT
SWAPF save_st,W
MOVWF STATUS ; STATUSレジスタロード
SWAPF save_w,F
SWAPF save_w,W ; W-regロード
RETFIE ; 割込み許可にしてリターン
; ここまでTMR0割込み処理
INIT
; << PICの初期化 >>
BSF STATUS,RP0 ; ファイルレジスタSTATUSのRP0をセット(1)する → バンク1
CLRF TRISB ; ファイルレジスタTRISBをクリア(0) → PORTBは全て出力
MOVLW 080h ; OPTIONレジスタの設定
MOVWF OPTION_REG ; ^RBPU:1 ,T0CS:0(内部クロック) ,PSA:0(プリスケーラはTMR0) ,PS2-PS0:000(2倍)
BCF STATUS,RP0 ; STATUSのRP0をクリア(0) → バンク0
MOVLW 0A0h ; INTCONの設定
MOVWF INTCON ; GIE:1 ,T0IE:1
CLRF PORTB ; PORTBのLEDをOFF
MOVLW d'1'
MOVWF t_add ; 1 → t_add
CLRF t_cycle ; 0 → t_cycle
CLRF t_width ; 0 → t_width
CLRF TMR0 ; TMR0をクリア
; << メイン処理 >>
LOOP
MOVF t_width,W
SUBWF t_cycle,W
BTFSC STATUS,Z ; t_cycle = t_width ?
BCF PORTB,0 ; yes RB0をOFF
MOVLW d'99'
SUBWF t_width,W
BTFSC STATUS,Z ; t_width = 99 ?
GOTO MAIN20 ; yes
MOVF t_width,W
BTFSS STATUS,Z ; t_width = 0 ?
GOTO LOOP ; no
MOVLW d'1'
MOVWF t_add ; 1 → t_add
BSF PORTB,1 ; RB1 ON (赤色LED点灯)
GOTO LOOP
MAIN20
MOVLW 0FFh
MOVWF t_add ; -1 → t_add
BCF PORTB,1 ; RB1 OFF (赤色LED消灯)
GOTO LOOP
END ; プログラムの終了をアセンブラに指示する
; =========================== ここまで ===============================