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

📄 printdriver.c

📁 51单片机驱动打印机的C程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//----------------------------------------------------
//	模块名称		PrintDriver.c
//
//	功能描述		打印驱动
//	创建时间		cjf	2004/03/05
// 	Copyright(c) 2002-2003 Xiamen Yealink Network Technology Co,.Ltd
//	
//----------------------------------------------------
#define  Module_PrintDriver 	1
#include "805xall.h"			//编译条件配置,寄存器,常量,I/O口定义,Keil的一些库


//----------变量定义----------------------------------
//BYTE Flag;		// 打印机状态 ~BUSY,ACK,PE,ONLINE,~ERROR
//BYTE Ctrl;		// 打印机控制字 ~INIT AUTOFD,STORE
//----------------------------------------------------


//***************************************************************
// void InitPrinter(void)
//
// Func: 打印初始化
//***************************************************************
void InitPrinter( void )
{
	boPrintSTB = cnbPrintCSOff;			// 关闭打印口
	if (!PrintByte(0x1B)) return;
	if (!PrintByte(0x40)) return;

	if (!PrintByte(0x1B)) return;
	if (!PrintByte(0x43)) return;
	if (!PrintByte(0x16)) return;		// 设置一页为22行
}


//***************************************************************
// void SendPrintData(BYTE PrintData)
//
// Func: 	送打印数据
// In:		PrintData 一个字节的打印数据,ASCII 码或者 GB 码
//***************************************************************
void SendPrintData(BYTE PrintData)
{
	boPrintSTB = cnbPrintCSOff;				// 打印机禁能
	boStatusLedLE = cnIOOutDisable;			// 关闭LED灯输出口
	boExtInputOE = cnIOInDisable;			// 关闭扩展输入口,停止读取状态
	boPrintLE = cnIOOutEnable;				// 打开打印数据输出口
	_nop_();
	_nop_();
	ExtIOPort = PrintData;
	Delay5us();
	boPrintLE = cnIOOutDisable;				// 关打印数据输出口
	boPrintSTB = cnbPrintCSOn;				// 选通数据输出端口,送一个负脉冲
	Delay20us();
	Delay5us();
	Delay5us();
	boPrintSTB = cnbPrintCSOff;				// 
}


//***************************************************************
// BYTE ReadPrintStatus(void)
//
// Func: 读取打印机状态
//***************************************************************
BYTE ReadPrintStatus(void)
{
	BYTE PrintFlag;
	
	boPrintLE = cnIOOutDisable;		// 关断打印数据输出口
	boStatusLedLE = cnIOOutDisable;	// 关LED输出口
	boExtInputOE = cnIOInDisable;	// 关闭扩展输入口
	PrintPort = 0xFF;
	boExtInputOE = cnIOInEnable;	// 打开扩展输入口,读取状态
	_nop_();
	_nop_();
	PrintFlag = PrintPort;			// 读取状态
	boExtInputOE = cnIOInDisable;	// 关闭扩展输入口

	return(PrintFlag & 0x0F);		// 返回打印机状态
}


//***************************************************************
// BOOL PrintByte(BYTE PrintData)
//
// Func: 打印一个字节的数据
//***************************************************************
BOOL PrintByte(BYTE PrintData)
{
	BYTE PrintStatus;
	WORD wPrintWaitTmr;
	
	wPrintWaitTmr = 0x00;
	while(1)
	{
		PrintStatus = ReadPrintStatus();
		if ((!(PrintStatus & 0x01)) || (PrintStatus & 0x04) || (PrintStatus & 0x08))
		{	// ERROR ==0,表示出错;BUSY = 1 打印机忙;打印机无纸
			Delay20us();
			++wPrintWaitTmr;
			if (wPrintWaitTmr > 2000) return(FALSE);
		}
	//	else if (PrintStatus & 0x02)
	//	{	// ACK = 1 打印数据输入未完成,或功能操作未结束
	//		//return(FALSE);
	//	}
	//	else if (PrintStatus & 0x04)
	//	{	// BUSY = 1 打印机忙
	//		++wPrintWaitTmr;
	//	}
	//	else if (PrintStatus & 0x08)
	//	{	// 打印机无纸
	//		++wPrintWaitTmr;
	//	}
		else break;
	}
	
	SendPrintData(PrintData);
	return(TRUE);
}


//***************************************************************
// BOOL PrintString(BYTE PrintNum,BYTE PrintChar)
//
// Func: 打印字符串
//***************************************************************
BOOL PrintString(BYTE *StringPtr)
{
	BYTE PrintChar;
	
	PrintChar = *StringPtr;
	while(PrintChar != NULL)	// 打印到字符串结束
	{
		if (!PrintByte(PrintChar)) return(FALSE);
		++StringPtr;
		PrintChar = *StringPtr;
	}
	return(TRUE);
}


//***************************************************************
// BOOL PrintHex(BYTE HexData)
//
// Func: 打印一个字节的Hex数据
//***************************************************************
BOOL PrintHex(BYTE HexData)
{	
	// 高位
	if (!PrintByte(HexData%100/10 + '0')) return(FALSE);
	// 低位
	if (!PrintByte(HexData%10 + '0')) return(FALSE);

	return(TRUE);
}
//***************************************************************
//	BOOL PrintBCD( BYTE *ptr, BYTE len)
//
//	Func:	显示BCD数据,主要用于显示电话号码
//			数据最大长度为len字节,以0x0f结尾
//***************************************************************
BOOL PrintBCD( BYTE *ptr, BYTE len)
{
	BYTE TempNum;

	while(len--)
	{	
		// 高位
		TempNum = (*ptr>>4) & 0x0F;
		switch( TempNum )
		{
			case 0x0A:
			case 0x0E:
				break;
			case 0x0F:	//  号码显示结束
				return TRUE;
			case 0x0B:
				if (!PrintByte('*')) return(FALSE);
				break;
			case 0x0C:
				if (!PrintByte('#')) return(FALSE);
				break;
			case 0x0D:
				if (!PrintByte('-')) return(FALSE);
				break;
			default:
				if (!PrintByte(TempNum + '0')) return(FALSE);
				break;
		}
		// 低位
		TempNum = *ptr & 0x0F;
		switch( TempNum )
		{
			case 0x0A:
			case 0x0E:
				break;
			case 0x0F:	//  号码显示结束
				return TRUE;
			case 0x0B:
				if (!PrintByte('*')) return(FALSE);
				break;
			case 0x0C:
				if (!PrintByte('#')) return(FALSE);
				break;
			case 0x0D:
				if (!PrintByte('-')) return(FALSE);
				break;
			default:
				if (!PrintByte(TempNum + '0')) return(FALSE);
				break;
		}
		ptr++;
	}
}

//***************************************************************
// BOOL PrintCallBillData(BYTE PrintMemID)
//
// Func: 打印打印缓存中的话单数据
//		 打印缓存中的话单数据格式:
// 		 			类别(1B)
// 		 			路数(1B)
// 		 			序号(1B): 即时话单的序号为001
// 		 			电话号码(7B)
// 		 			通话起始时间(4B)
// 		 			通话时长(3B)
// 		 			通话费用(3B)
//***************************************************************
BOOL PrintCallBillData(BYTE PrintMemID)
{
	BYTE i;
//	BYTE BillData;
	DWORD dwPrintBillTemp;
	// cjf 2004-03-2
	InitPrinter();

	#if mPrintHZ
	PrintString("RECEIPT FOR CALL CHARGES");	// 每组话单必须以英文打头,否则会出现乱码		
	//PrintString("\r\n亿联网络技术有限公司");  //
	PrintString("\r\n公用电话话费收据");
	PrintString("\r\n话单打印:");
	#else
	PrintString("\r\n");
	PrintString("\r\n");
	#endif
	
	for (i=7; i>0; i--)							// cjf 2004-03-2
	{
		if (!PrintString("\r\n")) return(FALSE);
	}
	
	EepromRead((cnPrintMemLen/2),TempBuf,(cnPrintMemAddr + PrintMemID * cnPrintMemLen));
	
	// 流水号	NO: 2-001	
	#if mPrintHZ
	PrintString("编号:");
	
	#endif
	
	if (!PrintByte(TempBuf[1] + '0')) return(FALSE);			// 打印路数
	if (!PrintString("-")) return(FALSE);
	if (!PrintByte(TempBuf[2]/100 + '0')) return(FALSE);
	if (!PrintByte((TempBuf[2]%100)/10 + '0')) return(FALSE);
	if (!PrintByte(TempBuf[2]%10 + '0')) return(FALSE);			// 打印组数
	
	// 日期		Date: 2004/03/12
	#if mPrintHZ
	PrintString("               日期:");
	#else
	if (!PrintString("                     ")) return(FALSE);
	#endif
	
	if (!PrintString("20")) return(FALSE);
	if (!PrintHex(RealTime.Year)) return(FALSE);
	if (!PrintString("/")) return(FALSE);
	if (!PrintHex(RealTime.Month)) return(FALSE);
	if (!PrintString("/")) return(FALSE);
	if (!PrintHex(RealTime.Day)) return(FALSE);
	if (!PrintString("\r\n")) return(FALSE);
	if (!PrintString("\r\n")) return(FALSE);

	// 主叫号
	
	#if mPrintHZ
	PrintString("电话号码:");
	#else
	if (!PrintString("   ")) return(FALSE);		 	// cjf 2004-03-23
	#endif
	
	//.....
	if (!PrintString("\r\n")) return(FALSE);
	if (!PrintString("\r\n")) return(FALSE);
	
	// 被叫号
	
	#if mPrintHZ
	PrintString("电话号码:");
	#else
	if (!PrintString("   ")) return(FALSE);		 	// cjf 2004-03-23
	#endif
	PrintBCD( &TempBuf[3],(cnPrintMemLen/2)-3 );	// cjf 2004-03-26 打印电话号码
/*
	for (i=3; i<(cnPrintMemLen/2); i++)
	{
		BillData = TempBuf[i] >> 4;
		if (BillData == 0x0F) break;
		else PrintByte(BillData + '0');
		
		BillData = TempBuf[i] & 0x0F;
		if (BillData == 0x0F) break;
		else PrintByte(BillData + '0');
	}
*/
	if (!PrintString("\r\n")) return(FALSE);
	if (!PrintString("\r\n")) return(FALSE);
	
	EepromRead((cnPrintMemLen/2),TempBuf,(cnPrintMemAddr + PrintMemID * cnPrintMemLen + cnPrintMemLen/2));
	// 起始时间: 03/12 17:36	
	#if mPrintHZ
	PrintString("起始时间:");
	#else
	if (!PrintString("   ")) return(FALSE);		 	// cjf 2004-03-23
	#endif
	
	if (!PrintHex(TempBuf[0])) return(FALSE);
	if (!PrintString("/")) return(FALSE);
	if (!PrintHex(TempBuf[1])) return(FALSE);
	if (!PrintString(" ")) return(FALSE);
	if (!PrintHex(TempBuf[2])) return(FALSE);
	if (!PrintString(":")) return(FALSE);
	if (!PrintHex(TempBuf[3])) return(FALSE);
	
	// 时长 00:00:30
	if (!PrintString("     ")) return(FALSE); 
	#if mPrintHZ
	PrintString("时长:");
	#else
	PrintString("           ");
	#endif
	
	
	dwPrintBillTemp = (TempBuf[4] << 16) | (TempBuf[5] << 8) | TempBuf[6];
	i = dwPrintBillTemp/3600;
	if (!PrintHex(i)) return(FALSE);
	if (!PrintString(":")) return(FALSE);
	i = dwPrintBillTemp%3600/60;
	if (!PrintHex(i)) return(FALSE);
	if (!PrintString(":")) return(FALSE);
	i = dwPrintBillTemp%60;
	if (!PrintHex(i)) return(FALSE);
	if (!PrintString("\r\n")) return(FALSE);
	if (!PrintString("\r\n")) return(FALSE);
	
	// 话价
	if (!PrintString("         ")) return(FALSE);
	//.....
	// 合计
	
	if (!PrintString("                     RMB")) return(FALSE);
	dwPrintBillTemp = (TempBuf[7] << 16) | (TempBuf[8] << 8) | TempBuf[9];
	i = dwPrintBillTemp/10000;
	if (!PrintHex(i)) return(FALSE);
	i = dwPrintBillTemp%10000/100;
	if (!PrintHex(i)) return(FALSE);
	if (!PrintString(".")) return(FALSE);
	i = dwPrintBillTemp%100;
	if (!PrintHex(i)) return(FALSE);
	if (!PrintString("\r\n")) return(FALSE);
	
	PrintByte(0x0C);		// 换页
	return(TRUE);
}

//***************************************************************
// BOOL PrintCallInData(BYTE PrintMemID)
//
// Func: 打印打印缓存中的来电数据
//		 打印缓存中的话单数据格式:
// 		 			类别(1B)
// 		 			路数(1B)
// 		 			序号(1B): 即时话单的序号为001
// 		 			电话号码(7B)
// 		 			通话起始时间(4B)
// 		 			通话时长(3B)
// 		 			通话费用(3B)
//***************************************************************
BOOL PrintCallInData(BYTE PrintMemID)
{
	BYTE i;
//	BYTE BillData;
	//DWORD dwPrintBillTemp;
	// cjf 2004-03-2
	InitPrinter();
	if (!PrintByte(0x1B)) return(FALSE);
	if (!PrintByte(0x43)) return(FALSE);
	if (!PrintByte(0x16)) return(FALSE);		// 设置一页为22行
	
	#if mPrintHZ
	PrintString("RECEIPT FOR CALL CHARGES");	// 每组话单必须以英文打头,否则会出现乱码		
	//PrintString("\r\n亿联网络技术有限公司");  //
	PrintString("\r\n公用电话话费收据");
	PrintString("\r\n话单打印:");
	#else
	PrintString("\r\n");
	PrintString("\r\n");
	#endif

	for (i=7; i>0; i--)							// cjf 2004-03-2
	{
		if (!PrintString("\r\n")) return(FALSE);
	}
	
	EepromRead((cnPrintMemLen/2),TempBuf,(cnPrintMemAddr + PrintMemID * cnPrintMemLen));
	
	// 流水号	NO: 2-001	
	#if mPrintHZ
	PrintString("编号:");
	#endif
	
	if (!PrintByte(TempBuf[1] + '0')) return(FALSE);			// 打印路数
	if (!PrintString("-")) return(FALSE);
	if (!PrintByte(TempBuf[2]/100 + '0')) return(FALSE);
	if (!PrintByte((TempBuf[2]%100)/10 + '0')) return(FALSE);
	if (!PrintByte(TempBuf[2]%10 + '0')) return(FALSE);			// 打印组数
	

⌨️ 快捷键说明

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