📄 printdriver.c
字号:
//----------------------------------------------------
// 模块名称 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 + -