⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.asm

📁 用PIC16F690单片机实现终端采样、检测和与PC通讯
💻 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 + -