; Copyright 2005 Yasuhiro Kanzaki ;********************************************************************** ; コンペアテスト・プログラム f877038.asm リスト8-2 * list p=16f877A ; listはデバイス定義の擬似命令(ディレクティブ) #include ; デバイスに対応した変数定義のファイルを読み込む __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF ;***** 変数定義 t_work1 equ 020h w_temp equ 70h ; 汎用レジスタをWレジスタの保存用に定義 status_temp equ 71h ; 汎用レジスタをSTATUSレジスタ保存用に定義 ORG 000h ; プログラム開始アドレス goto main ;割り込み処理ルーチン ORG 004h ; 割り込み処理の開始アドレス movwf w_temp ; Wレジスタを保存 movf STATUS,w ; STATUSレジスタの保存のためWレジスタへ移す movwf status_temp ; STATUSレジスタを保存 decf PORTD,f ; PORTDをカウントダウン btfss STATUS,Z goto skip swapf PORTB,W ; DIPスイッチのデータを読み込む movwf PORTD ; ポートDに出力 movwf CCPR1H skip bcf PIR1,CCP1IF ; 割り込みフラグのクリア movf status_temp,w ; movwf STATUS ; STATUSレジスタの回復 swapf w_temp,f ; STATUSレジスタに影響を与えないためswapf命令を利用 swapf w_temp,w ; Wレジスタを回復 retfie ; 割りこみ処理を終えメイン・ルーチンに戻る ;メインルーチン 初期化処理 main bcf STATUS,RP0 clrf PORTD ;タイマ1初期化 movlw 0ah ;プリスケーラ1:1 32.768kHz ,外部クロック,同期 movwf T1CON bsf T1CON,TMR1ON ; タイマ1オン ;CCP1初期化 movlw 00bh ; コンペア,スペシャル・イベント・トリガ movwf CCP1CON ;  clrf CCPR1L ; 下位バイトを00hにする ;PORTD ポートB設定 bsf STATUS,RP0 ; バンク1を設定 Clrf TRISD ; ポートDを出力に設定 bcf OPTION_REG,NOT_RBPU ; ポートBプルアップ ;割り込み処理設定 bsf PIE1,CCP1IE ;タイマ2割り込みイネーブル bcf STATUS,RP0 ; バンク0 bsf INTCON,GIE ; 全体の割り込み処理を許可; bsf INTCON,PEIE ; 周辺装置からの割り込み処理許可 bcf PIR1,CCP1IF ; CCP1の割り込みフラグをクリア swapf PORTB,W ; DIPスイッチのデータを読み込む movwf PORTD ; ポートDに出力 movwf CCPR1H ; 周期レジスタに初期値を設定 rep11 nop ;何もしない goto rep11 ;繰り返す END ; プログラムの終了