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

📄 sale.bak

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 BAK
📖 第 1 页 / 共 4 页
字号:
						tp->dat = price;
						x=3;
						continue;
					}
					price = tp->dat;			//获得价格
					tp = &WinDat[3][2];
					if(tp->dat==0 || tp->dat>WareMaxNum)
					{
						if(tp->dat>WareMaxNum)Hint(16,16,"超出最大数量限制!",3);
						if(tp->dat==0)Hint(16,48,"数量不能为0!",3);
						tp->dat = num;
						x=4;
						continue;
					}
					num = tp->dat;				//获得数量
					tp = &WareList[m][2];
					tp->dat = price;			//商品价格
					tp = &WareList[m][6];
					tp->dat = num;				//商品数量
					Hint(16,32,"修改成功!",3);
					break;
				}
			}
		}
	}
}

uchar FindIndex(uchar m)
{
	uchar i,k;

	for(i=0;i<6;i++)
	{
		if(m==WareClassStat[5*i])
		{
			k=i*5+1;
			return k;
		}
	}
	return 0xFF;
}

void ClassStat(ulong per,bit xp,bit hp)
{//per:金额或是百分比;	xp=0:打折-1:加费;	hp=0:金额-1:百分比
	ulong tp,wc;
	uchar i,j,k;
	gyt4 *wp;
//	float x1,x2,x3;

//	if(hp==0)
//		x2 = WareTotalPrice;
	wc = per;
	for(k=0;k<WareClass;k++)
	{
		j = WareList[k][10];
		i=FindIndex(j);
		if(i==0xFF)
			ErrorHint("税种税目索引号出错!",0x3003);
		wp=&WareClassStat[i];			//分类统计金额累加

		if(wp->dat!=0)
		{
			if(hp==1)
			{
				tp = (wp->dat*per)/100;
				if(xp)
				{
						wp->dat += tp;
						WareTotalPrice += tp;
						Surcharge += tp;
				}
				else
				{
						wp->dat -= tp;
						WareTotalPrice -= tp;
						Discount += tp;
				}
			}
			else
			{
				tp = wp->dat*per/WareTotalPrice;
				if(xp)
				{
					if(wp->dat>wc){wp->dat += wc;break;}
					wp->dat += tp;
				}
				else
				{
					if(wp->dat>wc){wp->dat -= wc;break;}
					wp->dat -= tp;
				}
				wc -=tp;
			}

		}
	}
	if(hp==0)
	{
		if(xp==1)
		{
			WareTotalPrice+=per;
			Surcharge += per;
		}
		else
		{
			Discount += per;
			WareTotalPrice-=per;
		}
	}
}

uchar WaitKey(uchar ln, uchar col)
{
	uchar val=0xFF,tp[2];
	uint  cursordelay = 0;
	bit flg = 1;

	tp[1]=0;
	while(val==0xFF)
	{
		val = GetKey();
		if(RxdFlg==1)return 0;
    	cursordelay++;
    	if(cursordelay>CursorTime)              //光标显示
    	{
    		cursordelay = 0;
       		if(flg) tp[0]='_';
         	else	tp[0]=' ';
         	LcdDisplay(ln,col,tp,0);
         	flg = ~flg;
    	}
    }
	return val;
}


void AmendPrice(uchar f,uchar t,ulong price)
{//f=1:加费;f=0:打折;	t=0:单个商品操作;t=1:对已经输入商品全体操作
	uchar k,tag,str[25];
	uint n;
	bit m;
	ulong tp,xp;
	gyt4 *hp;

	if((PluPress==0) && (ItemPress==0) || (NumberPress))
//	if((PluPress==0) && (ItemPress==0))
	{//是否按了数量键后就不能打折、加费
		Beep(400);
		return;
	}
	if(t==1)
	{//对已经输入商品全体操作
		if((TotalAbate && f==0) || (TotalExcess && f==1))
		{
			//提示
			Beep(400);
			return;
		}
	}
	else
	{//对单个商品操作
		if((f==0 && AbatePress) || (f==1 && ExcessPress))
		{//如果已经加收费用或者打折了,就不允许进行同样的操作
			//提示
			Beep(400);
			return;
		}
	}
	tag=0;
	memset(str,0,sizeof(str));
	if(t==0)
		strcpy(str,"本商品价格:");
	else
		strcpy(str,"商品总价格:");
	NumToStr(price,&str[11],SwitchFloat);
	LcdDisplay(0,0,str,3);		//是否需要滚动条,需要的话就要更新滚动条
	if(f)LcdDisplay(16,0,"加费金额:",0);
	else LcdDisplay(16,0,"打折金额:",0);
	while(1)
	{
		k=WaitKey(16,72);//应该加光标提示
		switch(k)
		{
			case K_BF	:
							while(1)
							{
								if(f)
									LcdDisplay(16,0,"加费百分比:",1);
								else
									LcdDisplay(16,0,"打折百分比:",1);
								str[0]=0;
								tp=GetInt(16,88,0,2,0,str);
								if(str[0] == K_TC)return;
								if(tp!=0)
								{
									if(tp<=100 && f==1)break;
									if(tp<100 && f==0)break;
								}
								if(f==1)
									LcdDisplay(32,32,"0< 加费百分比 <=100",1);
								else
									LcdDisplay(32,32,"0< 打折百分比 <100",1);
								Beep(400);
							}
							m=1;tag=1;
							break;
			case K_0	:	//此处输入0,在GetFloat()中不会显示出来
			case K_1	:
			case K_2	:
			case K_3	:
			case K_4	:
			case K_5	:
			case K_6	:
			case K_7	:
			case K_8	:
			case K_9	:	k=KeyDat(k);n=k*100;
							while(1)
							{
								str[0]=0;
								tp=GetFloat(16,72,n,6,str);
								if(str[0] == K_TC)return;
								if(t==0)
								{
									if(tp<price && f==0)break;
									if(tp<=price && f==1)break;
								}
								if(tp<WareTotalPrice && t==1)break;
								if(f)
									LcdDisplay(32,0,"加费金额 <= 商品价格!",1);
								else
									LcdDisplay(32,0,"打折金额 < 商品价格!",1);
								k=0;
								Beep(400);
							}
							m=0;tag=1;
							break;
			case K_TC	:	return;		//强制退出
			default 	:	Beep(400);     break;
		}
		if(tag!=0)break;
	}

	if(t)
	{
		ClassStat(tp,f,m);
		if(f)
		{
			SetTotalExcess;
		}
		else
		{
			SetTotalAbate;
		}
		NumToStr(WareTotalPrice,&WinHint[1][6],SwitchFloat);
	}
	else
	{
		if(f)
		{
			if(m==1)
			{
				xp = price * (100+tp);
				price = xp/100;
			}
			else
				price += tp;
			SetExcess;
		}
		else
		{
			if(m==1)
			{
				xp = price * (100-tp);
				price = xp/100;
			}
			else
				price -= tp;
			SetAbate;
		}
		hp = &WinDat[2][2];
		hp->dat = price;
	}
	ClrAbate;
	ClrExcess;
//	ClrTotalAbate;
//	ClrTotalExcess;
}


uchar SaleWare(uchar xm)
{
	uchar key[40],k,n,taxindex;
	ulong adr,warenum;
	uint no;
	gyt4 price,*tp;
	gyt2 *hp;

	if(WareClass>=ClassMaxNum)
	{//一次可以输入商品种类的最大值
		return K_XJ;
	}
	SetSale;
	ClrAbate;
	ClrExcess;
	WindowsSet(5);
	if(xm==0)
	{//PLU
		if(WareNo==0)
		{
			Hint(16,0,"没有对应的商品信息!",3);
			return 0;
		}
		strcpy(&WinHint[0][1],"PLU:");
		NumToStr(WareNo,&WinHint[0][5],SwitchInt);
		adr=WareAdr+39*(WareNo-1);
		SetPlu;
	}
	else
	{//项目
		if(ItemShift){WareNo=xm+25+0xFF00;ClrShift;}
		else	WareNo=xm+0xFF00;
		//如果项目数量不足50,应该与PLU做相同处理
		no=WareNo&0x00FF;
		strcpy(&WinHint[0][1],"项目:");
		NumToStr(no,&WinHint[0][6],0);
		adr=ItemAdr+33*(no-1);
		SetItem;
	}

	strcpy(&WinHint[1][1],"名称:");
	SerialFlashRead(FlashDat,adr,16,&WinHint[1][6]);

	SerialFlashRead(FlashDat,adr+32,1,&taxindex);

	SerialFlashRead(FlashDat,adr+20,4,price.str);
	strcpy(&WinHint[2][1],"价格:");
	tp = &WinDat[2][2];
	tp->dat = price.dat;
	WinDat[2][0]=8;WinDat[2][1]=8;

	warenum=100;
	strcpy(&WinHint[3][1],"数量:");
	tp = &WinDat[3][2];
	tp->dat = warenum;
	WinDat[3][0]=8;WinDat[3][1]=6;

	strcpy(&WinHint[4][1],"税种税目索引号:");
	WinHint[4][16]=taxindex+'0';
	WinHint[4][17]=0;

	n=3;
	while(1)
	{
		memset(key,0,sizeof(key));
		SetKey(key);
		k=Windows(n,1,key);
		tp = &WinDat[2][2];
		if(tp->dat==0)
		{//价格不能为0	是否要限制最大价格?
			Hint(16,48,"价格不能为0!",3);
			tp->dat = price.dat;
			n=3;
			continue;
		}
		price.dat = tp->dat;
		tp = &WinDat[3][2];
		if(tp->dat==0 || tp->dat>WareMaxNum)
		{//数量不能为0,最大数量限制
			if(tp->dat>WareMaxNum)Hint(16,16,"超出最大数量限制!",3);
			if(tp->dat==0)Hint(16,48,"数量不能为0!",3);
			tp->dat = 100;
			n=4;
			continue;
		}
		warenum = tp->dat;
		if(k==0xF0)break;	//扫描仪输入返回
		if(k==K_SL)
		{//如果按“数量”键修改数量,就清除原有数量,等待输入
			n=4;
			tp->dat = 0;
			continue;
		}
		if(k == K_DZ || k == K_JF)
		{
			if(k == K_DZ)k=0;
			if(k == K_JF)k=1;
			AmendPrice(k,0,price.dat);
			tp = &WinDat[2][2];
			price.dat = tp->dat;	//打折之后是否保留原始价格?
			continue;
		}
		break;
	}

	tp = &WinDat[2][2];
	price.dat = tp->dat;
	tp = &WinDat[3][2];
	warenum = tp->dat;		//获得数量

	hp = &WareList[WareClass][0];
	hp->dat = WareNo;				//商品编号
	tp = &WareList[WareClass][2];
	tp->dat = price.dat;			//商品价格
	tp = &WareList[WareClass][6];
	tp->dat = warenum;				//商品数量
	WareList[WareClass][10]=taxindex;
	WareClass++;

	if(WareClass>=ClassMaxNum)		//一张发票可以打印的最大的商品种类
	{
		return K_XJ;
	}
	return k;
}

uchar DailyDatCheck()
{
	gyt2 wp;
	
	I2cRead(DailyDatNum,2,wp.str);
	if(wp.dat>=DailyTradeMax)
	{//日交易存储器写满后禁止继续销售和日交易签名,开发票前也必须检测
		LcdDisplay(16,0,"日交易存储器已满,",3);
		Hint(16,32,"禁止销售!",0);
		return 0;
	}
	return 1;
}

uchar DeadlineCheck()
{//检测是否已经到开票截止日期,是就禁止销售
	gyt4 *xp,hp;
	uchar dat;
	
	ReadDate();
	xp=&InvoDate[0];
	I2cRead(InvoiceEndData,4,hp.str);
	if(hp.dat==xp->dat)
	{
		dat=0x03;
		I2cWrite(MacState,1,&dat);
		LcdDisplay(16,0,"开票截止日期已到,",3);
		Hint(16,32,"禁止销售!",0);
		return 0;
	}
	else return 1;
}

void DailyDatAddUp()
{//当天交易数据累加
	gyt4 *xp,*fp;
	gyt2 *kp;
	uchar i,k,tp[66];

	I2cRead(IntradayTime,64,tp);
	if(InvoiceFlg==2)
	{//输入的是退票
		k=40;
		kp=&tp[6];
	}
	else
	{//输入的是正常发票,(InvoiceFlg==1)
		k=16;
		kp=&tp[4];
	}
	for(i=0;i<6;i++)
	{//累加正常发票或退票分类累计金额
		xp=&tp[k+i*4];
		fp=&WareClassStat[i*5+1];
		xp->dat += fp->dat;
		fp->dat = 0;			//清零WareClassStat
	}
	kp->dat += 1;				//累加当天正常发票份数、退票份数
	I2cWrite(IntradayTime,64,tp);
}

void InvoiceStorage(uchar *fcode)
{
	uchar i,str[30];
	ulong adr,gs;
	uint adr1,adr2,adr3;
	gyt2 hp;
	gyt4 *fp,xp;

	//-----------------------------------------------------
	//发票打印数据存储
	for(i=0;i<4;i++)str[i]=InvoDate[i];			//开票日期 4 BCD
	fp=&str[4];
	fp->dat=CurInvoNo;							//发票号(打印) 4
	str[8]=InvoiceFlg;							//发票类型 1 HEX

	fp=&str[9];
	fp->dat = WareTotalPrice;					//开票总金额 4

	for(i=0;i<8;i++)
		str[13+i] = fcode[i];					//税控码 8

	if(InvoiceFlg==1)UntreadCode.dat=0;			//原发票号 4
	fp=&str[21];
	fp->dat = UntreadCode.dat;

	str[25]=0;str[26]=0;						//保留2字节

	I2cRead(InvoPrintNum,2,hp.str);
	gs = hp.dat;
	if(gs > 38836)
	{//掉电保护处理:擦除过程必须加掉电检测,如果掉电,退出擦除程序,
	//将发票打印数据存入24C64的缓冲区,并设置标志位,继续处理其它流程,下一次开机时处理
	//但是如果下一次开机时又掉电如何处理?
		#if FlashInvoM25P80
		SerialFlashBulkErase(FlashInvo);
		#endif
		adr=InvoPrintDat;
		hp.dat=0;
	}
	else
		adr=InvoPrintDat+ gs*27;
	SerialFlashWrite(FlashInvo,adr,27,str);		//写入发票打印数据存储器
	hp.dat+=1;
	I2cWrite(InvoPrintNum,2,hp.str);
	//-----------------------------------------------------
	if(InvoiceFlg==1)
	{	//累加单卷发票使用汇总数据缓冲区
		adr1=TomeNum1;	//正常发票份数
		adr2=TomeStat;	//正常发票总金额
		adr3=DecAddUp;	//一个报税周期内的销售累计金额
	}
	else
	{	//累加单卷发票使用汇总数据缓冲区
		adr1=TomeNum2;		//退票份数
		adr2=TomeUntread;	//退票总金额
		adr3=DecUntread;	//一个报税周期内的退票累计金额
	}

	I2cRead(adr1,1,str);
	str[0]+=1;
	I2cWrite(adr1,1,str);

	I2cRead(adr2,4,xp.str);
	xp.dat+=WareTotalPrice;
	I2cWrite(adr2,4,xp.str);

	I2cRead(adr3,4,xp.str);
	xp.dat+=WareTotalPrice;
	I2cWrite(adr3,4,xp.str);
}

⌨️ 快捷键说明

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