📄 serial.asm
字号:
list p=16f690
#include p16f690.inc
#include<t2.inc>
#define sed_cnt rcv_cnt
#define rcv_temp1 del_temp1
#define rcv_temp2 del_temp2
send macro address
movfw address
movwf TXREG
nop
nop
nop
nop
nop
nop
btfss PIR1,TXIF
goto $-1
endm
CODE
;serial----------------------------------------------------------------------
serial
clrf rcv_cnt
BANKSEL 0x00
btfss PIR1,RCIF
retlw 0 ;RCIF!=1
;RCIF==1
movlw rcv_buf
movwf FSR
rcv_lp1 ;主循环
movfw RCREG
movwf INDF ;RCREG-->corrent rcv_buf
incf FSR
incf rcv_cnt
movfw rcv_cnt
sublw 0x0a
btfss STATUS,C ;rcv_cnt<=10
goto rcv_nt2 ;rcv_cnt>10,不再接收
rcv_nt1 ;rcv_cnt<=10
movlw 0x30
movwf rcv_temp1
clrf rcv_temp2
rcv_dl ;计时接收数据
btfsc PIR1,RCIF
goto rcv_lp1 ;receive a byte
nop
nop
nop
decfsz rcv_temp2
goto rcv_dl
decfsz rcv_temp1
goto rcv_dl
rcv_nt2 ;地址判断
movlw rcv_buf
movwf FSR
movfw INDF
movwf rcv_temp1 ;address-->rcv_temp1
btfsc STATUS,Z
goto rcv_nt3 ;address=0
subwf OwnAddress,0
btfss STATUS,Z ;address==OwnAddress
retlw 0
check ;检查校验和
movfw INDF ;order-->W
movwf rcv_temp2 ;order-->rcv_temp2
addwf rcv_temp1,1 ;order+address-->rcv_temp1
incf FSR
movfw INDF
movwf rcv_temp3 ;data-->rcv_temp3
addwf rcv_temp1,1 ;data+rcv_temp1=data+order+address-->rcv_temp1
incf FSR
movfw INDF ;checksum-->W
subwf rcv_temp1,0
btfss STATUS,Z
retlw 0 ;checksum error
rcv_nt3 ;check OK,命令判断
movf rcv_temp2,0 ;order-->W
andlw 0x07 ;last 3 bits are orderbits
movwf rcv_temp1 ;orderbits -->rcv_temp1
btfsc STATUS,Z
goto send_all ;后3位==000b, send all data to PC
movfw rcv_temp1
sublw 0x04
btfsc STATUS,Z
goto send_one ;后3位==100b, send one data to PC
movf rcv_temp1,0
sublw 0x02
btfsc STATUS,Z
goto write_one ;后3位==010b, write one data from PC to MCU
return
send_all ;send all data to PC
send OwnAddress ;send ballast address
movf OwnAddress
movwf rcv_temp1 ;address-->rcv_temp1
movlw buffer
movwf FSR ;buffer's top-->FSR
movlw 0x12
movwf sed_cnt ;sed_cnt=0x12
sendlp
send INDF ;send data in corrent buffer
movf INDF,0 ;data-->W
addwf rcv_temp1,1 ;data+rcv_temp1-->rcv_temp1
incf FSR ;point to next data
decfsz sed_cnt
goto sendlp ;send data untill sed_cnt==0
send rcv_temp1 ;send checksum
return
send_one ;send one data to PC, order in rcv_temp2
send OwnAddress ;send ballast address
movf OwnAddress,0
movwf rcv_temp1 ;address-->rcv_temp1
movf rcv_temp2,0 ;order-->W
andlw 0xf8 ;first 5 bits are Membits
movwf rcv_temp2 ;Membits-->rcv_temp2
bcf STATUS,C
rrf rcv_temp2
bcf STATUS,C
rrf rcv_temp2
bcf STATUS,C
rrf rcv_temp2 ;rcv_temp2=memory offset address
movf rcv_temp2,0
addlw buffer
movwf FSR ;FSR=memory Eaddress
send INDF ;send the asked data
movf INDF,0 ;data-->W
addwf rcv_temp1,1 ;data+address-->rcv_temp1
send rcv_temp1 ;send checksum
return
write_one ;write one data to MCU, 8bits data in rcv_temp3, order in rcv_temp2
movf rcv_temp2,0 ;order-->W
andlw 0xf8 ;first 5 bits are Membits
movwf rcv_temp2 ;Membits-->rcv_temp2
bcf STATUS,C
rrf rcv_temp2
bcf STATUS,C
rrf rcv_temp2
bcf STATUS,C
rrf rcv_temp2 ;rcv_temp2=memory offset address
movf rcv_temp2,0
addlw buffer
movwf FSR ;FSR=memory Eaddress
movf rcv_temp3,0
movwf INDF ;data-->memory
return
;serial end----------------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -