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

📄 sim.c

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 C
📖 第 1 页 / 共 5 页
字号:
			}
			else
				adr=InvoStatDat+gs*37;
			if(PwrFlg==1)
				PowerOffHint(" ","单卷发票汇总信息未记录!",0xAA);
			SerialFlashWrite(FlashDat,adr,37,str);		//写入单卷发票使用汇总数据
			tp.dat+=1;
			I2cWrite(InvoStatNum,2,tp.str);
			if(PwrFlg==1)
				PowerOffHint(" ","单卷发票汇总信息已记录!",0x55);
			//------------------------------------------------------------------
			PtintInvoTome(str);		//自动打印发票使用汇总数据报表.
		}
		#if DebugSim
		LcdDisplay(16,32,"本卷发票已经用完!",3);
		Hint(32,32,"请手工录入发票:",0);
		if(ImportInvoice()==1)return 1;
		else	return 2;
		#endif
	}
}

void WriteCheckDat()
{//核查级别为“01”时覆盖稽查卡原有数据;为“0xFF”时从原有数据后添加
	uchar i,k,m,dat[25];

	if(SimDetect(0x12)==0)return;	//等待并检测管理卡插入
	i=ManagementIdentify();
	if(i==0xFF)
	{
		SimDetect(0x02);
		return;
	}
	ReadBinary(0x81,0,10,2);
	m=RxdBuf[9];
	ReadDate();
	for(RxdNum=0;RxdNum<4;RxdNum++)dat[RxdNum]=InvoDate[RxdNum];
	I2cRead(TaxpayerNo,8,&dat[4]);
	I2cRead(MachineNo,8,&dat[12]);
	dat[20]=i;
	k=1;
	switch(i)
	{
		case 0:	k=CheckInvoiceDat(dat,m);		break;	//核查明细
		case 1:	k=CheckDailyDat(dat,m);			break;	//核查日交易数据
		case 2:	k=CheckDeclareDat(dat,m);		break;	//核查申报数据
		case 3:
				TimeSetup(2);
				LcdDisplay(16,0,"修改时间完成!",3);
				break;	//修改时钟
		default:LcdDisplay(16,0,"未定义的核查类别!",3);
				LcdDisplay(32,0,"无法进行核查!",0);
				k=0;
				break;
	}
	if(k==1)LcdDisplay(32,0,"操作成功!",1);
	SimDeactive(0);
	SimDetect(0x02);
}

uchar DeclareFlgQuery()
{
	uchar i,j,k,dat[8];
	uint statecode;

	I2cRead(FiscalCardNo,8,dat);			//读取税控卡编号
	RxdBuf[0]=0xEF;
	RxdBuf[1]=0x04;
	SelectFile(0x00,0x00,0x02,RxdBuf,1);
	j=1;k=0;
	while(1)
	{
		statecode=ReadRecord(0,j,0x04,220,1);
		if(statecode==0x6A83)
		{
			Hint(16,0,"未找到对应申报文件!",1);
			return 0xAA;
		}
		for(i=0;i<8;i++)
			if(RxdBuf[i+1] != dat[i])		//读出的第一字节是汇总标志
			{
				k=1;break;
			}
		if(k==0)break;
		else {j++;k=0;}
	}
	return RxdBuf[0];
}

uchar InvoiceCount()
{//查询剩余多少卷发票
	uchar i,j;
	uint k;
	gyt2 *fp;

	RxdBuf[0]=0xEF;
	RxdBuf[1]=0x05;
	SelectFile(0x00,0x00,0x02,RxdBuf,1);
	j=0;
	for(i=1;i<11;i++)
	{
		k=ReadRecord(1,i,0x04,20,1);
		if(k==0x6A83)return j;
		fp = &RxdBuf[18];
		j += (uchar)fp->dat;
	}
	return j;
}

uchar GetDistributeNum(uchar x,uchar y)
{
	uchar str1[]={"已分发 卷发票"};
	uchar str2[]={"剩余  卷发票可分发"};
	uchar k,tp[2];
	
	str1[6]=x+'0';
	str2[4]=(y/10)+ '0';
	str2[5]=(y%10)+ '0';
	LcdDisplay(0,0,str1,3);
	LcdDisplay(16,0,str2,0);
	LcdDisplay(48,0,"最多存储10卷发票数据",0);
	
	while(1)
	{
		LcdDisplay(32,0,"要分发的发票卷数:",1);
		tp[0]=0;
		k=GetInt(32,144,0,2,0,tp);
		if(tp[0]==K_TC)return 0;
		if(k!=0 && (k+x)<=10)break;
		Beep(400);
	}
	return k;
}

uchar DistributeMode()
{//检测卡是否插入
	uchar i,j;
	uchar x,k,str[4];

	if(SimDetect(0x11)==0)return 0;
	if(UserIdentify(1)!=1)
	{
		SimDetect(0x01);
		return 0;
	}	
	I2cRead(InvoiceNum,1,&i);
	if(i>=10)
	{
		LcdDisplay(16,0,"发票存储空间已满,",3);
		Hint(32,0,"不能再分发发票!",0);
		SimDetect(0x01);
		return 0;
	}
	j=InvoiceCount();
	if(j==0)
	{
		LcdDisplay(32,0,"发票已用完,请购买发票!",0);
		SimDetect(0x01);
		return 0;
	}
	
	while(1)
	{
		WindowsSet(3);
		strcpy(&WinHint[0][1],"1.分发最大数量发票");
		strcpy(&WinHint[1][1],"2.分发一卷发票");
		strcpy(&WinHint[2][1],"3.自定义分发的发票卷数");		
		str[0]=K_TC;
		str[1]=K_HJ;
		str[2]=0;
		k=Windows(1,0,str);
		if(str[0]==K_TC)return 0;
		if(k>0 && k<4)break;
		Beep(400);
	}
	switch(k)
	{
		case	1:	x=10-i;		break;
		case	2:	x=1;		break;
		case	3:	x=GetDistributeNum(i,j);
					if(x==0)return 0;
					break;
		default	 :	x=1;		break;
	}
	LcdDisplay(16,0,"开始分发......",3);
	for(i=0;i<x;i++)			//最多10卷发票
	{
		DistributeInvoice(i);
	}
	LcdDisplay(32,0,"分发完成!",0);
	SimDetect(0x01);
	return 1;
}

uchar ImportInvoice()
{
//	ulong begin,end;
	uchar i,flag,n,m,dat[230];
	uchar mcu[8],str[25],hstr[]={"发票录入成功!"};
	gyt4 *xp,*tp;
	uint adr;

	if(!FiscalIdentify(1))
	{
		LcdDisplay(16,48,"非本机税控卡,",3);
		Hint(32,48,"不能录入发票!",0);
		return 0;
	}
	I2cRead(InvoiceNo,8,mcu);
	xp=&mcu[0];
	tp=&mcu[4];
	if(tp->dat!=0)
	{
		if(tp->dat>=xp->dat)
		{
			LcdDisplay(16,32,"本卷发票未用完,",3);
			Hint(32,32,"不能录入发票!",0);
			return 0;
		}
	}

	I2cRead(InvoiceNum,1,dat);
	n=dat[0];
	if(n==0)
	{
		LcdDisplay(16,0,"没有已分发的发票数据,",3);
		Hint(32,0,"请先分发发票!",0);
		return 0;
	}
	else
	{
		i=0;flag=0;
		while(1)
		{
			adr=i*22+InvoCode;
			I2cRead(adr,22,dat);
			xp=&dat[10];
			tp=&dat[14];
			strcpy(str,"第  卷发票代码:");
			if(i<9)str[2]=i+'1';
			else
			{
				str[2]='1';
				str[3]='0';
			}
			LcdDisplay(0,0,str,3);
			BcdToStr(10,dat,str,0);
			LcdDisplay(16,0,str,0);
			strcpy(str,"发票起始号:");
			NumToStr(xp->dat,&str[11],0);
			LcdDisplay(32,0,str,0);
			strcpy(str,"发票终止号:");
			NumToStr(tp->dat,&str[11],0);
			LcdDisplay(48,0,str,0);
			while(1)
			{
				m=KeyScan();
				if(m==K_TC)return 0;
				if(m==K_HJ)
				{
					flag=1;
					break;
				}
				if(m==K_DOWN || m==K_RIGHT)
				{
					if(i<(n-1))i++;
					else	i=0;
					break;
				}
				if(m==K_UP || m==K_LEFT)
				{
					if(i>0)i--;
					else   i=n-1;
					break;
				}
				Beep(200);
			}
			if(flag==1)break;
		}
		if(InputInvoice(dat)==0)
		{
			Hint(32,16,"录入不成功!",3);
			return 0;
		}
		n-=1;
		adr+=22;
		m=(n-i)*22;
		I2cRead(adr,m,dat);
		adr-=22;
		I2cWrite(adr,m,dat);
		dat[0]=n;
		I2cWrite(InvoiceNum,1,dat);
		if(PwrFlg==1)
			PowerOffHint(" ",hstr,0x55);
		Hint(16,16,hstr,3);
		return 1;
	}
}

void FirstIni()
{//初始化所有的计数器、变量
	uint i,j;
	uchar str[20]={__DATE__};
	uchar dat[]=__TIME__;
	gyt2 tp;

//	#if FlashInvoM25P80
//	SerialFlashBulkErase(FlashInvo);
//	#else
//	for(i=0;i<16;i++)SerialFlashSectorErase(FlashInvo,i);
//	#endif
//	#if FlashDatM25P80
//	for(i=0;i<8;i++)SerialFlashSectorErase(FlashDat,i);
//	#endif

	for(i=0;i<256;i++)RxdBuf[i]=0;
	I2cWrite(48,208,RxdBuf);		//机器出厂数据48字节不能清零
	for(i=0,j=256;i<3;i++,j+=256)
		I2cWrite(j,256,RxdBuf);

	tp.dat=100;
	//PLU和项目数量应该在商品信息下载时写入,不能清零
	I2cWrite(PluNumber,2,tp.str);
	tp.str[0]=50;
	I2cWrite(ItemNumber,1,tp.str);
	InvoDate[0]=0x20;
	InvoDate[1]=0x05;
	InvoDate[2]=0x03;
	InvoDate[3]=0x10;
	I2cWrite(MachineTime,4,InvoDate);

	I2cWrite(HardwareVer,18,"GS800 Version 1.00");
	str[11]=' ';
	strcpy(&str[12],dat);
	str[17]=0;
	I2cWrite(SoftwareVer,18,str);
}

uchar TerminateTime(uchar *time)
{
	uchar dat[10],str[2];
	gyt4 *fp,hp;
	
	str[1]=0;
	while(1)
	{
		LcdDisplay(16,0,"截止日期:",1);
		memset(dat,0,sizeof(dat));
		str[0]=0;
		if(GetBcd(16,72,dat,8,str)==K_TC)return 0;
		if(Verdict(dat)!=1)	//检查日期合法性
		{
			LcdDisplay(32,0,"输入时间格式错误!",1);
			continue;
		}
		fp=&dat[0];					//截止日期
		hp.dat=fp->dat;
		ReadDate();
		fp=&InvoDate[0];
		if(hp.dat>=fp->dat)
		{//截止日期必须小于当天日期,因为当天的日交易签名还没有做
			Hint(16,0,"截止日期 < 当天日期",3);
			continue;
		}
		I2cRead(Declare,4,hp.str);
		fp=&dat[0];
		if(hp.dat>fp->dat)
		{//报税时申报数据起始日期必须不大于截止日期
			Hint(16,0,"起始日期 <= 截止日期",3);
			continue;
		}
		break;
	}
	strcpy(time,dat);
	return 1;
}

void TaxManage()
{
	uchar i,x,str[4],dat[25],hstr[]={"注册成功!"};
	gyt4 *xp;

	x=1;
	while(1)
	{
		WindowsSet(8);
		strcpy(&WinHint[0][1],"1.税控机初始化");
		strcpy(&WinHint[1][1],"2.分发发票");
		strcpy(&WinHint[2][1],"3.录入发票");
		strcpy(&WinHint[3][1],"4.报税");
		strcpy(&WinHint[4][1],"5.完税");
		strcpy(&WinHint[5][1],"6.税务数据核查");
		strcpy(&WinHint[6][1],"7.发票验旧");
		strcpy(&WinHint[7][1],"8.串行数据通讯");

		str[0]=K_TC;
		str[1]=K_HJ;
		str[2]=0;
		x=Windows(x,0,str);
		if(str[0]==K_TC)return;
		#if DebugSim
		switch(x)
		{
			case 	1:	if(!FiscalIdentify(0))
						{
							LcdDisplay(48,0,"按任意键继续!",0);
							KeyScan();
							break;
						}
						if(SimDetect(0x11)==0)break;	//等待并检测用户卡插入
						if(UserIdentify(0)==1)
						{
							LcdDisplay(0,0,"开始初始化......",3);
							if(PwrFlg!=0)
								PowerOffHint(" ","初始化未完成!",0xAA);
							FirstIni();
							LcdDisplay(16,0,"开始注册......",0);
							if(PwrFlg!=0)
								PowerOffHint(" ","注册未完成!",0xAA);
							FiscalCashRegisterIni();
							if(PwrFlg!=0)
								PowerOffHint(" ",hstr,0x55);
							LcdDisplay(32,0,hstr,3);
						}
						SimDeactive(0);
						SimDetect(0x01);
						break;

			case 	2:  DistributeMode();
						break;
			case 	3:	ImportInvoice();
						break;
			
			case 	4:
						if(!FiscalIdentify(1))
						{
							LcdDisplay(48,0,"按任意键继续!",0);
							KeyScan();
							break;
						}
						if(SimDetect(0x11)==0)break;	//等待并检测用户卡插入
						if(UserIdentify(1)==1)
						{
							i=DeclareFlgQuery();
							if(i==0xAA)break;
							if(i==0 || i==0xFF)
							{
								I2cRead(DeclareFlg,1,dat);
								if(dat[0]==0)//正常报税要求输入截止日期						
								{
									if(TerminateTime(dat)==0)break;
									i=0;							
								}
								else		//补发的用户卡报税,不要求输入截止日期
								{
									i=1;
								}
								LcdDisplay(16,0,"开始报税......",1);
								if(PwrFlg!=0)
									PowerOffHint(" ","报税未完成!",0xAA);
								xp = &dat[0];
								DeclareDuty(xp->dat,i);
								if(PwrFlg!=0)
									PowerOffHint(" ","报税已完成!",0x55);
								LcdDisplay(32,0,"报税成功!",0);
							}
							else
								LcdDisplay(16,0,"没有完税,不能报税!",0);
						}
						SimDeactive(0);
						SimDetect(0x01);
						break;
			case 	5:
						if(!FiscalIdentify(1))
						{
							LcdDisplay(48,0,"按任意键继续!",0);
							KeyScan();
							break;
						}
						if(SimDetect(0x11)==0)break;	//等待并检测用户卡插入
						I2cRead(DeclareFlg,1,dat);
						if(UserIdentify(1)==1)
						{
							i=DeclareFlgQuery();		//返写监控数据后汇总标志被清零
							if(i==0xAA)break;
							if((i==0 || i==0xFF) && dat[0]==1)
							{
								LcdDisplay(16,0,"开始回传监控数据......",3);
								if(PwrFlg==1)
									PowerOffHint(" ","回传监控数据未完成!",0xAA);
								UpdateControls();
								if(PwrFlg!=0)
										PowerOffHint(" ","回传监控数据已完成!",0x55);
								LcdDisplay(32,0,"回传监控数据成功!",0);								
							}
							else
								LcdDisplay(16,0,"没有报税,不能完税!",0);
						}
						SimDeactive(0);
						SimDetect(0x01);
						break;

			case 	6:	WriteCheckDat();
						break;

			case 	7:  InvoTomeWrite();	break;

			case 	8:  TaxCom();
						break;

			default	:	Beep(400);	break;
		}
		#endif
	}
}

uint CRC16( uchar * aData, uint aSize )
{
	uint code Table_CRC16[]={
	0x0000,0x8005,0x800F,0x000A,0x801B,0x001E,0x0014,0x8011,
	0x8033,0x0036,0x003C,0x8039,0x0028,0x802D,0x8027,0x0022,
	0x8063,0x0066,0x006C,0x8069,0x0078,0x807D,0x8077,0x0072,
	0x0050,0x8055,0x805F,0x005A,0x804B,0x004E,0x0044,0x8041,
	0x80C3,0x00C6,0x00CC,0x80C9,0x00D8,0x80DD,0x80D7,0x00D2,
	0x00F0,0x80F5,0x80FF,0x00FA,0x80EB,0x00EE,0x00E4,0x80E1,
	0x00A0,0x80A5,0x80AF,0x00AA,0x80BB,0x00BE,0x00B4,0x80B1,
	0x8093,0x0096,0x009C,0x8099,0x0088,0x808D,0x8087,0x0082,
	0x8183,0x0186,0x018C,0x8189,0x0198,0x819D,0x8197,0x0192,
	0x01B0,0x81B5,0x81BF,0x01BA,0x81AB,0x01AE,0x01A4,0x81A1,
	0x01E0,0x81E5,0x81EF,0x01EA,0x81FB,0x01FE,0x01F4,0x81F1,
	0x81D3,0x01D6,0x01DC,0x81D9,0x01C8,0x81CD,0x81C7,0x01C2,
	0x0140,0x8145,0x814F,0x014A,0x815B,0x015E,0x0154,0x8151,
	0x8173,0x0176,0x017C,0x8179,0x0168,0x816D,0x8167,0x0162,
	0x8123,0x0126,0x012C,0x8129,0x0138,0x813D,0x8137,0x0132,
	0x0110,0x8115,0x811F,0x011A,0x810B,0x010E,0x0104,0x8101,
	0x8303,0x0306,0x030C,0x8309,0x0318,0x831D,0x8317,0x0312,
	0x0330,0x8335,0x833F,0x033A,0x832B,0x032E,0x0324,0x8321,
	0x0360,0x8365,0x836F,0x036A,0x837B,0x037E,0x0374,0x8371,
	0x8353,0x0356,0x035C,0x8359,0x0348,0x834D,0x8347,0x0342,
	0x03C0,0x83C5,0x83CF,0x03CA,0x83DB,0x03DE,0x03D4,0x83D1,
	0x83F3,0x03F6,0x03FC,0x83F9,0x03E8,0x83ED,0x83E7,0x03E2,
	0x83A3,0x03A6,0x03AC,0x83A9,0x03B8,0x83BD,0x83B7,0x03B2,
	0x0390,0x8395,0x839F,0x039A,0x838B,0x038E,0x0384,0x8381,
	0x0280,0x8285,0x828F,0x028A,0x829B,0x029E,0x0294,0x8291,
	0x82B3,

⌨️ 快捷键说明

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