; Copyright 2005 Yasuhiro Kanzaki ; USARTのテスト 2 usart020.asm リスト10-2 * list p=16f877A #include ; __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _CPD_OFF ;***** 変数定義 w_temp equ 70h ; 汎用レジスタをWレジスタの保存用に定義 status_temp equ 71h ; 汎用レジスタをSTATUSレジスタ保存用に定義 fsr_temp equ 72h ; FSR間接アドレス指定を行うのでFSRレジスタも保存する s_p equ 2eh ; 受信バッファの書き込みポインタ e_p equ 2fh ; 受信バッファの読み取りポインタ ORG 000h ; プログラム開始アドレス goto main ; @割り込み処理ルーチン ORG 004h ; 割り込み処理の開始アドレス movwf w_temp ; Wレジスタを保存 movf STATUS,w ; STATUSレジスタの保存のためWレジスタへ移す movwf status_temp ; STATUSレジスタを保存 movf FSR,w ; 間接アドレス・インデックス  movwf fsr_temp ; FSRの保存 bcf STATUS,RP0 ; バンク0指定 btfsc PIR1,RCIF ; 受信割り込みかチェック call rx_data ; 受信割り込み時受信処理に movf fsr_temp,w ; 他の処理が無いので以後保存レジスタの回復処理 movwf FSR ; movf status_temp,w ; movwf STATUS ; STATUSレジスタの回復 swapf w_temp,f ; STATUSレジスタに影響を与えないためswapf命令を利用 swapf w_temp,w ; Wレジスタを回復 retfie ; 割り込み処理を終えメイン・ルーチンに戻る rx_data incf s_p,f ; A受信データがあり書き込みポインタをカウントアップ movf s_p,w ; BWレジスタにセット sublw 040h ; 上限超えか? btfss STATUS,Z ;  goto jamprx1 ; movlw 30h ; 上限超えの場合先頭に戻る movwf s_p ; jamprx1 movf s_p,w ; movwf FSR ; C読み取りアドレスを間接アドレス・レジスタに指定 movf RCREG,w ; 受信データを読み取る movwf INDF ; 受信データを間接アドレス指定で書き込む bcf PIR1,RCIF ; 受信割り込みフラグをクリア return ;メインルーチン 初期化処理 main bcf STATUS,RP0 ; USART 初期化処理 movlw 30h movwf s_p ; 受信バッファのポインタの初期化 movwf e_p ; bsf STATUS,RP0 ; バンク1 movlw D'32' ; 10MHz 19.2kボーを設定 movwf SPBRG ;  bsf TXSTA,BRGH ; ボーレート ハイを設定 bsf TXSTA,TXEN ; 送信イネーブル bcf STATUS,RP0 ; バンク0 bsf RCSTA,SPEN ; シリアル・ポート イネーブル bsf RCSTA,CREN ; ;割り込み処理設定 bcf STATUS,RP0 ; バンク0 bsf INTCON,GIE ; 全体の割り込み処理を許可; bsf INTCON,PEIE ; 周辺装置からの割り込み処理許可 bsf STATUS,RP0 ; バンク1 bsf PIE1,RCIE ; CCP1の割り込みフラグをクリア bcf STATUS,RP0 ; バンク0 ; 受信処理ルーチン RXloop call get_rd ; 受信データの有無をチェック btfsc STATUS,Z ; Z=1で受信データなし goto RXloop ; 繰り返す movwf TXREG ; 送信レジスタに書き込み送信 goto RXloop ; 繰り返す ; D get_rd movf e_p,w ; e_p =s_pをチェック subwf s_p,w ;  btfsc STATUS,Z ; return ; e_p =s_pで受信データ無く戻る incf e_p,f ; E受信デーがあるのでカウントアップ movf e_p,w ;  sublw 040h ; F上限チェック btfss STATUS,Z ; 上限を超えたらZ=1 goto jpget2 ; movlw 30h ; 上限超え先頭に戻る movwf e_p ;    jpget2 movf e_p,w ;  movwf FSR ; movf INDF,w ; G間接アドレス指定で受信データをWレジスタにセット return ; end