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

📄 manage.bak

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 BAK
📖 第 1 页 / 共 2 页
字号:
	}
	while(1)
	{
		LcdDisplay(32,40,"新 密 码:",1);
		LcdDisplay(48,40,"重复密码:",1);
		InitLen[0]=0;
		key=GetInt(32,120,0,8,1,InitLen);//输入新密码
		if(InitLen[0]==K_TC)return;
		InitLen[0]=0;
		pwd.dat=GetInt(48,120,0,8,1,InitLen);//重新输入新密码
		if(InitLen[0]==K_TC)return;
		if(key==pwd.dat)break;
		Hint(16,0,"两次输入不一致,重新输入",3);
		Beep(400);
	}
	I2cWrite(us1,4,pwd.str);
	Hint(16,64,"修改成功!",3);
}

void SalerEdit(uchar flag)
{
	uchar i,InitLen[2];
	uint us1=0;
	ulong key=0;
	gyt4 mydat;

	switch(flag)
	{
		case 1:	if(VerifyBossPwd()!=1)break;
				while(1)
				{
					LcdDisplay(0,56,"增加营业员",3);
					us1=InputSalerNo();
					if(us1==0)return;
					I2cRead(us1,4,mydat.str);
					if(mydat.dat!=0)
					{
						Hint(16,16,"本营业员已经设置!",3);
						continue;
					}
					LcdDisplay(32,56,"密  码:",1);
					LcdDisplay(48,56,"重  复:",1);
					InitLen[0]=0;
					key=GetInt(32,120,0,8,1,InitLen);//输入密码
					if(InitLen[0]==K_TC)return;
					InitLen[0]=0;
					mydat.dat=GetInt(48,120,0,8,1,InitLen);//重复输入密码
					if(InitLen[0]==K_TC)return;
					if(key==0)
					{
						Hint(16,32,"密码不能为0",3);
						continue;
					}
					if(key==mydat.dat)break;
					Hint(16,0,"两次输入不一致,重新输入",3);
					Beep(400);
				}
				I2cWrite(us1,4,mydat.str);//写数据
				I2cRead(SalerNum,1,&i);
				i++;
				I2cWrite(SalerNum,1,&i);
				Hint(16,56,"增加成功!",3);
				break;
		case 2:	I2cRead(SalerNum,1,&i);
				if(i==0)
				{
					Hint(16,32,"没有设置营业员!",3);
					break;
				}
				if(VerifyBossPwd()!=1)break;
				LcdDisplay(0,56,"删除营业员",3);
				us1=InputSalerNo();
				if(us1==0)return;
				I2cRead(us1,4,mydat.str);
				if(mydat.dat==0)
				{
					Hint(16,32,"没有这个营业员!",3);
					break;
				}
				mydat.dat=0;
				I2cWrite(us1,4,mydat.str);
				i--;
				I2cWrite(SalerNum,1,&i);
				Hint(16,64,"删除成功!",3);
				break;
		case 3:
				LcdDisplay(0,32,"修改营业员密码",3);
				us1=InputSalerNo();
				if(us1==0)return;
				I2cRead(us1,4,mydat.str);
				if(mydat.dat==0)
				{
					Hint(16,32,"没有这个营业员!",3);
					break;
				}
				ModifyPwd(us1);
				break;
		case 4:	LcdDisplay(0,16,"设置或修改管理员密码",3);
				ModifyPwd(0);
				break;
		default	:break;
	}
}

/*-------------------------------------------------------------------------------------
			营业员管理
--------------------------------------------------------------------------------------*/
void SalerManage()
{
	uchar i=1,InitVal[3];

	while(1)
	{
		WindowsSet(4);
		strcpy(&WinHint[0][1],"1.增加营业员");
		strcpy(&WinHint[1][1],"2.删除营业员");
		strcpy(&WinHint[2][1],"3.修改营业员密码");
		strcpy(&WinHint[3][1],"4.修改管理员密码");

		InitVal[0]=K_TC;
		InitVal[1]=K_HJ;
		InitVal[2]=0;
		i=Windows(i,0,InitVal);
		if(InitVal[0]==K_TC)return;
		SalerEdit(i);
	}
}

/*-----------------------------------------------------------------------------------
	  营业员登陆
-----------------------------------------------------------------------------------*/
uchar Login()
{//首先应该判断营业员数量,如果为零则不登陆
	uchar i,InitLen[2];
	ulong pwd;
	uint us1;
	gyt4 tp;

	I2cRead(SalerNum,1,&i);
	if(i==0)return 1;			//没有增加营业员,不需要登陆
	InitLen[0]=0;
	while(1)
	{
		LcdDisplay(0,56,"营业员登陆",3);//清屏后再显示
		LcdDisplay(32,56,"密  码:",1);
		us1=InputSalerNo();
		if(us1==0)return 0;
		I2cRead(us1,4,tp.str);//读取密码
		if(tp.dat==0)
		{
			Hint(48,40,"没有这个营业员!",1);
			continue;
		}
		InitLen[0]=0;
		pwd=GetInt(32,120,0,8,1,InitLen);//输入密码
		if(InitLen[0]==K_TC || InitLen[0]==0xFF)return 0;
		if(tp.dat==pwd)return 1;//密码正确
		Hint(48,16,"密码错误!请重新输入",1);
	}
}

//-------------------------------------------------------------------------------

void Txd_9600_19200(uchar flag,uint Len,uchar *str)
{
  	if(flag)
  	{
		  COM1CS;
		  UARTC;
		  if(BautRateFg == Bps19200)
		  	UART1_Mod1_Timer2_19200;
		  else
		  	UART1_Mod1_Timer1_9600;
  	}

  	EA=0;
  	TxdNum=0;
  	TxdLen=Len;
  	while(TxdNum<TxdLen)
  	{
  	  SBUF2 = str[TxdNum];
  	  while((SCON2 & 0x02)==0);
  	  SCON2 &= 0xFC;
  	  TxdNum++;
  	}
}


uchar Rxd_9600_19200(uchar flag,uint Len,uchar *str)
{
  	uchar Val=0;
  	ulong i=0;
  	if(flag)
  	{
		  COM1CS;
		  UARTC;
		  if(BautRateFg == Bps19200)
		  	UART1_Mod1_Timer2_19200;
		  else
		  	UART1_Mod1_Timer1_9600;

  	}

  	RxdNum=0;
  	RxdLen=Len;
  	while(RxdNum<RxdLen)
  	{
  	  i=0;
  	  while((SCON2  & 0x01)==0)
  	  {
  	    i++;
  	    if(GetKey()==K_TC) return K_TC;
  	    if(i>60000)
  	      return 0;
  	  }
  	  SCON2 &= 0xFC;
  	  str[RxdNum]=SBUF2;
  	  RxdNum++;
  	}
  	return 1;
}

//---------------------------------------------------------------------------
//      联机函数
//return 0 : CrC Error
//return 1 :  Crc = CS OK
//return 2 :  Receive Overtime
//--------------------------------------------------------------------------
uchar Linking()
{
	uint CrC,CS;
	while(1)
	{
		if(Rxd_9600_19200(1,7,RxdBuf)==K_TC) return 0;

		if(		RxdBuf[0]==Com0 && RxdBuf[1]==Com1  && RxdBuf[2]==0x01
			 && RxdBuf[3]==0x00	&& RxdBuf[4]==0x05)
		{
			CS = 0;
			CS = RxdBuf[5];
			CS <<= 8;
			CS |= RxdBuf[6];

			CrC = CRC16(&RxdBuf[0],5);

			#if Debug
			if(CS == CrC)
			#endif
				return 1;

			#if Debug
			else
				return 0;
			#endif
		}
	}
//	return 2;
}


//-------------------------------------------------------------------------
//							接收商品信息下载与项目信息下载与字库下载等
//return 0 : 	Command Error
//return 1 :  OK
//return 2 :  Receive Overtime
//return 3 :  CrC Error
//-------------------------------------------------------------------------
uchar DownDispose(uchar *len,uchar *Command_Type,uchar *Datanum)
{
	uchar n,CrC,CS;
	while(1)
	{
		if(!Rxd_9600_19200(1,5,RxdBuf))		//Receive Command Head and data len
			return 2;									//Receive Overtime

		if(RxdBuf[0]==Com0 && RxdBuf[1]==Com1
			&& (RxdBuf[2]==SPDown  || RxdBuf[2]==XMDown || RxdBuf[2]==DSPDown
			||  RxdBuf[2]==DXMDown || RxdBuf[2]==ZKXW   || RxdBuf[2]==ZKZW
			||  RxdBuf[2]==DownTC  || RxdBuf[2]==BaudrateSet))
		{
//			n = RxdBuf[4]-5+2;					//Contioue Receive other data//长度不包括本身
			n = RxdBuf[4]-3;					//Contioue Receive other data//长度不包括本身
			if(!Rxd_9600_19200(0,n,&RxdBuf[5]))
				return 2;

//		crcstrlen=n(接收不函头的长度)-2(CRC长度)+5(头数据长度);

			CrC = CRC16(&RxdBuf[0],n+3);		//n+3 = n-2+5  2 : 接收时的CRC,在计算时不能参与
			CS = 0;
			CS = RxdBuf[n+3];
			CS <<= 8;
			CS |= RxdBuf[n+4];

			#if Debug
			if(CrC == CS)
			#endif
			{
				*len = n-2;
				*Command_Type = RxdBuf[2];
				*Datanum = RxdBuf[3];
				return 1;
			}
			#if Debug
			else
			#endif
				return 3;
		}
			return 0;
	}
}


//-------------------------------------------------------------------------
//						正确执行的应答
//datanum : 已接收到的数据包
//len			:	接收的数据长度
//Redat		:	接收的数据
//---------------------------------------------------------------------------
void ACK(uchar datanum,uchar len,uchar *Redat)
{
	uchar i;
	uint CrC;
	TxdBuf[0]='O';
	TxdBuf[1]='K';
	TxdBuf[2]=datanum;
//	if(len != 0)		//联机时专用
		TxdBuf[3]=len+4;			//命令长度不包函CRC
//	else
//		TxdBuf[3] = 4;
	for(i=0;i<len;i++)
		TxdBuf[4+i]=Redat[i];

	CrC = CRC16(TxdBuf,len+4);
	TxdBuf[len+4] = CrC>>8;
	TxdBuf[len+5] = CrC;
	Txd_9600_19200(1,len+6,TxdBuf);
}
//--------------------------------------------------------------------------
//						不能正确执行的应答
//ErrorCode : 	错误代码
//---------------------------------------------------------------------------
void NotACK(uchar ErrorCode)
{
	uint CrC;
	TxdBuf[0]='E';
	TxdBuf[1]='R';
	TxdBuf[2]=0;
	TxdBuf[3]=5;
	TxdBuf[4]=ErrorCode;

	CrC = CRC16(TxdBuf,5);

	TxdBuf[5]=CrC>>8;
	TxdBuf[6]=CrC;
	Txd_9600_19200(1,7,TxdBuf);
}

//--------------------------------------------------------------------------
//						请求下一包数据
//Redatanum : 接收的数据包序号
//---------------------------------------------------------------------------
void ApplyNexDat(uchar Redatanum)
{
	uint CrC;
	TxdBuf[0]='N';
	TxdBuf[1]='P';
	TxdBuf[2]=0;
	TxdBuf[3]=5;
	TxdBuf[4]=Redatanum;

	CrC = CRC16(TxdBuf,5);

	TxdBuf[5]=CrC>>8;
	TxdBuf[6]=CrC;
	Txd_9600_19200(1,7,TxdBuf);
}

//--------------------------------------------------------------------------
//						请求继续等待
//---------------------------------------------------------------------------


//void ApplyWait()
//{
//	uint CrC;
//	TxdBuf[0]='W';
//	TxdBuf[1]='T';
//	TxdBuf[2]=0;
//	TxdBuf[3]=5;
//
//	CrC = CRC16(TxdBuf,4);
//
//	TxdBuf[4]=CrC>>8;
//	TxdBuf[5]=CrC;
//	Txd_9600_19200(1,6,TxdBuf);
//}


//--------------------------------------------------------------------------
//						退出请求命令
//---------------------------------------------------------------------------

//void Exit()
//{
//	uint CrC;
//	TxdBuf[0]='E';
//	TxdBuf[1]='X';
//	TxdBuf[2]=0;
//	TxdBuf[3]=5;
//
//	CrC = CRC16(TxdBuf,4);
//
//	TxdBuf[4]=CrC>>8;
//	TxdBuf[5]=CrC;
//	Txd_9600_19200(1,6,TxdBuf);
//}

uchar LinkChuLi()
{
	uchar LinkFg;

	LinkFg = Linking();
	if(LinkFg == 0)     //联机失败
	{
//		ReHint("-^|^-","联机失败.");
//		NotACK(LinkER);
		return 0;
	}
//	if(LinkFg == 2)
//	{
//	 	ReHint("-^||^-","联机超时.");
//	 	NotACK(Overtime);
//	 	return 0;
//	}
	ACK(0,0,&LinkFg);		//联机成功
	return 1;
}


//void InitSerial()
//{
// 	COM1CS;
//  UARTC;
//  UART1_Mod1_Timer1_9600;
//}
//---------------------------------------------------------------------------
//            下载
//---------------------------------------------------------------------------
void WareDown()
{
  	uchar EraseFg,ReFg,i;
  	uchar Len,Stype=0,Type,Bao;
  	ulong addr,num;//商品信息地址:WareAdr//项目信息地址ItemAdr

//	InitSerial();


  	ReHint("正在联机....","请稍候/");


	if(!LinkChuLi())
		return;

	ReHint("联机成功.","请下载信息/");

	num = 0;
	EraseFg = 1;

	while(1)
	{

		ReFg = DownDispose(&Len,&Type,&Bao);

		if(ReFg == 0)								//命令头错误
		{
			NotACK(ComandEr);
//			return;
		}
		#if Debug
//  if(ReFg == 2)
//			NotACK(ReceiveOver);			//接收超时
		#endif
		if(ReFg == 3)
			NotACK(CrCEr);

		if(ReFg == 1)
		{
			if(Stype!=Type) for(i=0;i<0xff;i++) TxdBuf[i]=RxdBuf[i];

			switch(Type)
			{
				case SPDown:						//全部商品信息下载
				case DSPDown:						//单个商品信息下载
					if(Stype != Type)
					{
						ReHint(" ^_^ ","正在下载商品信息/");  //如果本次接收的命令不等于上次接收的命令则说明
						addr = WareAdr;                         //是下一个命令
					}
					break;
				case XMDown:						//全部项目信息下载
				case DXMDown:						//单个项目信息下载
					if(Stype != Type)
					{
						ReHint(" ^_^ ","正在下载项目信息/");
						addr = ItemAdr;
					}
					break;
				case ZKXW:							//西方字库下载
					if(Stype != Type)
					{
						ReHint(" ^_^ ","正在下载GB18030字库/");
//						ReHint(" ^_^ ","正在下载西文字库/");
						addr = xWStartadr;
					}
					break;
				case ZKZW:							//中文字库下载
					if(Stype != Type)
					{
						ReHint(" ^_^ ","正在下载中文字库/");
						addr = zWStartadr;
					}
					break;
				case BaudrateSet:				//波特率设置
					ACK(Bao,0,&RxdBuf[5]);
					if(RxdBuf[5] == Bps19200)
					{
						ReHint("波特率设置成功.","现在通讯速率:19200Bps/");
						BautRateFg = Bps19200;
					}
					else
					{
						ReHint("波特率设置成功.","现在通讯速率:9600Bps/");
						BautRateFg = Bps9600;
					}

					break;
				case DownTC:return;								//退出
				default:return;
			}

			if(Stype!=Type) for(i=0;i<0xff;i++) RxdBuf[i]=TxdBuf[i];

			if(Type != BaudrateSet)
			{
//				ACK(Bao,0,&RxdBuf[5]);

				Stype=Type;					//保存现在的命令类型
				StartDown(Type,addr,&EraseFg,Len);
				addr += Len;
				if(Bao != 0)
				{
					ApplyNexDat(Bao);
				}
				else
					ReHint(" ^_^ ","下载完成!/");
			}
		}
	}
}


uchar StartDown(uchar type,ulong address,uchar *EraseFlag,uchar len)
{
  	uchar chip;
  	uint offset;
  	uchar *poin;

  	poin = &RxdBuf[5];

 	if(type == DSPDown || type == DXMDown)
 	{
 		chip = FlashDat;
 		offset = 0;
 		offset = RxdBuf[5];
 		offset <<= 8;
 		offset |= RxdBuf[6];
 		if(type == DSPDown)
 			address = WareAdr+(offset-1)*SPlen;
 		if(type == DXMDown)
 			address = ItemAdr+(offset-1)*XMlen;

 		poin = &RxdBuf[7];
 		len -= 2;
 	}

 	if(type == ZKXW || type == ZKZW)
 	{
 		chip = Flashziku;
 		if(*EraseFlag)
	 	{
	 		*EraseFlag = 0;
	 		#if Erasetest						//测试时使用,如果不擦除则将些标志置为 0
	 		SerialFlashBulkErase(chip);
	 		#endif
	 	}
 	}
 	if(type == SPDown || type == XMDown)
 	{
 		chip = FlashDat;
 	}

	#if write									//如果不对Flash进行写操作则将些标志置为 0
 	SerialFlashWrite(chip,address,len,poin);
 	#endif
	return 1;
}

⌨️ 快捷键说明

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