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

📄 report2.c

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
* Copyright (c) 2004,成都港顺科技发展有限公司
* All rights reserved.
*
* 编 译 器:Keil:C Compiler:7.20;Assembler:7.10
* 工程名称:POS-Test.UV2
* 文件名称:ReportPrint.C
* 摘    要:表报打印
*
* 单 片 机:uPSD3254
* 当前版本:0.4
* 作    者:雍继兵
* 完成日期:2004-12-7 14:45
*/

#include "Main.h"
#include "Report.h"



#define useinfo 1  //测试时使用 在实际使用时将此置为0


/*-----------------------------------------------------------------------------------
								日交易数据在LCD上显示打印
disHead = 0:不显示提示语
disHead = 1:显示提示语
disHead = 2:不打印报表头
disHead = 3:打印报表头
-----------------------------------------------------------------------------------*/
uchar DayCollDataDisplay(uchar disHead,uchar *InputDayData)
{
	uchar i=0,j=0,InitVal[3],str[30],PrintBuf[50],time[10];
	gyt2 *Npm;
	gyt4 *Ipt;
	ulong delay = 0xffff;

	Itarr(InitVal);

	if(disHead == 1)
		DisHint("指定时间段内的","<<日交易数据>>汇总报表","按[确认]开始查找...");//只有在时间段查询时有
	WindowsSet(12);
//当前日期
	strcpy(&WinHint[0][1],"当前日期:");
	BcdToStr(4,&InputDayData[0],&WinHint[0][10],0);
//当天正常发票份数

	strcpy(&WinHint[1][1],"当天正常份数:");
	Npm = &InputDayData[4];
	if(Npm->dat == 0)
		strcpy(&WinHint[1][14],"0");
	else
		NumToStr(Npm->dat,&WinHint[1][14],0);

//当天退票份数
	strcpy(&WinHint[2][1],"当天退票份数:");
	Npm = &InputDayData[6];
	if(Npm->dat == 0)
		strcpy(&WinHint[2][14],"0");
	else
		NumToStr(Npm->dat,&WinHint[2][14],0);

//当天废票份数
	strcpy(&WinHint[3][1],"当天废票份数:");
	Npm = &InputDayData[8];
	if(Npm->dat == 0)
		strcpy(&WinHint[3][14],"0");
	else
		NumToStr(Npm->dat,&WinHint[3][14],0);

//分类统计金额
	strcpy(&WinHint[4][1],"     分类统计金额");
	strcpy(&WinHint[5][1],"税号 正常金额 退票金额");
	for(j=0;j<6;j++)
	{
		for(i=0;i<29;i++)str[i]=' ';
		NumToStr(InputDayData[10+j],str,0);//税率

		Ipt = &InputDayData[16+j*4];
		if(Ipt->dat == 0)
			strcpy(&str[4],"0.00");
		else
			NumToStr(Ipt->dat,&str[4],5); //正常金额

		Ipt = &InputDayData[40+j*4];
		if(Ipt->dat == 0)
			strcpy(&str[15],"0.00");
		else
			NumToStr(Ipt->dat,&str[15],5);//退票金额

		for(i=0;i<23;i++)
			if(str[i]==0)str[i]=' ';
		str[23]=0;
		strcpy(&WinHint[6+j][1],str);
	}
	if(disHead == 0 || disHead == 1)//在LCD上显示
	{
		Windows(1,0,InitVal);//按退出键退出
		return *InitVal;
	}
	else if(disHead == 2 || disHead == 3)//打印报表数据
	{
		if(disHead == 3)//打印报表头
			PrintLine("指定时间段内的日交易数据报表");
		else
			PrintLine("日交易数据");

		BcdToStr(4,&InputDayData[0],&time[0],0);
		PrintTime("当前日期:",&time[0],&PrintBuf[0]);
		PrintStr(&PrintBuf[0]);

		for(i=1;i<12;i++)
			PrintStr(&WinHint[i][1]);
		PrintLine("");
		PrintStr("电子存根");

		while(--delay);
	}
	else ;
}
/*-----------------------------------------------------------------------------------
									发票打印数据在LCD上显示
disfg = 0:不显示提示语
disfg = 1:显示提示语
disfg = 2:不打印报表头
disfg = 3:打印报表头
Sectfg = 0 :按时间查询
Sectfg = 1 :按时间段查询
Sectfg = 2 :按发票号查询
-----------------------------------------------------------------------------------*/
uchar InvPrintData(uchar disfg,uchar Sectfg,uchar *str)
{
	uchar i=0,InitVal[3],PrintBuf[50],time[10],InputData[30];
	uint v=0,n=0,delay=0x7fff;
	gyt4 *Ips,*Its,*Sts;
	gyt2 tp;

	ulong InvStartAddress,temp=0;


	n=0;
	InvStartAddress=InvoListLimit1;

	for(i=0;i<27;i++) InputData[i]=str[i];

	if(disfg == 0xff)
		return 0;			//在打印时选择退出

	Itarr(InitVal);

	WindowsSet(7);

	if(disfg == 1)			//显示提示窗口
		DisHint("指定时间段内的","<<发票打印数据>>报表","按[确认]开始查找...");


	Its = &InputData[0];//按输入时间查询时

	temp = Its->dat;
//	UartTxd(4,Its->str);


	I2cRead(InvoPrintNum,2,tp.str);

	if(tp.dat == 0)
		return 0;			//返回 数量为0 说明没有数据


	while(Sectfg == 0 && disfg == 0)
	{

		SerialFlashRead(FlashInvo,InvStartAddress,27,InputData);

		Ips = InputData;

		if(temp == Ips->dat)
			break;
		else
		{
			InvStartAddress+=27;
			n++;
			if(n >= tp.dat)
				return 0;
		}
	}

	while(1)
	{

		Itarr(InitVal);

		strcpy(&WinHint[0][1],"开票日期:");
		BcdToStr(4,&InputData[0],&WinHint[0][10],0);

		strcpy(&WinHint[1][1],"发票号:");

		Ips = &InputData[4];
		NumToStr(Ips->dat,&WinHint[1][8],0);	//按HEX格式转换

		strcpy(&WinHint[2][1],"开票类型:");
		NumToStr(InputData[8],&WinHint[2][10],0);


		strcpy(&WinHint[3][1],"开票总金额:");
		Ips = &InputData[9];
		if(Ips->dat == 0)
			strcpy(&WinHint[3][12],"0.00");
		else
			NumToStr(Ips->dat,&WinHint[3][12],5);

		strcpy(&WinHint[4][1],"税控码:");	//在第五行上显示税控码字样
		Ips = &InputData[13];
		NumToStr(Ips->dat,&WinHint[5][1],0);	//最高位如果是‘0’不会显示
		for(i=0;i<10;i++)
			if(WinHint[5][1+i]==0)
				WinHint[5][1+i]='0';//如果数据为0则显示出字符0

		Ips = &InputData[17];
		NumToStr(Ips->dat,&WinHint[5][11],0);
		for(i=0;i<10;i++)
			if(WinHint[5][11+i]==0)
				WinHint[5][11+i]='0';//如果数据为0则显示出字符0

		strcpy(&WinHint[6][1],"原始发票号:");
		Sts = &InputData[21];
		NumToStr(Sts->dat,&WinHint[6][12],0);

		if(disfg == 0 || disfg == 1)
		{
			Windows(1,0,InitVal);
			if(*InitVal == K_TC)
				return K_TC;//按退出键退出
			else if(Sectfg == 1) 		//在时间段查询时用
				return *InitVal;
			else if(Sectfg == 2)//按发票号查询
				return 0;
		}

		if(disfg == 2 || disfg == 3)//disfg = 3:打印报表头,disfg = 2 :不打印报表头
		{
			if(disfg == 3)
				PrintLine("指定时间段内的发票打印数据报表");
			else
				PrintLine("发票打印数据");

			BcdToStr(4,&InputData[0],&time[0],0);
			PrintTime("开票日期:",&time[0],&PrintBuf[0]);
			PrintStr(&PrintBuf[0]);

			for(i=1;i<4;i++)
			{
				PrintStr(&WinHint[i][1]);
				delay=0x6fff;
				while(--delay);		//由于发送数据太快.导至打印缓冲数据溢出所以得延时
			}

			strcpy(PrintBuf,"税控码:");
			strcpy(&PrintBuf[7],&WinHint[5][1]);
			PrintStr(&PrintBuf[0]);
			delay=0x6fff;
			while(--delay);		//由于发送数据太快.导至打印缓冲数据溢出所以得延时
			PrintStr(&WinHint[6][1]);
			delay=0x6fff;
			while(--delay);		//由于发送数据太快.导至打印缓冲数据溢出所以得延时

			PrintLine("");
			PrintStr("电子存根");

			if(Sectfg == 1 || Sectfg == 2)
				return 0;
		}

		if(Sectfg == 0)		//只有在输入时间查询时才有效
		{
			while(1)
			{
				InvStartAddress+=27;
				SerialFlashRead(FlashInvo,InvStartAddress,27,InputData);
				Ips = &InputData[0];
//				UartTxd(4,Ips->str);
				n++;
				if((Ips->dat > temp) || (n >= tp.dat))
					return 0;
				else if(Ips->dat == temp) break;
	//			if((temp != Ips->dat) && (n >= tp.dat))
	//			{
	//				Sts.dat = temp;
	//				for(i=0;i<4;i++)
	////					*InputData++ = Sts.str[i];		//为保证退出程序再进时指向下一笔数据
	//						InputData[i]=Sts.str[i];
	//				for(i=4;i<8;i++)
	//						InputData[i]=0;
	////					*InputData++ = 0;		//为保证退出程序再进时指向下一笔数据
	//				return 0;
	//			}
		  }
		}
	}
}


//----------------------------------------------------------------------------
//
//
//
//----------------------------------------------------------------------------
void DanJunInvoiceWindownOne(uchar *InputDat)
{
	uchar i,UnitName[45],Use[10];

	I2cRead(TaxpayerName,40,UnitName);	//读取单位名称

	WindowsSet(12);
	strcpy(&WinHint[0][1],"单位名称:");
	for(i=0;i<22;i++) WinHint[1][1+i]=UnitName[i];
	for(i=0;i<18;i++)	WinHint[2][1+i]=UnitName[22+i];

	strcpy(&WinHint[3][1],"税号:");
	I2cRead(TaxNumber,20,UnitName);			//读取税号 ==  纳税人编码
	for(i=0;i<20;i++) WinHint[4][1+i]=UnitName[i];

	strcpy(&WinHint[5][1],"机器号:");
	I2cRead(MachineNo,8,Use);
	BcdToStr(8,Use,UnitName,0x81);
	strcpy(&WinHint[6][1],UnitName);

	strcpy(&WinHint[7][1],"开票日期:");
	BcdToStr(4,&InputDat[29],UnitName,0x81);
	strcpy(&WinHint[8][1],UnitName);
	strcpy(&WinHint[8][9]," 至 ");
	BcdToStr(4,&InputDat[33],UnitName,0x81);
	strcpy(&WinHint[8][13],UnitName);

	strcpy(&WinHint[9][1],"发票代码:");
	BcdToStr(10,&InputDat[0],UnitName,0x81);
	strcpy(&WinHint[10][1],UnitName);

	strcpy(&WinHint[11][1],"按〖小计〗显示下屏内容");
}

void DanJunInvoiceWindownTwo(uchar *InputDat)
{
	gyt2 *Ipint;
	gyt4 *Iplong;
	uchar Use[15];
	WindowsSet(8);

	strcpy(&WinHint[0][1],"发票起始号:");
	Iplong = &InputDat[10];
	NumToStr(Iplong->dat,Use,0);
	strcpy(&WinHint[0][12],Use);

	strcpy(&WinHint[1][1],"发票终止号:");
	Iplong = &InputDat[14];
	NumToStr(Iplong->dat,Use,0);
	strcpy(&WinHint[1][12],Use);

	strcpy(&WinHint[2][1],"正常发票份数:");
	NumToStr(InputDat[18],&WinHint[2][14],0);

	strcpy(&WinHint[3][1],"正常开具金额:");
	Iplong = &InputDat[21];
	NumToStr(Iplong->dat,Use,7);
	strcpy(&WinHint[3][14],Use);

	strcpy(&WinHint[4][1],"退票份数:");
	NumToStr(InputDat[20],&WinHint[4][10],2);

	strcpy(&WinHint[5][1],"废票份数:");
	NumToStr(InputDat[21],&WinHint[5][10],2);

	strcpy(&WinHint[6][1],"退票金额:");
	Ipint = &InputDat[25];
	NumToStr(Ipint->dat,&WinHint[6][10],7);

	strcpy(&WinHint[7][1],"按〖小计〗显示下屏内容");
}


/*------------------------------------------------------------------------------------
							发票代码在LCD上显示
dts = 0:不显示提示语
dts = 1:显示提示语
dts = 2:不打印报表头
dts = 3:打印报表头
------------------------------------------------------------------------------------*/

uchar AppointInvdis(uchar dts,uchar *indat)
{
	uchar i=0,InitKey[3];

	ulong delay = 0xffff;

	if(dts == 1)			//要显示提示则将disTS=1否则不显示提示
		DisHint("指定时间段内的","<<单卷发票使用>>报表","按[确认]开始查找...");

	InitKey[0]=K_TC;
	InitKey[1]=K_HJ;
	InitKey[2]=K_XJ;
	InitKey[3]=0;

	if(dts == 1 || dts == 0)		//显示
	{
		while(1)
		{
			InitKey[0]=K_TC;
			InitKey[1]=K_HJ;
			InitKey[2]=K_XJ;
			InitKey[3]=0;
			if(!i)
				DanJunInvoiceWindownOne(indat);
			else
				DanJunInvoiceWindownTwo(indat);
			Windows(1,0,InitKey);
			if(*InitKey==K_TC)	return K_TC;
			else if(*InitKey==K_XJ)	i=~i;
			else if(*InitKey==K_HJ) return 1;
		}
		return *InitKey;
	}
	if(dts == 2 || dts == 3)		//打印
	{

		PtintInvoTome(indat);
		return 1;
	}
}


/*
uchar AppointInvdis(uchar dts,uchar *indat)
{
	uchar i=0,InitKey[3];
	gyt4 *Inv;

	ulong delay = 0xffff;

	Itarr(InitKey);

	WindowsSet(11);
	if(dts == 1)			//要显示提示则将disTS=1否则不显示提示
		DisHint("指定时间段内的","<<单卷发票使用>>报表","按[确认]开始查找...");
//发票代码

	strcpy(&WinHint[0][1],"发票代码:");//copy 发票代码 to WinHint[0][0]
	BcdToStr(10,&indat[0],&WinHint[1][1],0);

//发票起始号
	strcpy(&WinHint[2][1],"发票起始号:");//copy 发票代码到Inv2
	Inv=&indat[10];
	NumToStr(Inv->dat,&WinHint[2][12],0);

//发票终止号
	strcpy(&WinHint[3][1],"发票终止号:");
	Inv=&indat[14];
	NumToStr(Inv->dat,&WinHint[3][12],0);

//正常发票份数
	strcpy(&WinHint[4][1],"正常发票份数:");
	if(indat[18] == 0)
		strcpy(&WinHint[4][14],"0");
	else
		NumToStr(indat[18],&WinHint[4][14],0);

//退票份数
	strcpy(&WinHint[5][1],"退票份数:");
	if(indat[19] == 0)
		strcpy(&WinHint[5][10],"0");
	else
		NumToStr(indat[19],&WinHint[5][10],0);

//废票份数
	strcpy(&WinHint[6][1],"废票份数:");
	if(indat[20] == 0)
		strcpy(&WinHint[6][10],"0");
	else
		NumToStr(indat[20],&WinHint[6][10],0);

//正常发票总金额
	strcpy(&WinHint[7][1],"正常总金额:");
	Inv=&indat[21];
	if(Inv->dat == 0)
		strcpy(&WinHint[7][12],"0.00");
	else
		NumToStr(Inv->dat,&WinHint[7][12],5);

//退票总金额
	strcpy(&WinHint[8][1],"退票总金额:");
	Inv=&indat[25];
	if(Inv->dat == 0)
		strcpy(&WinHint[8][12],"0.00");
	else
		NumToStr(Inv->dat,&WinHint[8][12],5);

//开票起始日期
	strcpy(&WinHint[9][1],"开票起始日期:");
	BcdToStr(4,&indat[29],&WinHint[9][14],0);

//开票截止时间
	strcpy(&WinHint[10][1],"开票截止时间:");
	BcdToStr(4,&indat[33],&WinHint[10][14],0);

	if(dts == 1 || dts == 0)		//显示
	{
		Windows(1,0,InitKey);
		return *InitKey;
	}
	if(dts == 2 || dts == 3)		//打印
	{
		if(dts == 3)
			PrintLine("指定时间段内的单卷发票使用汇总数据报表");
		else
			PrintLine("单卷发票使用汇总数据报表");
		for(i=0;i<11;i++)
			PrintStr(&WinHint[i][1]);//打印
		PrintLine("");
		PrintStr("电子存根");

		while(--delay);
	}
}
*/

/*--------------------------------------------------------------------------
											提示对话
'/':表示做为不延时,用法:在第个提示栏中只在带有'/'即不显示延时,但'/'后面的
	内容将不做显示
--------------------------------------------------------------------------*/
void ReHint(uchar *Dialog1,uchar *Dialog2)
{
	uchar code pic1[]={
	/*--  宽度x高度=24x24  --*/
	0x00,0x80,0xC0,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x67,0xF7,0xF7,0xF7,0x67,0x0F,0x1E,
	0x3C,0x78,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x07,0x0F,0x1F,0x3F,0x70,0xE0,0xC0,
	0x80,0x00,0x7E,0x7E,0x7E,0x00,0x80,0xC0,0xE0,0x70,0x3F,0x1F,0x0F,0x07,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x27,0x43,0x01,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
	};
	uchar i=0,Dialbuff[30];
	ulong val=0x2FFF;

	for(i=0;i<24;i++)
	{
		Dialbuff[i]=Dialog2[i];
	}

	LcdDisplay(8,72,"信  息",3);
	ShowPicture(0,30,24,54,pic1);//显示图标
	for(i=0;i<4;i+=3)
		DisplayFullRec(i,i,63-i,191-i,1);
	LcdDisplay(32,8,Dialog1,0);

	for(i=0;i<24;i++)
	{
		if(Dialbuff[i] == '/')
		{
			Dialbuff[i] = 0;
			LcdDisplay(48,8,Dialbuff,0);
			return;
		}
	}
	LcdDisplay(48,8,Dialog2,0);
	while(--val)
	{
		if(GetKey()!=0xFF)
		return;
	}
}
////////////////////////发票数据的显示与打印选择//////////////////////////
//    flag = 1:单卷发票使用汇总
//		flag = 2:发票打印数据
//		flag = 3:日交易数据
//		flag = 4:监控数据
//		flag = 5:申报备份数据
//		flag = 6:营业员销售额营业员的XZ报表查询
//		flag = 7:已分发的发票查询
//		flag = 8:已录入的发票查询
//		flag = 9:全部营业员的XZ报表
///////////////////////////////////////////////////////////////////////////

void InvDisAndPrint(uchar flag,uchar *dat,uchar xz,uchar *Number)
{
	uchar i = 0,k = 0;
	while(1)
	{

		i = ReSelectMode();
		switch(i)
		{
			case 1:
				switch(flag)
				{
					case 1:
					case 2:
					case 3:

⌨️ 快捷键说明

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