list p=16f877a ; PIC16F877A 用のプログラムであることを宣言 #include p16f877a.inc ; PIC16F877A 用のヘッダ・ファイルを読み込む __config _HS_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF CT_DELAY1MS equ 0x20 CT_DELAYNS equ 0x21 ; 初期設定をする bcf STATUS, RP0 ; この2行でバンク0にする bcf STATUS, RP1 clrf PORTC ; LED が点灯しないように0に clrf PORTD ; 出力は0にしておく clrf PORTE ; 出力は0にしておく movlw B'01000001' ; A-Dコンバータの設定(ADCON0) movwf ADCON0 bsf STATUS, RP0 ; バンク1にする movlw 0xff movwf TRISB ; ポートBはディジタル入力 bcf OPTION_REG, NOT_RBPU ; ポートBのウィーク・プルアップを有効に clrf TRISC ; 全ピン出力に clrf TRISD ; 全ピン出力に movlw B'01000000' ; A-Dコンバータの設定(ADCON1) movwf ADCON1 bcf STATUS, RP0 ; バンク0にする ; 初期設定は終了 ; メイン・ルーチン loop ; AD 変換する bsf ADCON0, GO ; A-D変換開始 btfsc ADCON0, GO ; A-D変換終了まで待つ goto $-1 ; 点滅の部分 movlw B'00100001' ; movwf PORTC ; 点灯 movfw ADRESH ; 結果を読み込む(上位バイト) call delayns ; ADRESH×2[ms]待ち movlw B'00100000' ; movwf PORTC ; 消灯 movfw ADRESH ; 結果を読み込む(上位バイト) call delayns ; ADRESH×2[ms]待ち goto loop ; メイン・ルーチンは、ここまで delay10us: goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 nop ; 1 return ; 2 delay1ms: movlw D'89' ; 1 movwf CT_DELAY1MS ; 1 delay1msl1: call delay10us ; 25 decfsz CT_DELAY1MS, f ; 1(次の行を実行)、2(次の行はとばす) goto delay1msl1 ; 2 nop ; 1 goto $+1 ; 2 return ; 2 delayns: movwf CT_DELAYNS ; 1 movf CT_DELAYNS, f ; 1 btfsc STATUS, Z ; 1 return ; 2 delaynsl1: call delay1ms ; 2500 call delay1ms ; 2500 decfsz CT_DELAYNS, f ; 1(次の行を実行)、2(次の行はとばす) goto delaynsl1 ; 2 return ; 2 end リスト5-2 Copyright 2005 Noriaki Mitsunaga