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

📄 usartv201.inc

📁 本程序为某企业的税控机固件程序.基于东芝TMP93CS41 16位单片机编写,符合国家标准.该程序已经经过多次长期调试.
💻 INC
字号:
;**********************************************************
;程序名称:	串口子程序
;程序开发:	前锋集团技术中心 江海波
;编写时间:	2004年12月24日
;软件环境:	QF561型税控器的上层C语言使用
;硬件环境:	税控器QF561硬件版本V1.0
;MCU:		TOSHIBA TMP93CS41@max 16M/1
;程序版本:	V2.01
;最后修订时间:	2004年12月24日
;修订部分说明:	完成了程序模块化,功能有所完善,能适应修正后的
;		国家标准,并可以适用串口接口的条码扫描枪
;		2.01在2.00的基础上对CS的接收做了优化
;----------------------------------------------------------
;汇编词典:
;串口接收时间保护计数器为"wa",当其计数自减到0,将导致本程序跳出
;并将串口状态标志seri_flag写为0xF0,当本数据包被完全正确接收,
;该标志将被写为0xF5

;__seri_send_c:	串口向外部发送一个数据包,查询方式
;__seri_rec_c:	调用本函数将启动一个数据包的接收过程,查询方式
;__seri_ok:	由底层直接给出"OK"应答的整个数据包
;---------------------------------------------------------

;定义伪指令,当软,硬件结构改变时修改本位置上的指令即可完成程序修改

;上层C语言与底层汇编之间采用一个缓冲区来传递数据,这个缓冲区被定义在
seri_buff_c	equ	0x350
;上层C语言与底层汇编之间采用一个缓冲区来传递扫描枪数据,这个缓冲区在
seri_buff_s	equ	0x350
;---------------------------------------------------------
;串口0或者1将作为数据通信口用,其中断控制器为
intesc		equ	INTES1		;---INTES* used for Communicat
intess		equ	INTES0		;---INTES* used for Scaner 在税控器中作为预留串口保留.
;---------------------------------------------------------
;串口0或者1将作为数据通信口用,其数据缓冲器为
scbufc		equ	SC1BUF		;---SC*BUF used for Communicat
scbufs		equ	SC0BUF		;---SC*BUF used for Scaner 在税控器中作为预留串口保留.

;为了方便程序调试和硬件Debug模式下的调试工作,程序安排了一个错误标志
;这个标志被定义在地址
seri_flag	equ	0x144
;错误码定义为:
;		"FF"本次中断没有收到任何数据
;		"F0"收到部分数据,后续数据有错误
;		"F5"收到的数据包正确
;---------------------------------------------------------

;*****************串口数据操作程序 by JHBCD***************
PUBLIC	__seri_send_c
PUBLIC	__seri_rec_c
;PUBLIC	__seri_rec_s
PUBLIC	__seri_ok
;****************从串口接收一包数据************************
rec_np:						;---RECeive "NP"
;	ld	b,c				;在不需要判断是否为其他数值的时候,可以直接用C寄存器来操作
	xor	c,0x4E				;0x4E="N"
	jp	z,rec_p
	jp	__seri_rec_c			;如果收到的数据既不是命令,也不是"NP"就再收一次

rec_p:						;---RECeive "P"
	ld	wa,0xFFFF			;作为时间保护计数器

r_wait_p:					;---Receive WAIT for "NP"
	ldcf	3,(intesc)
	jp	c,r_p				;等待接收完成中断标志被设置为"1"
	djnz	wa,r_wait_p
	jp	seri_err			;超时跳出

r_p:
	ld	b,(scbufc)
	ld	(xhl+),b			;收到的数据送缓冲区
	xor	b,0x50				;0x50="P"
	jp	nz,seri_err			;察看收到的数是否"P"

	ld	c,0x05
rec_np_oth:					;---RECeive NP OTHer datas
	ld	wa,0xFFFF			;作为时间保护计数器

r_wait_np_oth:					;---Receive Wait for NP OTHer datas
	ldcf	3,(intesc)
	jp	c,r_np_oth			;等待接收完成中断标志被设置为"1"
	djnz	wa,r_wait_np_oth
	jp	seri_err			;超时跳出

r_np_oth:
	ld	b,(scbufc)
	ld	(xhl+),b			;收到的数据送缓冲区
	djnz	c,rec_np_oth

	jp	r_c_fini			;转去接收完成

;----------------------------------------------------------

__seri_rec_c:					;---SERIal RECeive for Communicat
	ld	xhl,seri_buff_c			;指针初始化
	ld	(seri_flag),0xFF

rec_data1_c:					;---RECeive DATA1 for Communicat
	ld	wa,0xFFFF			;作为时间保护计数器

r_wait_data1_c:					;---Receive WAIT DATA1 for Communicat
	ldcf	3,(intesc)
	jp	c,r_data1_c			;等待接收完成中断标志被设置为"1"
	djnz	wa,r_wait_data1_c
	jp	seri_err			;超时跳出

r_data1_c:
	ld	b,(scbufc)
	ld	(xhl+),b			;收到的数据送缓冲区
	ld	c,b				;暂存收到的数据
	xor	b,0x1B				;察看收到的数是否1B(H)
	jp	nz,rec_np			;察看收到的数据是否是"NP"

rec_data2_c:					;---RECeive DATA2 for Communicat
	ld	wa,0xFFFF			;作为时间保护计数器

r_wait_data2_c:					;---Receive WAIT DATA2 for Communicat
	ldcf	3,(intesc)
	jp	c,r_data2_c			;等待接收完成中断标志被设置为"1"
	djnz	wa,r_wait_data2_c
	jp	seri_err			;超时跳出

r_data2_c:
	ld	b,(scbufc)
	ld	(xhl+),b			;收到的数据送缓冲区
	xor	b,0x10				;察看收到的数是否10(H)
	jp	nz,seri_err

	ld	c,3				;计数器,用于计数收取第3,4,5个数据
rec_data345_c:					;---Receive DATA3/4/5 for Communicat
	ld	wa,0xFFFF			;作为时间保护计数器

r_wait_data345_c:				;---Receive WAIT DATA2 for Communicat
	ldcf	3,(intesc)
	jp	c,r_data345_c			;等待接收完成中断标志被设置为"1"
	djnz	wa,r_wait_data345_c
	jp	seri_err			;超时跳出

r_data345_c:
	ld	b,(scbufc)
	ld	(xhl+),b			;收到的数据送缓冲区
	djnz	c,rec_data345_c

	ld	c,b
	dec	3,c				;计算数据长度的循环计数器,即本数据包的长度,
						;由于命令长度不包括CS的两个字节,这里计算长
						;的时候增加了2个字节的长度
	cp	b,5
	jp	c,seri_err			;长度不足5个字节,直接跳出

rec_datan_c:					;---Receive DATAN for Communicat
	ld	wa,0xFFFF			;作为时间保护计数器

r_wait_datan_c:
	ldcf	3,(intesc)
	jp	c,r_datan_c			;等待接收完成中断标志被设置为"1"
	djnz	wa,r_wait_datan_c
	jp	seri_err

r_datan_c:
	ld	b,(scbufc)
	ld	(xhl+),b			;收到的数据送缓冲区
	djnz	c,rec_datan_c

r_c_fini:					;Receive for Communicate FINIsh

	ld	(seri_flag),0xF5		;数据全部正确接收,返回标志F5(H)
	ret

;*****************从串口发送一包数据***********************
s_cmd:						;发送命令
	ld	c,(seri_buff_c+4)			;取到本数据包的长度
	inc	2,c				;由于包的长度不包括CS的长度!!!!
	jr	s_data_c

__seri_send_c:					;---SERIal SEND for Communicat

	ld	xhl,seri_buff_c			;指针初始化
	ld	c,(seri_buff_c+3)		;取到本数据包的长度
	inc	2,c				;由于包的长度不包括CS的长度

s_data_c:					;---Send DATA for Communicat
	ld	b,(xhl+)
	ld	(scbufc),b

s_data_wait_c:					;---Send DATA WAIT for Communicat
	ldcf	7,(intesc)
	jp	nc,s_data_wait_c
	ld	(intesc),0x04			;清除发送中断标志
	djnz	c,s_data_c

	ret

;***********************串口发送"OK"***********************
__seri_ok:
	ld	xhl,seri_buff_c			;指针初始化
	ld	(xhl+),0x4F			;"O"
	ld	(xhl+),0x4B			;"K"
	ld	(xhl+),0x00
	ld	(xhl+),0x04
	ld	(xhl+),0xC9			;CRC-16,16,15,2,0
	ld	(xhl),0x9A
	jr	__seri_send_c

;********************扫描枪接收****************************

;__seri_rec_s:
;	ld	(seri_flag),0xFF
;	ld	c,14
;	ld	xhl,seri_buff_s			;指针初始化
;
;rec_data_s:
;	ld	wa,0xFFFF
;
;r_wait_s:
;	ldcf	3,(intess)
;	jp	c,r_data_s
;	djnz	wa,r_wait_s
;	jp	seri_err			;超时跳出
;
;r_data_s:
;	ld	b,(scbufs)
;	ld	(xhl+),b
;	djnz	c,rec_data_s
;
;	jp	r_c_fini

;******************串口接收出错处理************************
seri_err:
	ld	(seri_flag),0xF0
	ret
;**********************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -