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