📄 print.c
字号:
#include<reg52.h>
#include"print.h"
#include<absacc.h>
#include"Type.h"
#include<intrins.h>
#include <string.h>
#include<stdio.h>
#define PRINTER XBYTE [0x40ff] //打印数据地址 0 1
sbit ResetDecetor=P3^5; //复位信号,表示干簧管会到初始位置
sbit TimingDector=P3^4; //时种型号,由11和10的同步信号输出经处理后变为方波
#define HEAD 4 //打印头4个
#define LET_PER_HEAD 4 //每个打印头可以打印4个字符
#define VOL_PER_LET 6 //每个字符有6个点列(10*6)一列时空列
#define LINE 10 //每个字符要打印10个点行(3行是空行)
uchar LetBuf[HEAD][LET_PER_HEAD];//文本缓冲区,把要打印的字符序列写在这里
uchar PrtBuf[HEAD][LET_PER_HEAD] ;//打印缓冲区
extern uchar idata Temp[16];//十六个打印字符
//延时
void delay(uchar s)
{
while(s)s--;
}
//函数申明
/******************************************
名称: InitPrinter
描述: 初始化打印机
********************************************/
void InitPrinter()
{
PRINTER = 0x00; //关闭打印机驱动马达
delay(10);
PRINTER = 0x00;
}
/******************************************
名称: StartFeed
描述: 走纸之前必须调用它做初始化的工作
它和StartPrint的区别是:它不关闭中断
********************************************/
void StartFeed()
{
PRINTER = 0x10;
delay(0xc8*0x64); //等待继电器工作
PRINTER = 0x10; //打开驱动马达
}
/******************************************
名称: StopFeed
描述: 调用本函数停止走纸
********************************************/
void StopFeed()
{
PRINTER = 0x00; //关闭驱动马达
delay(10);
PRINTER = 0x00; //再次关闭驱动马达
}
/******************************************
名称: StartPrint
描述: 开始打印之前必须调用的函数
它做一些初始化的工作。同时在
打印结束,必须调用StopPrint函数
做一些清理工作
********************************************/
void StartPrint()
{
EA=0; //关闭所有中断
StartFeed(); //打开打印机电源和开动驱动马达
}
/******************************************
名称: StopPrint
描述: 在打印结束,必须调用StopPrint函数
做一些清理工作
********************************************/
void StopPrint()
{
StopFeed(); //关闭打印机电源和走纸马达
EA=1; //重新打开中断
}
/******************************************
名称: BuildPrtBuf
描述: 对于一排文字(16个字符)是分成10个点行输出的
其中8行是字符必需的,另外2行是空白。
由于数据空间的限制,这里用16个字节来缓冲
一个点行的打印数据。每个字符用一个字节。
实际上由于字符是6X8字库,所以只使用每个字节
的前6位。这个函数就是构造一个点行数据,放在
打印缓冲区中。
参数: line 点行的第几行
********************************************/
void BuildPrtBuf(uchar line)
{
uchar head, let;
uchar t1;
for (head=0; head<HEAD; head++)
{
for (let=0; let<LET_PER_HEAD; let++)
{
t1 = LetBuf[head][let] ;//取得该字符在ASCTable中的位置
PrtBuf[head][let] =TypeChar[t1][line];//存放该字符的打印矩阵第line行的数据
}
}
}
/******************************************
名称: BuildPrtBuf
描述: 打印一个文字行,分LINE个点行打印
每打印完一个点行需要马上计算下一个
点行
********************************************/
void PrintLetLine()
{
uchar head, vol, line, let;
uchar t;
PRINTER = 0x10;
for (line = 0; line < LINE; line++)
{
BuildPrtBuf(line);
while (ResetDecetor) ;//等待干黄管就位
for (let = 0; let < LET_PER_HEAD; let++)
{
for (vol = 0; vol < VOL_PER_LET; vol++)
{
for (head = 0; head < HEAD; head++)
{
//先把要送到打印端口的内容计算好,因为这里对时间比较敏感
if(PrtBuf[head][let]&(0x01<<vol)){t = 0x10 |(0x08>>head);}//
else{t = 0x10;}
// if(vol == 5){t = 0x10;}//第六针空
//等待针头就位
if (head % 2) while (!TimingDector);//上升沿
else while (TimingDector); //下降沿
PRINTER = t;//所有的工作就为了这一个动作:操纵针头打出一个点
}
}
}
delay(20);
PRINTER = 0x10;
}
PRINTER = 0x00;
}
/******************************************
名称: PrinterTest
描述: 检测打印机是否能工作
该程序会打印出所有能打印的字符
********************************************/
/*void PrinterTest()
{
uchar i;
uchar Temp[16];
InitPrinter();
StartPrint();
sprintf(Temp,"%s", "Printer test ...");
for(i=0;i<16;i++)
{
if(i<4){LetBuf[0][i]=Temp[i]-32;}
else
{
if(i<8){LetBuf[1][i-4]=Temp[i]-32;}
else
{
if(i<12){LetBuf[2][i-8]=Temp[i]-32;}
else{LetBuf[3][i-12]=Temp[i]-32;}
}
}
}
PrintLetLine();
StopPrint();
}*/
void Change(void)
{
uchar i;
for(i=0;i<16;i++)
{
if(i<4){LetBuf[0][i]=Temp[i]-32;}
else
{
if(i<8){LetBuf[1][i-4]=Temp[i]-32;}
else
{
if(i<12){LetBuf[2][i-8]=Temp[i]-32;}
else{LetBuf[3][i-12]=Temp[i]-32;}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -