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

📄 p190v30.inc

📁 本程序为M190微型打印机的程序,采用C语言和汇编混合编写,已经经过调试并在应用中
💻 INC
📖 第 1 页 / 共 2 页
字号:
;***********************************************************
;程序名称:		打印子程序
;程序开发:		前锋集团技术中心 江海波
;编写时间:		2004年3月24日
;软件环境:		供税控收款机QF560型的上层C语言使用
;硬件环境:		EPSON M190G 8针梭式击打式打印机
;MCU:			TOSHIBA TMP93CS41@max 16M/1
;程序版本:		V3.00
;最后修订时间:		2005年5月25日
;修订部分说明:
;
;V3.0:			用于打印12x12点中文点阵和6x8西文点阵字库,从P192v327更改而来
;**********************************************************

;--------------------主要技术参数--------------------------

;点阵大小:西文6*8点,中文11*11点.打印状态:在每个中文后自动插入一个空列
;在每两个字符行之间自动插入一个空行
;每个字符行可以打印40个西文字符或者20个中文字符,支持中/西文混合打印
;查表程序查一行中文需要3.2ms时间,查一行西文需要3.2ms时间

;--------------------全局函数声明---------------------------

PUBLIC	__printrow			;---打印函数,供C语言使用
PUBLIC	__feedpaper			;---快速进纸函数,供C语言使用
PUBLIC  __print_test			;---打印机自检函数,供C语言使用
PUBLIC  __normalfeed			;---普通速度进纸函数

;**********************************************************

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

;----------------------------------------------------------
;下层汇编语言与上层C语言之间通过一个名叫"code"的缓冲区传递要打印的数据信息
;这个缓冲区被定义在地址:
code		equ	0x100
;该区的长度为31字节,在代码段区,存放要打印的一行文字,中文为GBK码,西文为ASCII码
;----------------------------------------------------------
;打印程序需要一个名叫"pszdot"缓冲区,存放查表得到的点的信息
;这个缓冲区被定义在地址:
pszdot		equ	0x420
;该区的长度为30字节
;----------------------------------------------------------
;打印程序需要一个名叫"count_tab"的标志位作为计数器,计30个打印位置
;这个标志位被定义在地址:
count_tab	equ	0x140
;----------------------------------------------------------
;打印程序需要一个名叫"dotline"的标志位,指示当前打印的行号
;这个标志位被定义在地址:
dotline		equ	0x141
;----------------------------------------------------------
;打印程序需要一个名叫"p_flag"的标志位,在取点时指示取点的BIT位
;这个标志被定义在地址:
p_flag		equ	0x142
;----------------------------------------------------------
;打印程序需要一个名叫"line_count"的标志寄存器,来计数一个汉字的11个横行,以控制打印
;这个标志被定义在地址:
line_count	equ	0x143
;----------------------------------------------------------
;为了方便程序调试和硬件Debug模式下的调试工作,程序安排了一个错误标志
;这个标志被定义在地址:
p_error_flag	equ	0x144
;----------------------------------------------------------
;本打印机所使用的字库为中文11x11点,西文8x6点字库
;这个字库被放置在地址:
zikuadr 	equ	0x1FD00
;----------------------------------------------------------
;为了加强程序的健壮性,我们在DOT区的最后一个字节自动填写一个"0"
;这个地方同时也被用来作为假查表算法中'0'的来源
max_lenth	equ	24
;----------------------------------------------------------
;打印机的驱动针被安排在端口print_port
;打印机的A针在print_port口的高位
print_port	equ	PA		;---PRINTER solenoid control PORT
;----------------------------------------------------------
;打印机的电源开启控制被放置在端口p_pc_port,BIT p_pc_bit
p_pc_port	equ	P9		;---Printer Power Control PORT
p_pc_bit	equ	7		;---Printer Power Control BIT
;----------------------------------------------------------
;打印机的快速进纸控制被放置在端口p_fp_port,BIT p_fp_bit
p_fp_port	equ	P9		;---Printer Fast Paper feed PORT
p_fp_bit	equ	6		;---Printer Fast Paper feed BIT
;----------------------------------------------------------
;打印机反馈回的R信号被放置在端口p_rs,BIT p_rs_bit
p_rs_port	equ	P9		;---Printer Reset Signal port
p_rs_bit	equ	5		;---Printer Reser Signal BIT
;----------------------------------------------------------
;打印机反馈回的T信号被放置在端口p_ts,BIT p_ts_bit
p_ts_port	equ	P9		;---Printer Timing Signal port
p_ts_bit	equ	2		;---Printer Timing Signal BIT
;----------------------------------------------------------
;为了保证打印质量,我们在每两行汉字之间插入一个可调整的间隙,现在这个间隙为
space_line	equ	1		;---space between two characters
;----------------------------------------------------------
;为了保证程序不发生冲突,我们在每次调用打印函数时,对端口做了重新初始化,这个
;初始化需要进行端口定义:

;(1)打印机的驱动针被安排在端口print_port的方向字为
p_p_dir		equ	PACR		;---Printer solenoid Port DIRection register

;(2)打印机的信号口线功能字为
p_s_fc		equ	P9FC		;---Printer Signal port FunCtion register

;其数值应为
p_s_fc_v	equ	0x09		;---Printer Signal port FunCtion register Value

;(3)打印机的信号口线方向字为
p_s_dir		equ	P9CR		;---Printer Signal port DIRection register

;其数值应为
p_s_dir_v	equ	0xC9		;---Printer Signal port DIRection register Value

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

;********************R信号检测函数*************************
;函数说明:本函数检测口线上出现的"R"信号,自带超时保护程序,
;并用p_error_flag将信号情况反馈给调用的函数.
;调用本函数后,应立即检测p_error_flag,判断其是否等于0x10
;若等于,则表明信号检测发生错误.

rs_dect:
	ld	iy,0xFFFF

rs_wait0:				;等待RS信号为'0'
	ldcf	p_rs_bit,(p_rs_port)	;采样RS信号口线
	jr	nc,rs_wait1		;采样到'0'电平信号,去等待'1'电平信号
	djnz	iy,rs_wait0		;信号没有检测到,循环采样口线,直到超时跳出
	ld	(p_error_flag),0x10	;打印程序出错声明--10--不能检测到"R"信号
	ret

rs_wait1:				;等待RS信号为'1'
	ld	iy,0xFFFF

rs_w_1_l:
	ldcf	p_rs_bit,(p_rs_port)	;采样RS信号口线
	jr	c,rs_ns			;采样到'1'电平信号,去做延迟抗噪声处理
	djnz	iy,rs_w_1_l		;信号没有检测到,循环采样口线,直到超时跳出
	ld	(p_error_flag),0x10	;打印程序出错声明--10--不能检测到"R"信号
	ret

rs_ns:					;抗噪声后,等待核实RS信号是否为'1'
	ld	b,0x05

rs_ns_l:				;抗噪声,时间为15uS
	nop
	nop
	nop				;6T延迟核
	djnz	b,rs_ns_l		;6T

rs_wait11:
	ld	iy,0xFFFF

rs_wait_11_l:
	ldcf	p_rs_bit,(p_rs_port)	;采样RS信号口线
	jr	c,rs_dect_fini		;确认采样到了'R'信号,返回
	djnz	iy,rs_wait_11_l		;信号没有检测到,循环采样口线,直到超时跳出
	ld	(p_error_flag),0x10	;打印程序出错声明--10--不能检测到"R"信号
	ret

rs_dect_fini:
	ret				;确认检测到了'R'信号,返回

;********************T信号检测函数*************************
;函数说明:本函数检测口线上出现的"T"信号,
;自带超时保护程序,并用p_error_flag将信号情况反馈给调用的函数.
;调用本函数后,应立即检测p_error_flag,判断其是否等于0x20
;若等于,则表明信号检测发生错误.

ts_dect:
	ld	iy,0xFFF0		;0x00FF发生漏打1行的情况T信号超时保护计数器---待观察

ts_wait0:				;等待TS信号为'0'
	ldcf	p_ts_bit,(p_ts_port)	;采样TS信号口线
	jr	nc,ts_wait1		;采样到'0'电平信号,去等待'1'电平信号
	djnz	iy,ts_wait0		;信号没有检测到,循环采样口线,直到超时跳出
	ld	(p_error_flag),0x20	;打印程序出错声明--20--不能检测到"T"信号
	ret

ts_wait1:				;等待TS信号为'1'
	ld	iy,0xFFF0		;0x00FF发生漏打1行的情况T信号超时保护计数器---待观察

ts_wait1_l:
	ldcf	p_ts_bit,(p_ts_port)	;采样TS信号口线
	jr	c,ts_ns			;采样到'1'电平信号,去做延迟抗噪声处理
	djnz	iy,ts_wait1_l		;信号没有检测到,循环采样口线,直到超时跳出
	ld	(p_error_flag),0x20	;打印程序出错声明--20--不能检测到"T"信号
	ret

ts_ns:					;抗噪声后,等待核实TS信号是否为'1'
	ld	b,0x05

ts_ns_l:				;抗噪声,时间为15uS
	nop
	nop
	nop				;6T延迟核
	djnz	b,ts_ns_l		;6T

ts_wait11:
	ld	iy,0xFFF0		;0x00FF发生漏打1行的情况T信号超时保护计数器---待观察

ts_wait11_l:
	ldcf	p_ts_bit,(p_ts_port)	;采样TS信号口线
	jr	c,ts_dect_fini		;确认采样到了'T'信号,返回
	djnz	iy,ts_wait11_l		;信号没有检测到,循环采样口线,直到超时跳出
	ld	(p_error_flag),0x20	;打印程序出错声明--20--不能检测到"T"信号
	ret

ts_dect_fini:
	ret				;确认检测到了'T'信号,返回

;**********************点阵查表函数************************
;****本函数由打印函数调用,用于查出要打印的下一行240个点****

;-------------------字库查表通用函数-----------------------

p_search:				;---Print SEARCH table
	ld	a,d			;装载字模位指针
	ldcf	a,(xbc)			;取点
	ld	a,(p_flag)		;装载点阵缓冲区位指针
	stcf	a,(xiy)			;送到点阵缓冲区
	inc	1,xiy			;点阵缓冲区指针移动一个字节(如果需要换针,此语句等于没有生效)
	dec	1,(count_tab)		;取点计数器减1
	jr	nz,p_s_next		;不为0,不用换针,直接取下一个点

p_next_s:				;---Print NEXT Solenoid
	dec	1,(p_flag)		;移动点阵缓冲区位指针
	ld	xiy,pszdot		;重新初始化取点缓冲区指针
	ld	(count_tab),18		;重新初始化取点计数器

p_s_next:				;---Print Search table NEXT
	inc	1,xbc			;表字节指针自增
	djnz	w,p_search		;本次取点任务是否完成
	ret

;----------------------点阵查表函数------------------------
;----本函数由打印函数调用,用于查出要打印的下一行240个点----

searchtab:
	ld	(count_tab),18		;计数器,计18个打印位置
	ld	(p_flag),7		;从pszdot每个字节的高位开始放数据
	ld	xiy,pszdot		;装载点缓冲区首地址
	ld	xix,code		;装载要打印的字符的代码的首地址

get_code:
	ld	w,(xix)
	cp	w,0x00			;最后一个字符是"0",代表数组的结束
	jr	nz,language		;非0,去判断中/西文
   	ret				;为0,返回

;----------------------判断中/西文-------------------------

language:
   	ld	w,(xix)			;没取完,继续取下一个区位码
	and	w,0x80
	jp	nz,chinese

;-----------------------西文查表---------------------------

english:
	ld	xbc,0
	ld	c,(xix)
	sub	xbc,32
	mul	xbc,6
	add	xbc,zikuadr		;查到的起始位置放入XBC寄存器

	cp	(dotline),4		;比较dotline是否超过第3行
	jr	nc,eng_lin_4_11		;去西文后8行查表
eng_lin_1_3:				;西文前3行查表函数
	ld	w,6			;循环计数器

eng_lin_1_3_l:
	ld	a,(p_flag)
	ldcf	0,(code+max_lenth)
	stcf	a,(xiy)
	inc	1,xiy
	dec	1,(count_tab)		;取点计数器减1
	jr	nz,eng_lin_1_3_n

eng_p_change:
	ld	xiy,pszdot
	ld	(count_tab),18
	dec	1,(p_flag)

eng_lin_1_3_n:
	djnz	w,eng_lin_1_3_l
	inc	1,xix			;移动code区指针
	jr	get_code		;取下一个字

eng_lin_4_11:
	ld	d,11
	sub	d,(dotline)		;取第(11-dotline)位上的点
	ld	w,6			;循环6次
	calr	p_search		;调用查表函数

	inc	1,xix			;移动code区指针
	jr	get_code		;取下一个字

;*****************中文点阵查表 by JHBCD********************

chinese:

⌨️ 快捷键说明

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