📄 软件模拟usart.txt
字号:
rxStartChk ;check for START bit
skp0 RX_PIN ;test RX pin for START bit
goto rxEnd ;not found
;start bit found. do following
movlw .8
movwf RX_bcnt ;count for 8 bits incoming data
movlw .4
movwf RX_SLICE ;wait 4 time-slice for 1st data bit
movlw .1
movwf RX_STA ;switch to STATE 1 for 1st data bit sampling
goto rxEnd
rxReceiveBit ;receive DATA bit
decfsz RX_SLICE,f ;wait of bit timing
goto rxEnd
;time to sample incoming data bit
rrf RX_BUFF,f ;right shift for new bit space
bcf RX_BUFF,7 ;pre-set to 0
skp0 RX_PIN ;incoming data bit test
bsf RX_BUFF,7 ;set if data bit = 1
movlw .3 ;3 slice for data bit timing
movwf RX_SLICE ;bit timing for next data bit
decfsz RX_bcnt,f ;see if 8-bit completed
goto rxEnd
;bit receive completed, do follwoing
movlw .2
movwf RX_STA ;set to STATE 2 for idle waiting
bsf RXBF ;set receive buffer full
movf RX_BUFF,w ;display data on PORTB
movwf PORTB
goto rxEnd
rxIdle ;wait for idle
skp0 RX_PIN ;try to find STOP bit
clrf RX_STA ;back to STATE 0 for next byte
goto rxEnd
;====== End of RX =========
rxEnd
;====== start of TX =======
;do TX, if transmit is engaged
skp1 TXEN ;skip if TXEN set, do TX
goto tmr0IntEnd ;not in transmit mode
movf TX_SLICE,f ;see if in bit-timing delay
skpnz ;
goto txDo ;bit-timing completed
decfsz TX_SLICE,f ;keep bit-timing delay
goto txEnd
txDo
;Transmit STATE-MACHINE control
movlw high($)
movwf PCLATH ;set PCLATH before PCL change
movf TX_STA,w ;get current state
andlw 0x03 ;make sure in range
addwf PCL,f ;switch to TX STATE
goto txStartBit ;send START bit
goto txDatBit ;send DATA bit
goto txStop ;send STOP bit
goto txIdle ;set transtim IDLE
txStartBit ;TX_STA=0, send START bit here
bsf TXBUSY ;set TX busy flag
movlw .8
movwf TX_bcnt ;count for 8 bit transmitting
bcf TX_PIN ;start bit
movlw .3
movwf TX_SLICE ;set bit timing
movlw .1
movwf TX_STA ;set transmit STATE-MACHINE
goto txEnd
txDatBit ;TX_STA=1, send DATA bit here
;time for next bit sending
rrf TX_BUFF,f ;rotate bit to C
skpnc ;test C
goto $+3
bcf TX_PIN ;0 out
goto $+2
bsf TX_PIN ;1 out
movlw .3
movwf TX_SLICE ;wait 3 time-slices
decfsz TX_bcnt,f
goto txEnd ;8 bit serial not end
movlw .2
movwf TX_STA ;set transmit STATE-MACHINE
goto txEnd
txStop ;TX_STA=2, send STOP bit here
bsf TX_PIN ;send STOP bit
movlw .3
movwf TX_SLICE ;set bit timing
movlw .3
movwf TX_STA ;set transmit STATE-MACHINE
goto txEnd
txIdle ;TX_STA=3, reset transmission to IDLE
bcf TXBUSY ;not busy
bcf TXEN ;not in transmission
clrf TX_STA ;reset transmit STATE-MACHINE
goto txEnd
;====== End of TX =========
txEnd
;add more TMR0 related code here
tmr0IntEnd
movlw TMR0CONST
addwf TMR0,f
goto int_end
int_end
banksel pclath_temp
movf pclath_temp,w ; retieve copy of PCLATH register
movwf PCLATH
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;=======================================
;Code wriiten for test purpose
MAIN
banksel TRISA ;select respective bank
movlw b'00000100' ;RA2-input, RA3-output
movwf TRISA
clrf TRISB
movlw b'10001000' ;TMR0 in timer mode
movwf OPTION_REG
clrf STATUS ;make sure in bank 0
call USART_INIT
movlw TMR0CONST
movwf TMR0
movlw 0xff
movwf PORTB
bsf INTCON,T0IE
bsf INTCON,GIE
LOOP ;test code
skp1 RXBF ;wait for data received
goto $-1
bcf RXBF ;clear data flag
movf RX_BUFF,w
movwf TX_BUFF ;send back received data
bsf TXEN
skp0 TXEN ;wait for transmit completion
goto $-1
goto LOOP ;
;=======================================
;Initializtion of software USART
USART_INIT
clrf USART_F ;clear all flag bit
clrf RX_STA ;reset STATE MACHINE
clrf TX_STA
bsf TX_PIN ;TX is in Idle
return
END ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -