📄 printertest.c
字号:
/****************************************************************************
* 文件名:PrinterTest.C
* 功能:用底层编程实现在MP-T153PC上写出字符
* 说明:
* 完成日期:2006-02-09
****************************************************************************/
#include "config.h"
#include "PrinterTest.h"
#define LCDNUM 10
#define LCDDB ( 0xFF<<LCDNUM ) // P0.10~P0.17 定义为LCD的数据输入端
#define LCDCS ( 1<<28 ) // P0.28 定义为LCD的数据选通
#define LCDA0 ( 1<<29 ) // P0.29 定义为LCD命令和数据选通端
#define LCDBACKLIGHT ( 1<<25 ) // P1.25 定义为LCD背光控制
#define LCDWR ( 1<<2 ) // P0.2 定义为LCD屏的数据写信号
#define LCDRD ( 1<<3 ) // P0.3 定义为LCD屏的数据读信号
#define FPGA_RESET ( 1<<18 ) // P1.18控制FPGA复位,高电平有效
#define MPU_TEST ( 1<<19 ) // P1.19输出方波,以测试MPU是否写入成功
#define PRINTERNUM 10
#define PRINTERDB ( 0xFF<<PRINTERNUM ) // P0.10~P0.17 定义为PRINTER的数据输入端
#define PRINTERACK ( 1<<21 ) // P1.21 定义为PRINTER的回答脉冲
#define PRINTERBUSY ( 1<<22 ) // P1.22 定义为PRINTER的忙标志
#define PRINTERSEL ( 1<<23 ) // P1.23 定义为PRINTER的在线标志
#define PRINTERERR ( 1<<24 ) // P1.24 定义为PRINTER的故障标志
#define PRINTERSTB ( 1<<16 ) // P1.16 定义为PRINTER的数据选通脉冲,
// 上升沿时读入数据
/****************************************************************************
*********************************函数原型说明********************************
****************************************************************************/
uint8 Printer_Test(void);
uint8 PrintByte(uint8 Data);
void PrintDByte(uint16 Data);
void PrintWords(uint8 *Data);
void PrintChars(uint8 *Data);
void PrintFactoryInf(void);
void PrintTableHead(void);
void DelayNS(uint32 dly);
void GUI_SendCom( uint8 COM );
void GUI_SendDat( uint8 Dat );
void GUI_LcdInit(void);
void GUI_WriteWord_1616(uint8 Page,uint8 Col,uint8 *Word,uint8 Reverse);
void GUI_WriteARowWord_1616(uint8 Page,uint8 Col,uint8 *Word,uint8 Reverse,uint8 Num);
void GUI_ClrScreen(void);
/****************************************************************************
* 名称:PrinterTest()
* 功能:检测打印机状态
* 入口参数:无
* 出口参数:uint8 返回是否正常标志,正常和数据被接收返回0 ;故障返回1;
* 打印机离线返回3;数据未被接收返回4;
****************************************************************************/
uint8 Printer_Test(void)
{
uint32 temp;
temp=IO1PIN;
if((temp&PRINTERSEL)==0) //表示打印机离线,以下判断不需要再做
return 3;
else if((temp&PRINTERERR)==0) //表示打印机在线,但有故障
return 1;
else if(temp&PRINTERACK) //表示数据未被接收
return 4;
else //表示打印机正常且数据被正常接收,可以再接收数据
return 0;
}
/****************************************************************************
* 名称:PrintByte()
* 功能:给打印机发送1字节数据
* 入口参数:Data 待发送的数据
* 出口参数:uint8 返回是否正常标志,正常和数据被接收返回0 ;故障返回1;
* 忙返回2;打印机离线返回3;数据未被接收返回4;
****************************************************************************/
uint8 PrintByte(uint8 Data)
{
uint8 temp;
uint16 overtime=0;
if(Printer_Test()==3)
{
GUI_WriteARowWord_1616(1,2,PrinterBreakaway[0],0,2); //在屏上提示打印机离线,然后退出
return 3;
}
else if(Printer_Test()==1)
{
GUI_WriteARowWord_1616(1,2,PrinterErr[0],0,2); //在屏上提示打印机故障,然后退出
return 1;
}
else
{
overtime=0;
temp=~Data;
IO0DIR=PRINTERDB;
if(Data==0x00)
{
IO0CLR = PRINTERDB;
}
else
{
IO0SET = Data << PRINTERNUM; // 从P0.10~P0.17输出
IO0CLR = (temp << PRINTERNUM);
}
IO1DIR=PRINTERSTB;
IO1CLR=PRINTERSTB;
while(overtime<500)
overtime++;
overtime=0;
IO1SET=PRINTERSTB;
while((Printer_Test()==4)&&(overtime<1000))
overtime++; //等待数据被接收
return 0;
}
}
/****************************************************************************
* 名称:PrintDByte()
* 功能:给打印机发送2字节数据
* 入口参数:Data 待发送的数据
* 出口参数:无
****************************************************************************/
void PrintDByte(uint16 Data)
{
uint8 Data_l,Data_h;
Data_l=(uint8)Data;
Data_h=(uint8)(Data>>8);
PrintByte(Data_h);
PrintByte(Data_l);
}
/****************************************************************************
* 名称:PrintDByteS()
* 功能:给打印机发送2字节数据,但与Printer_SendDByte()函数的区别在于高低字节是倒序送的
* 先送低字节,再送高字节;在用字符串送数时发现了这个现象。
* 入口参数:Data 待发送的数据
* 出口参数:无
****************************************************************************/
void PrintDByteS(uint16 Data)
{
uint8 Data_l,Data_h;
Data_l=(uint8)Data;
Data_h=(uint8)(Data>>8);
PrintByte(Data_l);
PrintByte(Data_h);
}
/****************************************************************************
* 名称:PrintWords()
* 功能:给打印机发送多个汉字的内码
* 入口参数:Data 待发送的汉字内码首指针
* 出口参数:无
****************************************************************************/
void PrintWords(uint8 *Data)
{
uint8 temp=0;
PrintByte(0x1b);
PrintByte(0x38);
PrintByte(0x04); //0x00表示选择16*16点阵汉字,0x04表示选择12*12汉字,
//MP-T153PC型打印机默认只有16*16和12*12汉字
while(Data[temp])
{
PrintByte(Data[temp]);
temp++;
}
}
/****************************************************************************
* 名称:PrintBytes()
* 功能:给打印机发送多个字节的内码,使用字符集1
* 入口参数:Data 待发送的汉字内码首指针
* 出口参数:无
****************************************************************************/
void PrintChars(uint8 *Data)
{
uint8 temp=0;
PrintByte(0x1b);
PrintByte(0x36); //0x36表示使用字符集1,0x37表示使用字符集2
while(Data[temp])
{
PrintByte(Data[temp]);
temp++;
}
}
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{
uint32 i;
for(; dly>0; dly--)
for(i=0; i<500; i++);
}
/****************************************************************************
* 名 称:GUI_SendCom()
* 功 能: 发送一字节命令
* 入口参数:dat 要发送的命令
* 出口参数:无
* 说 明:A0=0 发送命令
****************************************************************************/
void GUI_SendCom( uint8 COM )
{
uint8 Data;
Data = ~COM;
IO0DIR = LCDDB|LCDCS | LCDA0 | LCDWR | LCDRD;
IO0CLR = LCDA0;
IO0CLR = LCDCS; //片选lcd,低电平有效
IO0CLR = LCDWR; //控制lcd写命令
IO0SET = LCDRD;
if(COM==0x00)
{
IO0CLR = LCDDB;
}
else
{
IO0SET = COM << LCDNUM; // 从P0.10~P0.17输出
IO0CLR = (Data << LCDNUM);
}
IO0SET = LCDCS;
IO0SET = LCDRD;
IO0SET = LCDWR; // LCDWR = 1
IO0CLR = LCDDB;
}
/****************************************************************************
* 名 称:GUI_SendDat()
* 功 能: 发送一字节命令
* 入口参数:dat 要发送的数据
* 出口参数:无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -