📄 uart.asm
字号:
.ifnz UART_SUPPORT
sta rIntFlag
bbr INT_TIMER_A_bit,rIntFlag,lGoCheckTimerB
;;**************************
;;Run UART service start
;;**************************
;;rUartCnt 0 , 1 , 2 , 0 , 1 , 2 , ....
;; idle recv tran idle recv tran
bbr 0,rUartTranCnt,lUartSendEnd
bbr 1,rUartTranCnt,lUartSendEnd
lda rUartSendLen
beq lUartSendEnd
lUartSendBit:
ror rTxdRegister+1
ror rTxdRegister
bcc lUartSendLow
;;STB=1
smb UART_TXD_bit,UART_PORT
bra lUartSendOk
lUartSendLow:
;;STB=0
rmb UART_TXD_bit,UART_PORT
lUartSendOk:
dec rUartSendLen ;;decrease len
stz rUartTranCnt
lUartSendEnd:
inc rUartTranCnt
.if 1
;;check receiver flage
bbs 7,rUartRecvFlag,lAreadyGetStart
;;check the pin=high -> exit
bbs UART_RXD_bit,UART_PORT,lUartFunExit
lda #9 ;;find 0 -> start
sta rUartRecvLen
;;receiver delay count = 0
stz rUartRecvCnt
;;start bit detect
smb 7,rUartRecvFlag
bra lUartFunExit
lAreadyGetStart:
bbr 0,rUartRecvCnt,lUartSkipRecv
bbr 1,rUartRecvCnt,lUartSkipRecv
;;clear counter
stz rUartRecvCnt
lUartRecvBit:
bbr UART_RXD_bit,UART_PORT,lUartRecvLow
;;B=1
sec
bra lUartRecvOk
lUartRecvLow:
;;B=0
clc
lUartRecvOk:
ror rRxdRegister+1
ror rRxdRegister
;;check the length
dec rUartRecvLen
bne lUartSkipRecv
rmb 7,rUartRecvFlag
;;keep data
ldx RxdPointW
;;remove stop bit
rol rRxdRegister
lda rRxdRegister+1
rol a
sta RxdBuffer,x
inx
cpx RxdPointR ;; if write point+1 == read point
;; keep the point
;; last receiver data will be overwrite
;; when the buffer overflow
beq lUartFunExit
stx RxdPointW
lUartSkipRecv:
inc rUartRecvCnt
lUartFunExit:
.endif
;;**************************
;;Run UART service end
;;**************************
lGoCheckTimerB:
bbs INT_TIMER_B_bit,rIntFlag,lGoRunTimerB
jmp lIrqExit
lGoRunTimerB:
.endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -