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

📄 print.c

📁 M-150II的C程序
💻 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 + -