📄 usartv201.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 + -