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

📄 manage.bak

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

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

#define  write				1     	// write = 1  no write = 0
#define  Erasetest 			1		// Erase = 1  no Erase = 0
#define	 Debug			 	1

#define LinkER 				0x50
#define Overtime			0x52
#define CrCEr				0x51
#define ComandEr			0x53
#define ReceiveOver			0x54

#define SPDown				0x30
#define XMDown				0x31
#define DSPDown				0x32
#define DXMDown				0x33
#define ZKXW				0x34
#define ZKZW				0x35
#define DownTC				0x36
#define BaudrateSet			0x37

#define Com0				0x1b
#define Com1				0x10


#define Bps9600				1
#define Bps19200			2

#define SPlen				39
#define XMlen				33

#define xWStartadr    		0
#define zWStartadr    		0x10000

uchar BautRateFg;
uchar StartDown(uchar type,ulong address,uchar *EraseFlag,uchar len);

uchar InputTime(uchar row,uchar col,uchar *dat,uchar mode)
{
	uchar i,val,count,tp[3];
	uint cnt,time=0;
	uchar const str[]={K_0,K_1,K_2,K_3,K_4,K_5,K_6,K_7,K_8,K_9,
				K_RIGHT,K_DOWN,K_UP,K_LEFT,K_HJ,K_TC,K_QC};

	cnt=CursorTime;
	while(1)
	{
		if(mode)
		{//输入两位数
			tp[0]=(*dat>>4)+'0';
			tp[1]=(*dat&0x0F)+'0';
			tp[2]=0;
		}
		else
		{//输入一位数
			tp[0]=*dat+'0';
			tp[1]=0;
		}
		i=0xF0;
		val=0xFF;
		count=0;
		while(val==0xFF)
		{
			val = GetKey();
			if(val!=0xFF)break;
			time++;
			if(time>cnt)
			{
				time = 0;
		    	LcdDisplay(row,col,tp,i);
			    if(i==0)i=0xF0;
			    else i=0;
			}
		}
	    for(i=0;i<10;i++)
	    {
	    	if(val==str[i])
	    	{
	    		if(mode)
		    	{
		    		*dat<<=4;
					*dat|=i;
				}
				else *dat=i;
			}
	    }
	    if(val==K_QC)
	    {
	    	*dat=0;
	    	continue;
	    }
	    for(i=10;i<16;i++)
	    {
	    	if(val==str[i])
	    	{
	    		LcdDisplay(row,col,tp,0);
	    		return val;
	    	}
	    }
	}
}

uchar ShowTime(uchar mode)
{
	uchar str1[7]={"2000年"};
	uchar str2[17]={"00月00日 星期0"};
	uchar str3[13]={"00时00分00秒"};
	uchar k;
	uint time,cnt;

	cnt=CursorTime;
	if(mode==0)
		LcdDisplay(0,56,"当 前 时 间",3);
	else
		LcdDisplay(0,56,"时 间 设 置",3);
	while(1)
	{
		ReadDate();		
		
		str1[2]=(InvoDate[1]>>4)+'0';
		str1[3]=(InvoDate[1]&0x0F)+'0';	//年
		LcdDisplay(16,72,str1,1);

		str2[0]=(InvoDate[2]>>4)+'0';
		str2[1]=(InvoDate[2]&0x0F)+'0';	//月
		str2[4]=(InvoDate[3]>>4)+'0';
		str2[5]=(InvoDate[3]&0x0F)+'0';	//日
		str2[13]=(InvoDate[4]&0x0F)+'0';//星期
		LcdDisplay(32,40,str2,1);

		str3[0]=(InvoDate[5]>>4)+'0';
		str3[1]=(InvoDate[5]&0x0F)+'0';	//时
		str3[4]=(InvoDate[6]>>4)+'0';
		str3[5]=(InvoDate[6]&0x0F)+'0';	//分
		str3[8]=(InvoDate[7]>>4)+'0';
		str3[9]=(InvoDate[7]&0x0F)+'0';	//秒
		LcdDisplay(48,48,str3,1);
		
		if(mode!=0)return 1;
		else
		{
			k=0xFF;
			time=0;
			while(k==0xFF)
			{
				time++;
				if(time>cnt)break;
				k = GetKey();
				if(k==K_HJ || k==K_TC)
					return 0;
			}
		}
	}
}

void TimeSetup(uchar mode)
{//mode=2:只能修改时.分.秒;mode=1: 修改全部;mode=0: 只显示时间不修改时间
	uchar i,j,k,f,m;
	struct coordinate
	{
		uchar row;
		uchar col;
	};
	struct coordinate tp[7]={{16,88},{32,40},{32,72},{32,144},{48,48},{48,80},{48,112}};

	while(1)
	{
		if(ShowTime(mode)==0)return;

		if(mode==1)
			m=0;
//		if(mode==2)
		else
			m=4;
		i=m;
		while(1)
		{
			if(i!=3)j=1;
			else	j=0;
			k=InputTime(tp[i].row,tp[i].col,&InvoDate[i+1],j);
			if(k==K_TC)return;
			if(k==K_HJ)
			{
				f=1;
				InvoDate[0]=0x20;
				if(Verdict(InvoDate)==0)f=0;
				if(InvoDate[4]>7 || InvoDate[4]==0)f=0;
				if(InvoDate[5]>0x23 || InvoDate[6]>0x59 || InvoDate[7]>0x59)f=0;
				if(f==1)break;
				else
				{
					Hint(16,16,"时间格式错误!",3);
					f=0;
					break;
				}
			}
			if(k==K_DOWN || k==K_RIGHT)
			{
				if(i<6)i++;
				else i=m;
			}
			if(k==K_UP || k==K_LEFT)
			{
				if(i>m)i--;
				else i=6;
			}
		}
		if(f==1)break;
	}
	SetTime(&InvoDate[1]);
}

void StrToBar(uchar *str,uchar *bar)
{
	gyt2 *xp;
	gyt4 *tp;
	ulong n;
	uint m;
	uchar i;

	for(m=0,i=0;i<4;i++)
		m=m*10+str[i]-'0';
	for(n=0,i=4;i<13;i++)
		n=n*10+str[i]-'0';
	xp = bar;
	xp->dat = m;
	tp = &bar[2];
	tp->dat = n;
}

void BcdToBar(uchar *bcd,uchar *bar)
{
	uchar str[15],i,j,k;

	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;
	StrToBar(str,bar);
}

void BarToBcd(uchar *bar,uchar *bcd)
{
	gyt2 *xp;
	gyt4 *tp;
	uint m,w;
	ulong n,v;
	uchar i,str[15];

	m=1000;
	n=100000000;
	xp = bar;
	tp = &bar[2];
	w=xp->dat;
	v=tp->dat;
	if(w==0 && v==0)
	{
		for(i=0;i<7;i++)
		bcd[i]=0;
		return;
	}
	for(i=0;i<4;i++)
	{
		str[i]=w/m+'0';
		w=w%m;
		m/=10;
	}
	for(i=4;i<13;i++)
	{
		str[i]=v/n+'0';
		v=v%n;
		n/=10;
	}
	StrToBcd(13,str,bcd);
}

void WareShow(uint no,uchar *str,ulong pricein,ulong priceout,ulong numin,ulong numout,uchar *bar,uchar index)
{
	gyt4 *xp;
	uchar i,m;

	m=0;
	WindowsSet(7);
	if((no & 0xFF00)==0xFF00)
	{
		strcpy(&WinHint[0][1],"项目:");
		m=1; no -= 0xFF00;
	}
	else
		strcpy(&WinHint[0][1],"PLU :");

	NumToStr(no,&WinHint[0][6],SwitchInt);

	strcpy(&WinHint[1][1],"名称:");
	for(i=0;i<16;i++)
		WinDat[1][2+i]=str[i];
	WinDat[1][0]=3;WinDat[1][1]=16;

	strcpy(&WinHint[2][1],"进货价格:");
	xp = &WinDat[2][2];
	xp->dat = pricein;
	WinDat[2][0]=2;WinDat[2][1]=5;

	strcpy(&WinHint[3][1],"销售价格:");
	xp = &WinDat[3][2];
	xp->dat = priceout;
	WinDat[3][0]=2;WinDat[3][1]=5;

	strcpy(&WinHint[4][1],"库存数量:");
	xp = &WinDat[4][2];
	xp->dat = numin;
	WinDat[4][0]=2;WinDat[4][1]=5;

	strcpy(&WinHint[5][1],"已销售数量:");
	xp = &WinDat[5][2];
	xp->dat = numout;
	WinDat[5][0]=2;WinDat[5][1]=5;

	strcpy(&WinHint[6][1],"税种税目索引号:");
	xp = &WinDat[6][2];
	xp->dat = index;
	WinDat[6][0]=1;WinDat[6][1]=1;

	if(m==0)
	{//有条形码
		WinHint[7][0]=1;
		strcpy(&WinHint[7][1],"条形码:");
		BarToBcd(bar,&WinDat[7][2]);
		WinDat[7][0]=6;WinDat[7][1]=13;
	}
}

uchar GetWareInfo(uint no,uchar mode)
{
	gyt4 *wp,xp,hp,tp,mp,*fp;
	uchar str[40],i,bar[7],k,len,warenamestr[17];
	uchar m,flg,taxindex,index[7];
	uint n;
	ulong adr,gs;

	n=no;
	if((no & 0xFF00)==0xFF00)
	{
		m=1;
		no -= 0xFF00;
		gs = no-1;
		adr = gs*33 + ItemAdr;		//项目、部类
	}
	else
	{
		m=0;
		gs = no-1;
		adr = gs*39 + WareAdr;		//PLU
	}
	memset(warenamestr,0,sizeof(warenamestr));
	if(mode == 1)
	{//增加商品
		xp.dat=0;
		hp.dat=0;
		tp.dat=0;
		mp.dat=0;
		taxindex=0;
		memset(bar,0,sizeof(bar));
	}
	else
	{//修改商品
		SerialFlashRead(FlashDat,adr,16,warenamestr);
		SerialFlashRead(FlashDat,adr+16,4,xp.str);
		SerialFlashRead(FlashDat,adr+20,4,hp.str);
		SerialFlashRead(FlashDat,adr+24,4,mp.str);
		SerialFlashRead(FlashDat,adr+28,4,tp.str);
		SerialFlashRead(FlashDat,adr+32,1,str);
		if(m==0)SerialFlashRead(FlashDat,adr+33,6,bar);	//条形码
		taxindex=str[0];
	}
	WareShow(n,warenamestr,xp.dat,hp.dat,mp.dat,tp.dat,bar,taxindex);

	I2cRead(IndexItems,6,index);
	I2cRead(SingleQuota,4,xp.str);
	k=3;
	if(mode == 1)k=2;
	while(1)
	{
		bar[0]=K_TC;
		bar[1]=K_HJ;
		bar[2]=0;
		i=Windows(k,1,bar);
		if(i==K_TC || i==0xFF)return 0;
		fp = &WinDat[6][2];
		str[32]=(uchar)fp->dat;
		flg=0;
		for(i=0;i<6;i++)
		{
			if(index[i]==str[32])flg=1;
		}
		if(flg==0)
		{
			Hint(16,0,"税种税目索引号非法!",3);
			continue;
		}
		wp = &str[20];
		fp = &WinDat[3][2];
		wp->dat=fp->dat;
		if(fp->dat>xp.dat)
		{
			Hint(32,0,"销售价格超出最大限额!",3);
			continue;
		}
		break;
	}
	for(i=0;i<16;i++)str[i]=WinDat[1][i+2];
	wp = &str[16];
	fp = &WinDat[2][2];
	wp->dat=fp->dat;

	wp = &str[24];
	fp = &WinDat[4][2];
	wp->dat=fp->dat;

	wp = &str[28];
	fp = &WinDat[5][2];
	wp->dat=fp->dat;

	len=33;
	if(m!=1)
	{
		len=39;
		BcdToBar(&WinDat[7][2],&str[33]);
	}
	LcdDisplay(8,16,"您确定要修改/添加吗?",3);
	LcdDisplay(24,28,"--按<合计>键确定",0);
	LcdDisplay(40,36,"--按其它键取消",0);
	if(KeyScan()!=K_HJ)
		return 0;
//	#if FlashDatM25P80
//	Modify(FlashDat,adr,len,str);	//写入25P80
//	#else
	SerialFlashWrite(FlashDat,adr,len,str);		//写入45P80
//	#endif
	return 1;
//	Hint(16,32,"操作成功!",3);
}

void ManageSet()
{
	gyt2 tp;
	ulong adr;
	uchar k,i,j,x,m,str[25];
	uchar const xm[]={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};

	x=1;
	while(1)
	{
		WindowsSet(5);
		strcpy(&WinHint[0][1],"1.修改项目");
		strcpy(&WinHint[1][1],"2.修改PLU");
		strcpy(&WinHint[2][1],"3.增加项目");
		strcpy(&WinHint[3][1],"4.增加PLU");
		strcpy(&WinHint[4][1],"5.下载商品信息");
		tp.dat=0;
		str[0]=K_TC;
		str[1]=K_HJ;
		str[2]=0;
		x=Windows(x,0,str);
		if(str[0]==K_TC)return;
		for(i=0;i<25;i++)str[i]=0;
		switch(x)
		{
			case 1:
						j=0;
						LcdDisplay(0,0,"请输入项目编号:",3);
						m=0;
						while(1)
						{
							k=KeyScan();
							if(k==K_TC)
							{
								m=1;
								break;
							}
							if(k==K_HD)
							{
								j^=25;
								if(j==0)LcdDisplay(16,0," ",1);
								else	LcdDisplay(16,0,"项目换档状态!",1);
								continue;
							}
							for(i=0;i<25;i++)
								if(k==xm[i])break;
							if(i<25)break;
							Beep(400);
						}
						if(m==1)break;
						WareNo = (i+1+j)|0xFF00;
						tp.dat = WareNo;
						GetWareInfo(tp.dat,0);
						break;

			case 2:		GetPlu(3);
						if(WareNo==0)break;
						GetWareInfo(WareNo,0);
						break;

			case 3:		adr=ItemNumber;         //当前项目数量		1	HEX
						I2cRead(adr,1,tp.str);
						if(tp.str[0]>=50)		//test
						{Hint(16,0,"项目数量已满!",3);break;}
						tp.str[0]+=1;
						WareNo = tp.str[0] | 0xFF00;
						if(GetWareInfo(WareNo,1)==1)
							I2cWrite(adr,1,tp.str);
						break;

			case 4:		adr = PluNumber;     	//当前PLU数量		2	HEX
						I2cRead(adr,2,tp.str);
						if(tp.dat>=11900)
						{Hint(16,0,"PLU数量已满!",3);break;}
						tp.dat+=1;
						WareNo=tp.dat;
						if(GetWareInfo(WareNo,1)==1)
							I2cWrite(adr,2,tp.str);
						break;

			case 5:
						WareDown();
						break;

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


/*--------------------------------------------------------------------------------
			增加用户 或  删除用户
			flag=1  增加用户   flag=0   删除用户
--------------------------------------------------------------------------------*/
uint InputSalerNo()
{
	uint adr;
	uchar InitLen[2];

	InitLen[0]=0;
	while(1)
	{
		LcdDisplay(16,56,"营业员:",1);
		InitLen[0]=0;
		SalerNo=GetInt(16,120,0,2,0,InitLen);//输入营业员编号
		if(InitLen[0]==K_TC)return 0;
		if(SalerNo!=0 && SalerNo<13)break;
		LcdDisplay(48,16,"0 < 营业员编号 < 13",1);
	}
	adr=(SalerNo-1)*4+SalerPwd;
	return adr;
}

void ModifyPwd(uint n)
{
	ulong key;
	uchar InitLen[2];
	uint us1;
	gyt4 pwd;

//	LcdDisplay(32,40,"新 密 码:",1);
//	LcdDisplay(48,40,"重复密码:",1);
	if(n==0)
		us1=BossPwd;
	else
		us1=n;
	I2cRead(us1,4,pwd.str);//读出密码
	while(1)
	{
		LcdDisplay(16,40,"原 密 码:",1);
		InitLen[0]=0;
		key=GetInt(16,120,0,8,1,InitLen);//输入原密码
		if(InitLen[0]==K_TC)return;
		if(pwd.dat==key)break;
		LcdDisplay(48,32,"密码不正确!",1);
		Beep(400);

⌨️ 快捷键说明

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