📄 p190v30.inc
字号:
;***********************************************************
;程序名称: 打印子程序
;程序开发: 前锋集团技术中心 江海波
;编写时间: 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 + -