http://joshua.cs.inf.shizuoka.ac.jp/2003/V050/no4/index.html
シリアル通信のテスト
ちょっと改変して使ってみよう。
LIST P=PIC16F84 ;PIC16F84を使う
INCLUDE "P16C84.INC" ;標準インクルードファイル読み込み
;******************************************************
;ファイルレジスタの定義
;******************************************************CBLOCK 0CH
;***シリアル通信用***
DAT1B ;***データ格納 ***
CNT8 ;***カウント用 ***
SCNTENDC
;******************************************************
;定数定義
;******************************************************
;***シリアル通信用***
RS_IN EQU 02H ;***データの入力ピン(RA2)***
RS_OUT EQU 03H ;***データの出力ピン(RA3)***BSF STATUS,RP0 ;Bankを1にする
CLRF TRISB ;ポートBを全て出力に設定
BCF STATUS,RP0 ;Bankを0に戻す
LEDTEST
CALL READ1B
MOVWF PORTB ;ポートBに出力
GOTO LEDTEST
;******************************************************
;シリアル通信に関する関数定義
;******************************************************
;***半周期待ち関数(動作周波数10MHz,通信速度9600bps)***
HALFWAIT
MOVLW 028H
MOVWF SCNT
WAITLOOP
DECFSZ SCNT, F
GOTO WAITLOOP
NOP
NOP
RETURN;***1バイト読み込み関数(読み込み失敗時Zフラグがセットされる)***
READ1B
CLRF DAT1B ;***受信バッファをクリアする(Zフラグも1にする)***
BTFSS PORTA, RS_IN ;*** データがきているかチェック***
GOTO EXITREAD1B
CALL HALFWAIT
CALL HALFWAIT
BTFSS PORTA, RS_IN
GOTO EXITREAD1BMOVLW 08H ;***1バイトのデータ読み込み***
MOVWF CNT8
READLP
CLRC
RRF DAT1B, FCALL HALFWAIT
CALL HALFWAIT
CALL HALFWAIT
CALL HALFWAITBTFSS PORTA, RS_IN
BSF DAT1B, 7DECFSZ CNT8, F
GOTO READLPCALL HALFWAIT ;***終了ビットを待つ***
CALL HALFWAIT
CALL HALFWAIT
CALL HALFWAIT
MOVF DAT1B, W ;***入力データをWに移動させてリターン***
CLRZ
RETURNEXITREAD1B
SETZ
RETURN;***1バイト送信関数***
SEND1B
MOVWF DAT1B ;***出力データをロードする***
BSF PORTA, RS_OUT ;***スタートビット***CALL HALFWAIT
CALL HALFWAIT
CALL HALFWAIT
CALL HALFWAITMOVLW 08H
MOVWF CNT8
SENDLP
BTFSS DAT1B, 0
BSF PORTA, RS_OUT
BTFSC DAT1B, 0
BCF PORTA, RS_OUTCALL HALFWAIT
CALL HALFWAIT
CALL HALFWAIT
CALL HALFWAITCLRC
RRF DAT1B, FDECFSZ CNT8, F
GOTO SENDLP;***エンドビット***
BCF PORTA, RS_OUT
CALL HALFWAIT
CALL HALFWAIT
CALL HALFWAIT
CALL HALFWAITRETURN
;******************************************************
;終了
;******************************************************
END