微型打印机具有体积小、价格低、打印方式灵活,可与主机装配为一体等特点,特别适合于工业控制、智能仪器仪表等小型单片机系统。但微型打印机一般不能直接打印汉字,或只提供“甲乙丙丁……”等少量简易汉字,远不能满足通常的汉字打印要求。笔者根据应用实践,介绍GP16微型打印机用图形方式实现汉字打印的方法。GP16是目前国内广泛使用的一种微型打印机,采用日本MODEL 150-Ⅱ型点阵式4针打印机心。采用8039(GP16-Ⅱ采用8031)单片机控制,可接受和执行用户系统主机的命令完成打印。
一、确定打印方式
GP16有4种打印方式:空走纸、字符串打印、数据打印和图形打印。在字符串打印方式下,GP16本身可提供96个ASCII码西文字符和26个非ASCII码的5×7点阵简易汉字。数据打印方式则只能打印16进制的数据。图形打印由用户定义要打印的图形。用户可以根据系统的要求设计出所需的汉字,采用该方式实现汉字打印。
二、设计汉字字模
微型打印机的汉字字模,主要是根据应用系统的需要设计的。不仅汉字数量较少(一般为几十至几百个汉字),字形结构也力求简单,这与一般微机使用的汉字字模有很大区别。笔者采用的是8×8点阵的汉字结构。
这种8×8点阵字模,是以列为序按二进制码纵向排列的,与一般微机汉字字模的横向排列点阵信息不同。横向排列的点阵信息便于从CRT显示器上显示,但针式打印机是按纵向接受信息打印的。所以横向排列的点阵信息在打印前必须先转换成纵向排列的点阵信息,才能传送给打印机。采用纵向点阵建立字模,可不经转换直接将字模信息送给打印机,有利于简化系统的软件设计。
以坦克的“坦”字为例,其字模的编码可设计为84、7F、A4、9F、95、95、95、9F(十六进制)共8个字节。各字节从左至右排列,其二进制码从上至下为0~7位,“1”为打印点,以“×”表示,“0”为空点,不打印,字形结构如图所示。

对于个别笔划较多的复杂字形,可依视读效果作合理简化。从实际打印效果看,这种结构的汉字可满足一般系统的要求。
三、打印汉字
举个简单的例子,说明GP16打印机服务于8031单片机用户系统时,如何打印一行汉字。
设20H~6FH为输出缓冲区(8031片内RAM数据存储器),在其中依次存放有一行十个汉字的打印字模信息。
打印程序清单如下:
PRINT:MOV DPTR,#7FFFH
LP0:MOVX A,@DPTR;读GP16状态
ANL A,#81H
JNZ LP0;GP16忙否?
LP1:MOV A, #0B8H
MOVX@DPTR,A ;送图形打印命令
NOP
LP2:MOVX A,@ DPTR ;读GP16状态
JB ACC,7,LP1 ;命令出错否?
JB ACC,7,LP2 ;GP16忙否?
MOV A, # 01H
MOVX@ DPTR,A ;送打印行数
MOV R0, # 20H ;字模首址
MOV R1, # 08 ;单字字节数
MOV R2, # 90 ;行信息长度
LP4:MOVX A, @ DPTR
JB ACC,0,LP4 ;GP16忙否?
MOV A,@R0
MOVX@ DPTR,A ;送字模信息码
INC R0 ;信息地址+1
DJNZ R1,LP4 ;1个汉字打完否?
MOV R1,#8
MOV A, #0
MOVX@DPTR,A ;打印1列空格
DJNZ R2,LP4 ;1行信息打印完否?
END ;(程序段结束)
程序执行后,可打印一行十个汉字,每个字之间有一列空点间隔。
四、建立字库
一般把汉字信息存放在系统的EPROM中,打印时以查表方式取得汉字信息码直接输出,不再经过RAM缓冲区。
若打印内容是固定的,只需要将汉字按打印顺序存放在字库中,打印时依次取出即可。但实际的打印内容往往是变化的,有的字需多次重复使用。一种解决的途径是采用间接查表方式。除基本字库外,建立一个地址表格,将汉字在基本字库中的首地址按打印顺序逐行排列在地址表格中。程序运行中需打印某行时,先由程序控制转向地址表格中该行的地位,从表格中取出存放的汉字首地址,据此地址再从基本字库中查出相应的汉字信息码输出打印。地址表格中只存放汉字的首地址,所以该表格占用的存储单元不多。这种间接查表方式,可灵活地打印各种需要的内容。
五、中、西文综合打印
需要同时打印中文和数字(西文)的系统,为了避免频繁地转换GP16的打印方式,可不使用GP16的字符串打印方式打印数字,而统一使用图形打印方式打印中、西文。这时应将所需的西文信息字模设计好并与汉字一起存放在基本字库中。
六、本汉字打印方式的特点
1. 字库容量合理
每个汉字占用8个字节,如使用100个汉字,所建立的字库为800字节。字库容量规模不大,可以被单片机系统所接受。
2. 便于按行打印
GP16在图形方式下按字节接受打印数据,接收的每个字节8个点纵向排列,接收96个字节后正好为一行信息。即GP16一行正好打印8×96点阵。8×8点阵汉字不仅便于按字节向GP16传递数据,而且每打印一行正好是一行完整汉字,这对于简化打印程序非常有利。 (史建军)