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

📄 sim.c

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 C
📖 第 1 页 / 共 5 页
字号:
	k=0;
	for(i=0;i<8;i++)
	{
		k ^= RxdBuf[i];
		TxdBuf[5+i] = RxdBuf[i];
	}
	for(i=0;i<70;i++)
	{
		k ^= dat[i];
		TxdBuf[13+i] = dat[i];
	}
	for(i=0;i<0x8D;i++)
	{
		k ^= tp[i];
		TxdBuf[83+i] = tp[i];
	}
	TxdBuf[224]=k;

	if(P33==0)
	{
		ErrorHint("未检测到用户卡!",136);
	}

	statecode=SimCmd(225,1);		//向用户卡发送
	if(statecode != 0x9000)
	{
		if(statecode==0x9303)AppBlockHint(1,1);
		ErrorHint("用户卡数据汇总出错!",statecode);
	}
	if(mode==0)
	{//正常报税处理申报备份数据,补发用户卡报税不处理
		for(i=0;i<83;i++)tp[i]=TxdBuf[i+13];
		//-----------------------------------------------------------------------------
		//更新申报数据缓冲区
		for(i=0;i<70;i++)dat[i]=0;
		I2cWrite(DecAddUp,8,dat);	//清零一个报税周期内的销售累计金额、退票累计金额
		//更新申报数据起始日期
		xp=&dat[0];
		xp->dat = CalculateTime(time,1);		//按输入截止日期统计报税数据
		I2cWrite(Declare,70,dat);
		//------------------------------------------------------------------------------
		//将申报备份数据存放在24C64中
		I2cRead(DeclareNum,1,dat);
		if(dat[0]>60)dat[0]=0;
		adr=DeclareBak+dat[0]*83;
		I2cWrite(adr,83,tp);
		dat[0]+=1;
		I2cWrite(DeclareNum,1,dat);
		//------------------------------------------------------------------------------
		//将报税当天销售累计金额、退票累计金额写入报税周期内的销售累计金额、退票累计金额
		I2cRead(IntradaySortSum,48,dat);
		wc=0;
		time=0;
		for(i=0;i<6;i++)
		{
			xp=&dat[i*4];
			fp=&dat[i*4+24];
			wc+=xp->dat;			//正常发票金额
			time+=fp->dat;			//退票金额
		}
		xp=&dat[0];
		xp->dat=wc;
		xp=&dat[4];
		xp->dat=time;
		I2cWrite(DecAddUp,8,dat);	
		//----------------------------------------------------------------------------------
		i=1;
		I2cWrite(DeclareFlg,1,&i);	//更新报税标志
	}
}

uchar FindRecordNumber(uchar mode)
{//确定应该从第几个记录文件开始写
 //核查级别为“01”时覆盖稽查卡原有数据;为“0xFF”时从原有数据后添加
	uchar x;
	gyt4 *xp;
	uint k;

	if(mode==1)return 1;		
	RxdBuf[0]=0xEF;
	RxdBuf[1]=0x03;
	SelectFile(0x00,0x00,0x02,RxdBuf,2);
	x=1;
	while(1)
	{
		k=ReadRecord(0,x,0x04,0xE9,2);
		if(k==0x6A83 || x==255)
		{
			LcdDisplay(16,0,"管理卡已经写满!",3);
			Hint(32,0,"请更换管理卡",0);
			return 0;
		}
		xp=&RxdBuf[0];		//判断时间是否为空		
//		if(xp->dat==0xFFFFFFFF)break;
		if(xp->dat==0)break;		
		else x++;
	}
	return x;
}

uchar SelectTomeFile()
{
	uchar i,j,x,dat[10];
	
	if(UserIdentify(1)!=1)
		return 0;
	I2cRead(MachineNo,8,dat);
	RxdBuf[0]=0xEF;
	RxdBuf[1]=0x06;
	SelectFile(0x00,0x00,0x02,RxdBuf,1);
	j=1;x=0;
	while(1)
	{
		i=ReadRecord(0,j,0x04,18,1);		//参数必须是0x04
		if(i!=1)return 0;
		for(i=0;i<8;i++)
			if(dat[i]!=RxdBuf[i])x=1;
		if(x==0)break;
		else	{x=0;j++;}
	}
	//获得发票使用信息文件标识符
	SelectFile(0x00,0x00,0x02,&RxdBuf[16],1);
	return 1;
}

uchar InsteadCardHint(uchar x,uchar mode)
{//提示本卡已写满,需要换卡,继续操作
	uchar i,k;
	
	LcdDisplay(16,0,"卡已写满,请换卡!",3);
//	Hint(16,0,"卡已写满,请换卡!",3);
	while(1)
	{
		SimDetect(x & 0x0F);
		SimDetect(x);	//等待并检测SIM卡插入
		if(x==0x12)
		{
			k=ManagementIdentify();
			if(k==mode)
			{
				ReadBinary(0x81,0,10,2);
				i=FindRecordNumber(RxdBuf[9]);
				if(i!=0)break;
			}
			else 
			{
				if(k!=0xFF)Hint(16,0,"核查类别不一致,请换卡!",3);
			}
		}
		else
		{//检测用户卡是否合法
			//200卷单卷发票使用数据存储空间
			if(SelectTomeFile()!=0)break;
		}
	}
	LcdDisplay(16,0,"开始写入数据......",3);
	return i;
}

uchar GetTime(uchar *dat,uchar len,uchar *begintime,uchar *endtime)
{
	uchar str[16],temp[2];
	gyt4 *xp,*fp;

	LcdDisplay(0,0,dat,3);
	while(1)
	{
		LcdDisplay(16,0,"起始日期:",1);
		memset(str,0,sizeof(str));
		temp[0]=0;
		if(GetBcd(16,72,str,len,temp)==K_TC)return 0;
		if(len==6)str[3]=0x01;
		if(Verdict(str)==1)
		{//检查日期合法性
			xp=str;
			fp=begintime;
			fp->dat=xp->dat;
			break;
		}
		else	LcdDisplay(32,0,"输入时间格式错误!",1);
	}
	while(1)
	{
		LcdDisplay(32,0,"终止日期:",1);
		temp[0]=0;
		memset(str,0,sizeof(str));
		if(GetBcd(32,72,str,len,temp)==K_TC)return 0;
		if(len==6)str[3]=0x27;
		if(Verdict(str)==1)
		{//检查日期合法性
			if(len==6)str[3]=0x32;	//强制将日设置为32号,方便比较
			xp=str;
			fp=endtime;
			fp->dat=xp->dat;
			break;
		}
		else	LcdDisplay(48,0,"输入时间格式错误!",1);
	}
	return 1;
}

uchar CheckDeclareDat(uchar *dat,uchar mode)
{//申报数据核查
	uchar i,j,m,tp[1],str[240];
	uint adr,k;
	gyt4 tm1,tm2;
	gyt4 *xp,*fp;
	//注意:时间格式和其它不一样,只有"年 月"
	I2cRead(DeclareNum,1,tp);
	if(tp[0]==0)
	{
		LcdDisplay(16,0,"目前没有申报数据!",3);
		return 0;
	}
	i=GetTime("申报数据核查:(年月)",6,tm1.str,tm2.str);
	if(i==0)return 0;
	LcdDisplay(0,0,"开始查找对应数据......",3);
	adr=DeclareBak;
	m=22;str[21]=0;
	I2cRead(adr,83,&str[m]);
	xp=&str[m];
	if(xp->dat>tm2.dat)
	{
		LcdDisplay(16,0,"没有对应时间段的数据!",1);
		return 0;
	}
	for(j=0;j<21;j++)str[j]=dat[j];
	for(j=188;j<233;j++)str[j]=0;
	j=FindRecordNumber(mode);
	if(j==0)return 0;
	if(PwrFlg!=0)
		PowerOffHint(" ","申报数据核查未完成!",0xAA);
	for(i=0;i<tp[0];i++)
	{
		I2cRead(adr,83,&str[m]);
		xp=&str[m];fp=&str[m+4];
		if(tm1.dat<=xp->dat && fp->dat<=tm2.dat)
		{
			str[21]+=1;
			if(str[21]>=2)
			{
				UpdateRecord(j,233,str,2);		//向管理卡发送
				j++;k=1;
				if(j<255)
				{
					k=ReadRecord(0,j,0x04,0xE9,2);
				}
				if(j==255 || k==0x6A83)
				{
					j=InsteadCardHint(0x12,2);
				}
				m=22;
				str[21]=0;
			}
			else m+=83;
		}
		adr+=83;
	}
	if(str[21]!=0)
	{
		for(i=105;i<233;i++)str[i]=0;
		UpdateRecord(j,233,str,1);		//向管理卡发送
	}
	if(PwrFlg!=0)
		PowerOffHint(" ","申报数据核查已完成!",0x55);
	return 1;
}

uchar CheckDailyDat(uchar *dat,uchar mode)
{//起始日期手工输入:年、月、日
	uchar j,m,str[240];
	uint i,k;
	ulong adr;
	gyt2 fp;
	gyt4 *xp,tm1,tm2;

	I2cRead(DailyDatNum,2,fp.str);
	if(fp.dat==0)
	{
		LcdDisplay(16,0,"目前没有日交易数据!",3);
		return 0;
	}
	i=GetTime("日交易数据核查:(年月日)",8,tm1.str,tm2.str);
	if(i==0)return 0;
	LcdDisplay(0,0,"开始查找对应数据......",3);
	for(j=0;j<21;j++)str[j]=dat[j];
	for(j=213;j<233;j++)str[j]=0;

	m=21;
	adr=DailyTradeDat;
	SerialFlashRead(FlashDat,adr,192,&str[m]);
	xp=&str[m];
	if(xp->dat>tm2.dat)
	{
		LcdDisplay(16,0,"没有对应时间段的数据!",3);
		return 0;
	}
	j=FindRecordNumber(mode);
	if(j==0)return 0;
	if(PwrFlg!=0)
		PowerOffHint(" ","日交易数据核查未完成!",0xAA);
	for(i=0;i<fp.dat;i++)
	{
		SerialFlashRead(FlashDat,adr,192,&str[m]);
		xp=&str[m];
		if(tm1.dat<=xp->dat && xp->dat<=tm2.dat)
		{
			UpdateRecord(j,233,str,2);		//向管理卡发送
			j++;k=1;
			if(j<255)
			{
				k=ReadRecord(0,j,0x04,0xE9,2);
			}
			if(j==255 || k==0x6A83)
			{
				j=InsteadCardHint(0x12,1);
			}
		}
		adr+=192;
	}
	if(PwrFlg!=0)
		PowerOffHint(" ","日交易数据核查已完成!",0x55);
	return 1;
}

uchar CheckInvoiceDat(uchar *dat,uchar mode)
{//发票明细核查:起始日期手工输入:年、月、日;发票号码也手工输入
	uchar i,j,k,m,w,str[240],temp[2];
	uint v,u;
	ulong adr,x;
	gyt4 *xp,tm1,tm2;
	gyt2 fp;

	I2cRead(InvoPrintNum,2,fp.str);
	if(fp.dat==0)
	{
		LcdDisplay(16,0,"目前没有发票明细数据!",3);
		return 0;
	}
	LcdDisplay(0,0,"发票明细核查:(年月日)",3);
	while(1)
	{
		LcdDisplay(16,0,"1.按起始日期核查",0);
		LcdDisplay(32,0,"2.按发票号码核查",0);
		k=KeyScan();
		if(k==K_TC)return 0;
		if(k==K_1)
		{
			j=GetTime("按起始日期核查:(年月日)",8,tm1.str,tm2.str);
			if(j==0)return 0;
			LcdDisplay(0,0,"开始查找对应数据......",3);
			for(j=0;j<21;j++)str[j]=dat[j];
			for(k=211;k<233;k++)str[k]=0;
			adr=InvoPrintDat;
			m=22;
			SerialFlashRead(FlashInvo,adr,27,&str[m]);
			xp=&str[m];
			if(xp->dat>tm2.dat)
			{
				LcdDisplay(16,0,"没有对应时间段的数据!",3);
				return 0;
			}
			w=FindRecordNumber(mode);
			if(w==0)return 0;
			if(PwrFlg!=0)
				PowerOffHint(" ","发票明细核查未完成!",0xAA);
			for(v=0,j=0;v<fp.dat;v++)
			{
				SerialFlashRead(FlashInvo,adr,27,&str[m]);				
				xp=&str[m];
				if(tm1.dat<=xp->dat && xp->dat<=tm2.dat)
				{
					xp=&str[m+4];	//交换发票号和开票类型的存储位置
					x=xp->dat;
					i=str[m+8];
					xp=&str[m+5];
					xp->dat=x;
					str[m+4]=i;
					
					j++;
					if(j>=7)
					{
						str[21]=7;
						UpdateRecord(w,233,str,2);				
						w++;u=1;
						if(w<255)
						{
							u=ReadRecord(0,w,0x04,0xE9,2);
						}
						if(w==255 || u==0x6A83)
						{
							w=InsteadCardHint(0x12,0);
						}
						j=0;m=22;
					}
					else m+=27;
				}
				adr+=27;
			}
			if(j!=0)
			{
				str[21]=j;
				for(k=m;k<233;k++)str[k]=0;
				UpdateRecord(w,233,str,2);		//向管理卡发送
			}
			if(PwrFlg!=0)
				PowerOffHint(" ","发票明细核查已完成!",0x55);
			return 1;
		}
		if(k==K_2)
		{
			for(j=0;j<21;j++)str[j]=dat[j];
			for(k=48;k<233;k++)str[k]=0;
			adr=InvoPrintDat;
			str[21]=1;
			LcdDisplay(16,0,"请输入发票号:",1);
			LcdDisplay(32,0,"  ",1);
			while(1)
			{
				temp[0]=0;
				tm1.dat=GetInt(32,32,0,14,0,temp);
				if(temp[0] == K_TC)return 0;
				if(tm1.dat!=0 && temp[0] == K_HJ)break;
			}
			LcdDisplay(0,0,"开始查找对应数据......",3);
			j=FindRecordNumber(mode);
			if(j==0)return 0;
			if(PwrFlg!=0)
				PowerOffHint(" ","发票明细核查未完成!",0xAA);
			for(v=0;v<fp.dat;v++)
			{
				SerialFlashRead(FlashInvo,adr,27,&str[22]);
				xp=&str[26];
				if(tm1.dat==xp->dat)
				{
					xp=&str[m+4];	//交换发票号和开票类型的存储位置
					x=xp->dat;
					i=str[m+8];					
					xp=&str[m+5];
					xp->dat=x;
					str[m+4]=i;
					
					UpdateRecord(j,233,str,2);
					if(PwrFlg!=0)
						PowerOffHint(" ","发票明细核查已完成!",0x55);
					return 1;
				}
				adr+=27;
			}
			LcdDisplay(16,0,"没有对应的数据!",3);
			return 0;
		}
		Beep(500);
	}
}

void InvoTomeWrite()
{//单卷发票使用汇总信息写入用户卡
	uchar i,dat[40];
	gyt2 xp;
	uint m;
	ulong adr;	

	if(SimDetect(0x11)==0)
	{
		SimDetect(0x01);
		return;
	}
	if(SelectTomeFile()==0)return;
	//----------------------------------------------------------------------------------
	dat[0]=0x12;
	dat[1]=0x34;
	dat[2]=0x56;
	dat[3]=0x78;
	VerifyPin(0,4,dat,2);		//效验用户卡PIN,PIN需要手工输入吗?
	//-----------------------------------------------------------------------------------
	i=1;
	//-------------------------------------------------------------------------------------------
	//每台机器对应一个发票使用信息文件,所以写入单卷发票时覆盖原有数据
 	//应该将本次报税周期内使用的发票数据写入,最好在自定义命令中加上时间段
//	while(1)
//	{//确定应该从第几个记录文件开始写
//		j=ReadRecord(0,i,0x04,0x25,2);
//		if(j==0x6A83 || i==200)
//		{
//			LcdDisplay(16,0,"用户卡已经写满!",3);
//			Hint(32,0,"请更换用户卡",0);
//			return;
//		}
//		tp=&RxdBuf[14];		//判断发票是否为0
//		if(tp->dat!=0 && tp->dat!=0xFFFFFFFF)i++;
//		else break;
//	}
	//-------------------------------------------------------------------------------------------
	I2cRead(InvoStatNum,2,xp.str);
	adr=InvoStatBegin;
	if(PwrFlg!=0)
		PowerOffHint(" ","单卷发票汇总信息未写入!",0xAA);
	for(m=0;m<xp.dat;m++)
	{
		SerialFlashRead(FlashDat,adr,37,dat);
		UpdateRecord(i,37,dat,1);
		if(i>=200)
		{//提示本卡已写满,需要换卡,继续操作
			InsteadCardHint(0x11,0);
			i=1;
		}
		adr+=37;
		i++;
	}
	if(PwrFlg!=0)
		PowerOffHint(" ","单卷发票汇总信息已写入!",0x55);
	LcdDisplay(32,0,"操作成功!",0);
	SimDetect(0x01);
}

uchar InvoiceCheck(uchar x)
{
	uchar i,dat[11],str[40];
	gyt4 *xp,*fp;
	gyt2 tp;
	ulong adr,gs;

	I2cRead(InvoiceNo,8,dat);
	xp=&dat[0];
	fp=&dat[4];
	if(xp->dat==0)return 2;
	if(xp->dat<=fp->dat)return 1;
	else
	{//本卷发票已经用完
		if(x==1)
		{//单卷发票使用汇总数据处理-----------------------------------------
			ReadBinary(0x85,0,19,0);
			for(i=0;i<18;i++)str[i]=RxdBuf[i+1];	//第一个字节是发票有无标志
			I2cRead(TomeNum1,15,&str[18]);

			xp=&InvoDate[0];
			fp=&str[33];
			fp->dat=xp->dat;		//开票截止时间

			I2cRead(InvoStatNum,2,tp.str);
			gs = tp.dat;
			if(gs>1771)
			{
				adr=InvoStatDat;
				tp.dat=0;
				#if FlashDatM25P80
				SerialFlashSectorErase(FlashDat,0);
				#endif

⌨️ 快捷键说明

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