; Copyright 2005 Yasuhiro Kanzaki ; f877A100.asm A-D変換テストプログラム   リスト12-1 list p=16f877A ; #include ; __CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _LVP_OFF & _CPD_OFF ; 変数定義域 t_work3 equ 022h ; 20μsタイマ用ワーク work1 equ 023h ; 変換データ保存用のワークエリア ORG 000h ; リセット時の開始位置 goto main ; org 01ch main: ;タイマ1初期化 movlw 0ah ;プリスケーラ1:1 32.768kHz ,外部クロック,同期 movwf T1CON bsf T1CON,TMR1ON; タイマ1オン bcf STATUS,RP0 ; バンク0を選択する clrf PORTD ; ポートDの出力レジスタをクリア bsf STATUS,RP0 ; バンク1を選択 Clrf TRISD ; TRISDが0で出力,1で入力 bcf OPTION_REG,NOT_RBPU ;ポートBプルアップ ;A-D変換器の処理についての初期化 movlw b'00000011' ; 左詰 チャンネル3はレファレンス入力 bcf STATUS,RP0 ; バンク0に設定 btfsc PORTB,1 ; ビット1をチェック movlw b'10000011' ; 右詰を設定,チャンネル3はレファレンス入力 bsf STATUS,RP0 ; バンク1を設定 movwf ADCON1 ; 右詰,全ビットアナログ入力 bcf STATUS,RP0 ; バンク0を選択 movlw b'10000001' ; ADCS1~ADCS0 10 ADON=1 movwf ADCON0 ; ADコンバータ起動,32Tosc,チャンネル0 loop bcf ADCON0,CHS0 ; チャンネル0を指定するためクリア btfss PORTB,0 ; DIPスイッチの入力チェック bsf ADCON0,CHS0 ; チャンネル1を選択 call dtm20 ; データ・アクイシジョン時間待ち bsf ADCON0,GO ; AD変換開始 dloop2: btfsc ADCON0,GO ; AD変換完了を待つ goto dloop2 ; 完了まで繰り返す btfsc PORTB,2 ; ADRESH,ADRESLの選択をDIPスイッチで確認 goto adh ;  banksel ADRESL ; ADRESLはバンク1にあるのでバンクの切替が必要 movf ADRESL,W ; 下位ADRESLの変換データを取り出す banksel PORTD ; バンク0に設定 goto adout adh movf ADRESH,w ; ADRESHの変換データを取り出す adout movwf work1 ; 変換データを保存 btfss PORTB,3 ; 2倍するかチェック rlf work1,W ;  左に1ビットシフトすることで2倍になる movwf PORTD ; ポートDに結果表示 ; 表示のインターバルを取るため タイマ1による時間待ち処理 movlw 0C0h movwf TMR1H bcf PIR1,TMR1IF rt btfss PIR1,TMR1IF goto rt goto loop ; 繰り返す ; 20μの時間待ちのルーチン dtm20 movlw d'30' ; アクイジョン時間待ちルーチン movwf t_work3 ; dloop: decfsz t_work3,f ; 20μsが最小時間なので少し余裕を持った goto dloop ; return END ; プログラムの終わり