PICの小さなプログラム
Home
PICの小さなプログラム
PIC用の小さなプログラムをだらだらと掲載
シリアル通信(送信)
9600bpsとすると1ビットの長さは104.17uS, クロック4MHzなら1サイクルは1uS。
送信データはSENDDATAに1バイト分格納する
SENDDATA EQU 20h
COUNT1 EQU 21h
BTF PORTB, 1 ;送信に使うPORTBのビット1をHIGHに固定する
SEND1BYTE:
;スタートビット 1ビット長だけLOWにする
BCF PORTB, 1
CALL WAIT1BIT ;1ビット長分のウエイト
;BTFSS → 2サイクル使う → ビット変化 → 2サイクル使う → 時間待ち
;7ビット目の処理
BIT7:
BTFSS SENDDATA, 7 ;SENDDATA<7>=1なら次をスキップ
GOTO ZERO7
NOP
BSF PORTB,1 ;7ビット目が1なら出力を1にする
GOTO END7
ZERO7:
BCF PORTB,1 ;7ビット目が0なら出力を0にする
NOP
NOP
;BCFを含めて3サイクルある
END7:
CALL WAIT1BIT ;1ビット長分のウエイト
;この後信号変化手前まで3サイクルある
BIT6:
BTFSS SENDDATA, 6 ;SENDDATA<6>=1なら次をスキップ
GOTO ZERO6
BSF PORTB,1 ;6ビット目が1なら出力を1にする
GOTO END6
ZERO6:
BCF PORTB,1 ;7ビット目が0なら出力を0にする
END6:
CALL WAIT1BIT ;1ビット長分のウエイト
BIT5:
BTFSS SENDDATA, 5 ;SENDDATA<5>=1なら次をスキップ
GOTO ZERO5
BSF PORTB,1 ;5ビット目が1なら出力を1にする
GOTO END5
ZERO5:
BCF PORTB,1 ;5ビット目が0なら出力を0にする
END5:
CALL WAIT1BIT ;1ビット長分のウエイト
BIT4:
BTFSS SENDDATA, 4 ;SENDDATA<5>=1なら次をスキップ
GOTO ZERO4
BSF PORTB,1 ;5ビット目が1なら出力を1にする
GOTO END4
ZERO4:
BCF PORTB,1 ;5ビット目が0なら出力を0にする
END4:
CALL WAIT1BIT ;1ビット長分のウエイト
BIT3:
BTFSS SENDDATA, 3 ;SENDDATA<5>=1なら次をスキップ
GOTO ZERO3
BSF PORTB,1 ;5ビット目が1なら出力を1にする
GOTO END3
ZERO3:
BCF PORTB,1 ;5ビット目が0なら出力を0にする
END3:
CALL WAIT1BIT ;1ビット長分のウエイト
BIT2:
BTFSS SENDDATA, 2 ;SENDDATA<5>=1なら次をスキップ
GOTO ZERO2
BSF PORTB,1 ;5ビット目が1なら出力を1にする
GOTO END2
ZERO2:
BCF PORTB,1 ;5ビット目が0なら出力を0にする
END2:
CALL WAIT1BIT ;1ビット長分のウエイト
BIT1:
BTFSS SENDDATA, 1 ;SENDDATA<5>=1なら次をスキップ
GOTO ZERO1
BSF PORTB,1 ;5ビット目が1なら出力を1にする
GOTO END1
ZERO1:
BCF PORTB,1 ;5ビット目が0なら出力を0にする
END1:
CALL WAIT1BIT ;1ビット長分のウエイト
BIT0:
BTFSS SENDDATA, 0 ;SENDDATA<5>=1なら次をスキップ
GOTO ZERO0
BSF PORTB,1 ;5ビット目が1なら出力を1にする
GOTO END0
ZERO0:
BCF PORTB,1 ;5ビット目が0なら出力を0にする
END0:
CALL WAIT1BIT ;1ビット長分のウエイト
;ストップビット
BCF PORTB, 1 ;
CALL WAIT1BIT ;1ビット長分のウエイト
BSF PORTB, 1 ;通信ラインをHIGHに戻す
RETURN
WAIT1BIT:
;94サイクルのウエイト
MOVLW 30
MOVWF COUNT1
LOOP1
DECFSZ COUNT1, f
GOTO LOOP1
NOP
RETURN