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

📄 sale.bak

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 BAK
📖 第 1 页 / 共 4 页
字号:
			break;
		}
//		if(k == K_DZ || k == K_JF)
//		{
//			if(k == K_DZ)k=0;
//			if(k == K_JF)k=1;
//			AmendPrice(k,1,WareTotalPrice);
//			k=0;
//			continue;
//		}
		if(k == K_HJ)
		{
			NumToStr(WareTotalPrice,&WinHint[2][6],1);
			LcdDisplay(32,0,&WinHint[2][1],1);		//显示现金
			LcdDisplay(48,0,"找钱:0",1);			//显示找钱
			VfdShowPrice(0);	//VFD显示找钱
			break;
		}
		Beep(400);
		k=0xF0;
	}
	if(FiscalIdentify(1)!=1)
	{
		LcdDisplay(48,0,"按任意键继续!",0);
		KeyScan();
		return 0;
	}
	DataDispose();
	k=SaleEnd();
	SimDeactive(0);
	return k;
}

void GetPlu(uchar n)
{//条形码如何处理
	gyt2 tp;//xp;
	uchar str[25],temp[2];

	I2cRead(PluNumber,2,tp.str);
	memset(str,0,sizeof(str));
	strcpy(str,"PLU最大编号为:");
	NumToStr(tp.dat,&str[14],0);
	LcdDisplay(32,0,"PLU:",n);
	if(n==3)LcdDisplay(16,0,"请输入商品编号:",0);
	while(1)
	{
		temp[0]=0;
		WareNo=GetInt(32,32,0,5,0,temp);
		if(temp[0] == K_TC){WareNo=0;return;}
		if(WareNo>0 && WareNo<=tp.dat)break;
		if(WareNo==0)
			LcdDisplay(48,0,"PLU编号不能为0!",1);
		if(WareNo>tp.dat)
			LcdDisplay(48,0,str,1);
		LcdDisplay(32,0,"PLU:",1);
	}
}

uchar VerifyBossPwd()
{//管理员密码验证
	ulong pwd;
	gyt4 hp;
	uchar tp[2]={0,0};

	I2cRead(BossPwd,4,hp.str);
	while(1)
	{
		LcdDisplay(16,0,"管理员密码:",3);
		tp[0]=0;
		pwd=GetInt(16,88,0,18,1,tp);
		if(tp[0]==K_TC)return 0;
		if(pwd==hp.dat)return 1;
		Hint(48,0,"密码错误,请重新输入!",0);
		Beep(400);
	}
}

uchar InvalidatedTicket(ulong no)
{
	uchar num,i;
	uint adr;
	gyt4 tp;

	I2cRead(UntreadNum,1,&num);
	for(i=0;i<num;i++)
	{
		adr = i*4 + UntreadAdr;
		I2cRead(adr,4,tp.str);
		if(no==tp.dat)
			return 1;
	}
	return 0;
}

uchar UntreadCheck(ulong x)
{//已经退票和废票的发票不能再做退票处理,发票打印数据中没有分税率统计金额,无法自动退票
	uchar str[27];
	uint i;
	ulong adr;
	gyt4 *xp,*tp;
	gyt2 num;

	adr=4+InvoPrintDat;
	I2cRead(InvoPrintNum,2,num.str);
	xp=&str[0];
	tp=&str[17];
	for(i=0;i<num.dat;i++)
	{
		SerialFlashRead(FlashInvo,adr,21,str);
		if(str[4]!=1)
		{
			if(xp->dat==x)return 3;		//已经作废
			if(tp->dat==x)return 2;		//已经退过
		}
		adr += 27;
	}
	return 1;
}

uchar BlankOutInvoice()
{
	uchar k,i,str[50],fiscalcode[10];
	gyt4 *fp,*wp;
	gyt2 xp,hp;
	uint adr;	
	ulong fpadr,gs;

	if(DailyDatCheck()==0)return 0;
	if(DeadlineCheck()==0)return 0;
	if(InvoiceFlg!=1)
	{
		Beep(400);
		return 0;
	}
	if(VerifyBossPwd()==0)return 0;
	if(FiscalIdentify(1)!=1)
	{
		LcdDisplay(48,0,"按任意键继续!",0);
		KeyScan();
		return 0;
	}
	memset(str,0,sizeof(str));
	WindowsSet(2);

	strcpy(&WinHint[0][1],"1.退票");
	strcpy(&WinHint[1][1],"2.废票");
	str[0]=K_HJ;
	str[1]=K_TC;
	str[2]=0;
	while(1)
	{
		k=Windows(1,0,str);
		if(str[0]==K_TC)return 0;
		if(k==1 || k==2)break;
	}
	if(k==1)
	{
		InvoiceFlg=2;
		LcdDisplay(0,0,"退货发票的发票号:",3);
		LcdDisplay(48,32,"(退货状态)",1);
		while(1)
		{
			LcdDisplay(16,0,"->",1);
			str[0]=0;
			UntreadCode.dat=GetInt(16,16,0,9,0,str);
			if(str[0]==K_TC)
			{
				InvoiceFlg=1;
				return 0;
			}
			if(UntreadCode.dat==0)continue;
			i=UntreadCheck(UntreadCode.dat);
			if(i==1)break;
			if(i==2)LcdDisplay(32,0,"本发票已经做过退票处理!",1);
			else	LcdDisplay(32,0,"本发票已经作废!",1);
		}
		//---------------------------------------------------------------
		//在发票存储器中查找对应数据,找到就自动开票,否则要求手动输入
		//发票打印数据中没有分类金额,如何处理?
//		LcdDisplay(0,0,"查找对应的发票明细...",3);
//		fpadr=InvoPrintDat;
//		I2cRead(InvoPrintNum,2,hp.str);
//		for(num=0;num<hp.dat;num++)
//		{
//			SerialFlashRead(FlashInvo,fpadr,27,str);
//			fp=&str[4];				//发票号
//			if(fp->dat==UntreadCode.dat && str[8]==1)
//			{//正常发票才能退
//				wp=&str[9];
//				WareTotalPrice=wp->dat;
//				n=WareTotalPrice;
//				m=WareTotalPrice/6;
//				for(i=0;i<6;i++)
//				{
//					wp=&WareClassStat[i*5+1];
//					if(i<5)
//					{//暂定退票金额平均分配给每种税率
//						wp->dat=m;
//						n-=m;
//					}
//					else wp->dat=n;
//				}
//				if(PwrFlg!=0)while(1);
//				DataDispose();
//				if(SaleEnd()==0)return 2;
//				LcdDisplay(16,0,"找到对应的发票明细",0);
//				Hint(32,0,"已经将发票做退票处理!",0);
//				return 1;
//			}
//			else	fpadr+=27;
//		}
		//---------------------------------------------------------------
//		LcdDisplay(16,0,"没有存储对应数据",0);
		Hint(32,0,"请输入退货发票明细:",0);
		return 1;
	}
	else
	{
		#if DebugSim
		AutoDailySign();		
		#endif
		I2cRead(InvoiceNo,8,fiscalcode);
		wp=&fiscalcode[0];
		fp=&fiscalcode[4];
		CurInvoNo=wp->dat;
		while(1)
		{
			LcdDisplay(0,0,"作废发票的发票号:",3);
			while(1)
			{
				LcdDisplay(16,0,"->",1);
				str[0]=0;
				UntreadCode.dat=GetInt(16,16,0,9,0,str);
				if(str[0]==K_TC)return 0;
				if(UntreadCode.dat!=0)break;
			}
			//判断发票号是否合法
			if(InvalidatedTicket(UntreadCode.dat)==1)
			{
				LcdDisplay(0,0,"此发票号已经作废,",3);
				LcdDisplay(16,16,"不能再次作废!",0);
				LcdDisplay(32,8,"<按任意键继续>",0);
				KeyScan();
				continue;
			}
			if(UntreadCode.dat>fp->dat || UntreadCode.dat<wp->dat)
			{
				LcdDisplay(16,0,"您输入的发票号不存在!",3);
				LcdDisplay(32,24,"<按任意键继续>",0);
				KeyScan();
				continue;
			}
			break;
		}
		memset(str,0,sizeof(str));
		ReadDate();
		fp=&str[0];
		wp=&InvoDate[0];
		fp->dat=wp->dat;					//开票日期 4 BCD
		str[4]=3;							//发票类型:废票
		fp=&str[5];
		fp->dat=UntreadCode.dat;			//发票号
		//分类金额为0,总金额为0
		I2cRead(InvoPrintNum,2,hp.str);
		gs = hp.dat;
		if(gs > 38836)
		{
			#if FlashInvoM25P80
			SerialFlashBulkErase(FlashInvo);//如果掉电如何处理
			#endif
			fpadr=InvoPrintDat;
			hp.dat=0;
		}
		else
			fpadr=InvoPrintDat+(hp.dat)*27;
		#if DebugSim
		if(PwrFlg!=0)
			PowerOffHint(" ","发票尚未作废!",0xAA);
		IssueInvoice(str);
		#endif
		for(i=0;i<8;i++)fiscalcode[i]=str[i];
		//-----------------------------------------------------------------
		//作废发票号处理
		I2cRead(UntreadNum,1,str);
		adr = str[0]*4+UntreadAdr;
		I2cWrite(adr,4,UntreadCode.str);	//记录作废发票号
		str[0]+=1;							//累加本卷发票作废发票数量	1
		I2cWrite(UntreadNum,1,str);

		I2cRead(TomeNum3,1,str);
		str[0]+=1;					//累加单卷发票使用汇总数据缓冲区废票份数 1
		I2cWrite(TomeNum3,1,str);

		I2cRead(IntradayInvalid,2,xp.str);
		xp.dat+=1;						//累加当天废票份数 2
		I2cWrite(IntradayInvalid,2,xp.str);
		//-----------------------------------------------------------------
		//写入发票打印数据存储器
		memset(str,0,sizeof(str));
		fp=&str[0];
		wp=&InvoDate[0];
		fp->dat=wp->dat;							//开票日期 4 BCD
		fp=&str[4];
		fp->dat=UntreadCode.dat;					//发票号
		str[8]=3;									//发票类型 1 HEX
		//总金额为0
		for(i=0;i<8;i++)
			str[13+i] = fiscalcode[i];				//税控码
		//其它为0
		SerialFlashWrite(FlashInvo,fpadr,27,str);
		hp.dat+=1;
		I2cWrite(InvoPrintNum,2,hp.str);
		//-----------------------------------------------------------------
		InvoNoInc(UntreadCode.dat,0);
		//-----------------------------------------------------------------
		if(PwrFlg!=0)
			PowerOffHint(" ","已经完成废票处理!",0x55);
		Hint(48,0,"操作成功!",1);
		//-----------------------------------------------------------------
		while(1)
		{
			i=InvoiceCheck(1);
			if(i==1)break;
			if(i==0 || i==2)return 2;
			Hint(16,0,"没录入发票,不能销售!",3);
		}
		//-----------------------------------------------------------------
		LcdDisplay(0,0,"需要进纸到下一张发票吗?",3);
		LcdDisplay(16,0,"--按<确认>键进纸",0);
		LcdDisplay(32,0,"--按其它键不进纸",1);
		if(KeyScan()==K_HJ)
		{
			I2cRead(BlackFlg,1,str);
			if(str[0]==1)
				BlackOrientation();
		}
		return 1;
	}
}

void FindBar(uchar *ascii)
{
	gyt2 *fp,*hp,num;
	gyt4 *xp,*tp;
	uint i;
	ulong adr;
	uchar bar[15],tmp[15];

	WareNo = 0;
	StrToBar(ascii,bar);
	fp=bar;
	xp = &bar[2];
	I2cRead(PluNumber,2,num.str);
	adr=WareBarCode;
	for(i=0;i<num.dat;i++)
	{
		SerialFlashRead(FlashDat,adr,6,tmp);
		hp = tmp;
		tp = &tmp[2];
		if(fp->dat==hp->dat && xp->dat==tp->dat)
		{
			WareNo = i+1;
			return;
		}
		adr+=39;
	}
}

uchar GetBar()
{
	uchar i,j,k,bcd[15],str[15],temp[2];
	
	while(1)
	{
		temp[0]=0;
		memset(bcd,0,sizeof(bcd));
		LcdDisplay(32,0,"条形码:",1);
		k=GetBcd(32,56,bcd,13,temp);
//		UartTxd(7,bcd);
		if(k==K_TC)return 0;
		if(k==K_HJ)
		{
			if(bcd[0]!=0)
				break;
			LcdDisplay(48,0,"条形码必须是13位!",1);
		}
	}
	k=bcd[0]&0x0F;
	str[0]='0'+k;				//条形码是13位10进制数,存储为BCD格式时最高位是0
	i=1,j=1;					//转换为字符串时应该将最高位的0去掉
	while(i<7)
	{
		k=bcd[i]>>4;
		str[j]=k+'0';
		j++;
		k=bcd[i]&0x0F;
		str[j]=k+'0';
		j++;
		i++;
	}
	str[j]=0;
	FindBar(str);
	return 1;
}

void Sale()
{
	uchar i,k,j;
	uchar const str[]={
		K_XM1,K_XM2,K_XM3,K_XM4,K_XM5,K_XM6,K_XM7,K_XM8,K_XM9,
		K_XM10,K_XM11,K_XM12,K_XM13,K_XM14,K_XM15,K_XM16,K_XM17,
		K_XM18,K_XM19,K_XM20,K_XM21,K_XM22,K_XM23,K_XM24,K_XM25};

	memset(WareList,0,sizeof(WareList));
	SetIndex();
	//清零各个标志位
	WareTotalPrice=0;
	WareClass=0;
	InvoiceFlg=1;
	SaleFlag=0;
	Surcharge=0;
	Discount=0;
	UntreadCode.dat=0;
	k=0;
	while(1)
	{
		if(k==0 || k==K_HD || k==K_PLU || k==K_TM)
		{
			if(InvoiceFlg==2)LcdDisplay(0,0,"退票状态...",4);
			else	LcdDisplay(0,0,"销售状态...",4);
			LcdDisplay(16,0,"请输入商品编号:",4);
			if(ItemShift)
				LcdDisplay(32,0,"项目换档状态:",4);
			else
				LcdDisplay(32,0," ",4);
			LcdDisplay(48,0,"(项目1-25,换档,PLU)",4);
			if(k==0)
			{
				ScanerIni();
				j=0;
				if(ItemShift)j=104;
				k=WaitKey(32,j);
				if(RxdFlg!=0)
				{
					RxdFlg=0;
					IEA &= 0xEF;	//关UART2中断,ES2 = 0;
					FindBar(&RxdBuf[200]);
					k=SaleWare(0);
				}
			}
		}
		i=0;
		for(j=0;j<25;j++)
		{
			if(k==str[j])
			{
				k=SaleWare(j+1);
				i=1;
			}
		}
		if(i==1)continue;
		switch(k)
		{
			case 0xF0	:	if(WareClass>=ClassMaxNum)
							{//一次可以输入商品种类的最大值
								k = K_XJ;
								break;
							}
							FindBar(&RxdBuf[200]);
							k=SaleWare(0);
							break;

			case K_TC	:	return;

			case K_PLU	:	if(WareClass>=ClassMaxNum)
							{//一次可以输入商品种类的最大值
								k = K_XJ;
								break;
							}
							GetPlu(1);
							if(WareNo==0)
							{
								k=0;
								break;
							}
							k=SaleWare(0);
							break;

			case K_TM	:	if(WareClass>=ClassMaxNum)
							{//一次可以输入商品种类的最大值
								k = K_XJ;
								break;
							}
							k=GetBar();
							if(k==0)break;
							k=SaleWare(0);
							break;

			case K_HD	:	if(WareClass>=ClassMaxNum)
							{//一次可以输入商品种类的最大值
								k = K_XJ;
								break;
							}
							if(!ItemShift)
							{
								LcdDisplay(32,0,"项目换档状态:",4);
								SetShift;
								k=WaitKey(32,104);
							}
							else
							{
								LcdDisplay(32,0," ",4);
								ClrShift;
								k=WaitKey(32,0);
							}
							break;

			case K_JZ	:   PaperControl(1,16);k=0;     break;
			case K_TZ	:   PaperControl(0,16);k=0;     break;

			case K_CX	:	SaleQuery();
							k=0;					break;
			case K_XJ	:	if(SubTotal()==0)return;
							//没有录入发票或超出金额限额,退出销售状态
							k=0;					break;
			case K_BZ	:	Hint(16,0,"帮助文档!",3);
							k=0;
							break;
			case K_TH:		if(BeginSale)
							{
								Beep(400);
								k=0;
								break;
							}
							k=BlankOutInvoice();
							if(k==2)return;			//没有录入发票,退出销售状态
							k=0;					break;

			default 	:	k=0;Beep(400);     		break;
		}
	}

}

⌨️ 快捷键说明

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