by Tony Nixon
These simple serial routines may help.19200 baud Fosc = 4MHz Receive can be polled or interrupt driven.
; ; ---------------- ; TRANSMIT ROUTINE ; ---------------- ; TxRoutine movwf TxSend ; temp store data to be sent bcf PORT,TX ; do start bit call HBDelay5 call HBDelay2 ; movlw 8h ; 8 data bits to send movwf BCount ; TxLoop rrf TxSend btfsc STATUS,C goto TxHiBit ; nop bcf PORT,TX goto DoneBit ; TxHiBit bsf PORT,TX goto $ + 1 ; DoneBit call HBDelay5 ; wait 1 bit length call HBDelay5 decfsz BCount goto TxLoop ; call DoRet nop bsf PORT,TX ; stop bit call HBDelay1 call HBDelay DoRet return ; ; ; --------------- ; RECEIVE ROUTINE ; --------------- ; RxRoutine bcf flag1,data btfsc PORT,RX ; wait for start bit return ; call HBDelay2 ; wait 1/2 bit length - 2 cycles movlw 9h movwf BCount ; RxLoop btfsc PORT,RX ; start bit is lost during routine goto RxHiBit ; bcf STATUS,C ; receive start bit and 8 data bits goto RxLoBit ; RxHiBit bsf STATUS,C nop RxLoBit rrf RxHold call HBDelay4 ; wait 1/2 bit length - 4 cycles call HBDelay5 ; wait 1/2 bit length - 5 cycles decfsz BCount goto RxLoop ; movf RxHold,W bsf flag1,data return ; data returned in W Reg ; ; -------------- ; HALF BIT DELAY ; -------------- ; HBDelay nop HBDelay1 nop HBDelay2 goto $ + 1 HBDelay4 nop HBDelay5 movlw 0x05 movwf BitWait BW decfsz BitWait goto BW nop return
Questions:
Comments: