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

📄 comm.c.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:

//======================================================================//
void	CommunityPcMma(void)
{
	uchar	x,y;
	uchar	i;
	ucharx	TempBuffer[50];

	x=0;
	//以标题栏下划线为坐标基准
	y=15;
	YJHClearWindow(0,0,127,80,0x04);
	YJHDrawLine(0,15,127,15,1);	//灰1级线
	YJHDrawLine(0,16,127,16,1);	//灰1级线
	YJHReadFlashToExterMem(MessagePage,
		sizeof(Zztx)-1,
		(ucharx *)(&Zztx[0]),
		(ucharx *)(&TempBuffer[0]));
	YJHStringDisplay(0xff, 1, 0x45, 0x3, &TempBuffer[0],0x8b);
	BMPDisplay(15,19,(ucharx *)AddrPcBmp);
	BMPDisplay(95,23,(ucharx *)AddrMmqBmp);
	for(i=x;i<128;i++)
	{
		if(i%2==0)
			DrawPixel(i, y+30, 3);
		else
			DrawPixel(i, y+30, 1);
	}
	YJHDrawLine(38,15+24,66,15+24,1);	//灰1级线
	YJHDrawLine(66,15+11,66,15+24,1);	//灰1级线
	YJHDrawLine(66,15+11,95,15+11,1);	//灰1级线
	DrawPixel(66, 15+11, 0);
	DrawPixel(66, 15+24, 0);
	DrawPixel(65, 15+23, 1);
	DrawPixel(67, 15+12, 1);
	DrawPixel(66, 15+17, 3);
	DrawPixel(65, 15+19, 3);
	DrawPixel(66, 15+18, 3);
	DrawPixel(67, 15+19, 3);
	DrawPixel(66, 15+19, 3);

	YJHReadFlashToExterMem(MessagePage,
		sizeof(FlashVersion)-1,
		(ucharx *)(&FlashVersion[0]),
		(ucharx *)(&TempBuffer[0]));

	//软件版本:
	YJHStringDisplay(2,70,0x45,0x03,(ucharx *)(&TempBuffer[0]),15);	
	
	YJHReadFlashToExterMem(ConfigFilePage,
		sizeof(EQID)-1,
		(ucharx *)(&EQID),
		(ucharx *)(&TempBuffer[0]));
	
	YJHReadFlashToExterMem(ConfigFilePage,
		5,
		(ucharx *)(ConfigFileAdd+8),
		(ucharx *)&(TempBuffer[sizeof(TempBuffer)-5]));
	XramBCD_ASIIC(5,
		(ucharx *)(&TempBuffer[sizeof(TempBuffer)-5]),
		(ucharx *)(&TempBuffer[10]));

	//机具编号:
	YJHStringDisplay(2,90,0x45,0x03,(ucharx *)(&TempBuffer[0]),15);	
}



uchar ZDHCalCheckSum(uchar Page,uchar IniCheckSum,uint Length,ucharx *SourcePoint)
{
	uchar CheckSum;
	PublicVariable1=(uint)SourcePoint>>8;
	PublicVariable2=(uchar)SourcePoint;
		CheckSum=CalCheckSum(Page,IniCheckSum,Length);
	return(CheckSum);
}


//======================================================================//
//程序校验->参数设置区校验->账号信息备份校验->账号区校验->批量处理缓冲区校验->历史纪录校验
//======================================================================//
void	CheckSumExamine(uchar Flag)					//函数校验和检测
{
	ucharx TempBuffer[4*1024];
	uint Address,Address1;
	uchar TempByte,counter1,counter2,CheckSum,ErrorFlag;

	//-------------加密芯片自检-------------//
	//TempByte=EncryptorSelfCheck();
	//if(TempByte!=0) ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[23]));//加密芯片校验错
	//-------------程序校验-------------//
	CheckSum=ZDHCalCheckSum(UserProPage,CheckSumIniValu,14*4*1024,(ucharx *)UserProAdd1);
	TempByte=ZDHCalCheckSum(UserProPage,CheckSumIniValu,16*4*1024,(ucharx *)0);
	counter1=ZDHCalCheckSum(3,CheckSumIniValu,0x8000,(ucharx *)0);	//校验页面数据区
	if((CheckSum!=0)||(TempByte!=0)||(counter1!=0))
	{
		ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[9]));//程序校验错
		GetChar(60,1);						//wait key for 3'
		ShutPower();						//shut power
	}
	
	//--------------配置表校验--------------//
	ErrorFlag=0;
	ZDHReadFlashToInterMem(ConfigFilePage,1,ConfigFileAdd,(ucharx *)(&TempByte));
	if(TempByte!=0x55) 
	{
		ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[11]));//无配置表
		GetChar(60,1);						//wait key for 3'
		ShutPower();						//shut power
	}
	
	//配置表校验
	else
	{
		CheckSum=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,127,(ucharx *)(ConfigFileAdd+1));
		if(CheckSum!=0) ErrorFlag=1;
	}
	
	ZDHReadFlashToInterMem(ConfigFilePage,1,ConfigBakAdd,(ucharx *)(&TempByte));

	//配置表备份区校验
	if(TempByte==0x55)
	{
		CheckSum=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,127,(ucharx *)(ConfigBakAdd+1));
		if(CheckSum==0)
		{
			//如果配置表校验错则恢复配置表备份区
			if(ErrorFlag==1)
			{
				YJHReadFlashToExterMem(ConfigFilePage,128,(ucharx *)ConfigBakAdd,(ucharx *)(&TempBuffer[0]));
				ZDHWriteFlash(ConfigFilePage,128,(ucharx *)(&TempBuffer[0]),ConfigFileAdd);
			}
		}
		else
		{	
			if(ErrorFlag==1)
			{
				//配置表校验错
				ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[12]));
				//请交银行处理
				ZDHDisplayString(MessagePage,0,(CommInfx *)(&CommData[10]));
				//wait key for 3'
				GetChar(60,1);				
				//配置表校验错,关机
				ShutPower();				
			}
			//配置表正确,配置表备份错
			else						
			{
				YJHReadFlashToExterMem(ConfigFilePage,
					128,
					(ucharx *)ConfigFileAdd,
					(ucharx *)(&TempBuffer[0]));
				ZDHWriteFlash(ConfigFilePage,
					128,
					(ucharx *)(&TempBuffer[0]),
					ConfigBakAdd);
			}
		}
	}
	else
	{
		//配置表校验错并且配置表备份区不存在
		if(ErrorFlag==1)					
		{
			//配置表校验错
			ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[12]));
			//wait key for 3'
			GetChar(60,1);
			ShutPower();
		}
	}
	
	//-------------主管口令校验------------//
	Address=FirstPersonAdd+PersonTotalNum*3*OnePersonLength;
	CheckSum=ZDHCalCheckSum(ConfigFilePage,
		CheckSumIniValu,
		OnePersonLength-2,
		(ucharx *)(Address+2));

	//主管口令校验错
	if(CheckSum!=0)
	{
		ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[14]));
	}
	
	//--------------口令区校验-------------//
	ErrorFlag=0;
	Address=FirstPersonAdd;
	//口令区校验
	for(counter2=0;counter2<49;counter2++)
	{
		ZDHReadFlashToInterMem(ConfigFilePage,1,Address,(ucharx *)(&TempByte));
		if(TempByte==0x55)
		{
			CheckSum=ZDHCalCheckSum(ConfigFilePage,
				CheckSumIniValu,
				OnePersonLength-2,
				(ucharx *)(Address+2));
			if(CheckSum!=0)
			{
				//口令校验错误标志
				ErrorFlag=1;
				CheckSum=0;
				ZDHInternalWriteFlash(ConfigFilePage,1,(ucharx *)(&CheckSum),Address);
			}
		}
		Address+=OnePersonLength;
	}

	//口令校验错
	if(ErrorFlag==1) 
		ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[17]));
	
	//-------------授权金额校验------------//
	ErrorFlag=0;
	//授权金额地址
	Address=AuthorMoneyAdd;
	//授权员地址
	Address1=AuthorMoneyAdd-PersonTotalNum*OnePersonLength;
	for(counter1=0;counter1<PersonTotalNum;counter1++)
	{	
		//检查授权员是否存在
		ZDHReadFlashToInterMem(ConfigFilePage,1,Address1,(ucharx *)(&TempByte));
		//当前授权员存在?
		if(TempByte==0x55)
		{
			CheckSum=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,9,(ucharx *)Address);
			if(CheckSum!=0)
			{
				//金额校验错误标志
				ErrorFlag=1;
				CheckSum=0;
				ZDHInternalWriteFlash(ConfigFilePage,1,(ucharx *)(&CheckSum),Address1);
			}
			//授权金额地址递增
			Address+=9;
			//授权员地址递增
			Address1+=OnePersonLength;
		}
	}

	//授权金额校验错
	if(ErrorFlag==1) 
		ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[15]));
	
	//------------授权员动态口令区校验-------------//
	ErrorFlag=0;
	//动态口令地址
	Address=DynamicPassAdd;
	//授权员动态口令区校验
	for(counter1=0;counter1<PersonTotalNum;counter1++)
	{
		counter2=0;
		//检查动态口令区是否存在
		ZDHReadFlashToInterMem(ConfigFilePage,1,Address,(ucharx *)(&TempByte));	
		//动态口令区存在?
		if(TempByte==0x55)					
		{
			CheckSum=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,15,(ucharx *)(Address+1));
			if(CheckSum!=0) counter2=1;
			TempByte=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,50,(ucharx *)(Address+16));
			CheckSum=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,50,(ucharx *)(Address+66));
			if((TempByte!=CheckSum)||counter2==1)
			{
				ErrorFlag=1;
				CheckSum=0;
				//校验和错删除该记录
				ZDHInternalWriteFlash(ConfigFilePage,1,(ucharx *)(&CheckSum),Address);
			}
		}
		Address+=116;
	}
	
	if(ErrorFlag==1) 
		//动态口令区校验错
		ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[16]));
	
	//----------账号备份信息校验和账号信息校验------------//
	//校验账号区
	TempByte=AccountCheck(0,AccountAreaAdd);
	//校验账号备份区
	ErrorFlag=AccountCheck(0,AccountBakAdd);
	
	if(TempByte!=0)
	{
		if(ErrorFlag!=0)
		{
			switch(TempByte)
			{
				//机具未发行
				case NoInitial:	
				{
					//账号区未初始化
					TempByte=20;
					break;
				}
				//解锁口令错
				case UnlockError:				
				{
					//解锁口令错
					TempByte=21;			
					break;
				}
				//校验错
				case 1:						
				{
					//账号区校验错
					TempByte=22;			
					break;
				}
				//系统无账号
				case 2:						
				{
					TempByte=24;
					break;
				}
			}

			//错误提示
			ZDHDisplayString(MessagePage,3,(CommInfx *)(&CommData[TempByte]));	
			if(Flag==0)
			{
				//请交银行处理
				ZDHDisplayString(MessagePage,0,(CommInfx *)(&CommData[10]));
				//wait key for 3'
				GetChar(60,1);
				//系统无账号,关机
				ShutPower();				
			}
			else
			{
				if(TempByte==22)
				{	
					//校验账号区
					TempByte=AccountCheck(1,AccountAreaAdd);
					//校验账号备份区
					TempByte=AccountCheck(1,AccountBakAdd);	
				}
			}
		}
		//恢复账号备份区
		else
		{							
			YJHReadFlashToExterMem(AccountPage,
				4*1024,
				(ucharx *)AccountBakAdd,
				(ucharx *)(&TempBuffer[0]));
			ZDHWriteFlash(AccountPage,
				4*1024,
				(ucharx *)(&TempBuffer[0]),
				AccountAreaAdd);
		}
	}
	
	else
	{
		//账号区覆盖账号备份区
		if(ErrorFlag!=0)
		{							
			YJHReadFlashToExterMem(AccountPage,4*1024,(ucharx *)AccountAreaAdd,(ucharx *)(&TempBuffer[0]));
			ZDHWriteFlash(AccountPage,4*1024,(ucharx *)(&TempBuffer[0]),AccountBakAdd);
		}
	}
	
	//---------------历史记录区校验--------------//
	ErrorFlag=0;
	
	//历史记录缓冲区11个扇区
	for(counter2=0;counter2<11;counter2++)				
	{
		Address=HistoryRecordAdd+counter2*4*1024;
		//历史记录区校验
		for(counter1=0;counter1<RecordOnePage;counter1++)	
		{
			ZDHReadFlashToInterMem(HistoryPage,1,Address,(ucharx *)(&TempByte));
			//历史记录是否存在
			if(TempByte==0x55)				
			{
				CheckSum=ZDHCalCheckSum(HistoryPage,
					CheckSumIniValu,
					OneHisRecordLen-1,
					(ucharx *)(Address+1));
				if(CheckSum!=0)
				{
					//校验错误标志
					ErrorFlag=1;			
					CheckSum=0;
					//删除标志
					ZDHInternalWriteFlash(HistoryPage,1,(ucharx *)(&CheckSum),Address);
				}
			}
			Address+=OneHisRecordLen;
		}
	}

	//历史记录区校验错
	if(ErrorFlag==1) 
		ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[19]));
	
}


void ZDHDisplayString(uchar Page,uchar ClearFlag,CommInfx *StringPointer)
{
	ucharx DislayBuffer[sizeof(CommInf)];
	uint Address;
	
	YJHReadFlashToExterMem(Page,7,
		(ucharx *)(&StringPointer->X),
		(ucharx *)(&DislayBuffer[0]));
	
	if((ClearFlag==1)||(ClearFlag==3)) 
		ClearLCD(0,0);

	Address=(DislayBuffer[5]<<8)|DislayBuffer[6];
	YJHReadFlashToExterMem(Page,
		DislayBuffer[4],
		(ucharx *)Address,
		(ucharx *)(&DislayBuffer[7]));
	
	DislayBuffer[4]=get_textlen((ucharx *)(&DislayBuffer[7]),DislayBuffer[4]);

	YJHStringDisplay(	DislayBuffer[0],
						DislayBuffer[1],
						DislayBuffer[2],
						DislayBuffer[3],
						(ucharx *)(&DislayBuffer[7]),DislayBuffer[4]);

	//wait key for 2'
	if((ClearFlag==0)||(ClearFlag==1))
		GetChar(40,1);							
	
}

//======================================================================//
// FlashCheckSum() 计算校验和的长度必须小于16K
//======================================================================//
/*
uchar	FlashCheckSum(uchar Page,uchar IniCheckSum,ucharx *Pointer,uint Length)//FLASH数据块校验
{
	ucharx	TempBuffer[16*1024];					//外部16K缓冲区
	uchar CheckSum=IniCheckSum;
	uint Counter,Counter1;

	if(Length==0) return(0);
	do
	{
		if(Length>=(16*1024)) 
		{
			Counter1=16*1024;
			Length-=16*1024;
		}
		else 
		{
			Counter1=Length;
			Length=0;
		}
		YJHReadFlashToExterMem(Page,Counter1,Pointer,(ucharx *)(&TempBuffer[0]));
		for(Counter=0;Counter<Counter1;Counter++)
		{
			CheckSum^=TempBuffer[Counter];
		}
	}while(Length!=0);
	return(CheckSum);
}
*/

//======================================================================//
//返回:0:正确,0xfb:解锁口令错,0xfb:未初始化,其它:错误
//======================================================================//
uchar	AccountCheck(uchar Flag,uint StartAdd)				//账号区和账号备份区校验
{
	uchar ErrorFlag;
	uchar TempByte;
	uchar counter;

	ZDHReadFlashToInterMem(AccountPage,1,StartAdd,(ucharx *)(&TempByte));//检查是否开户
	if(TempByte!=0x55) 
		return(NoInitial);
	else
	{
		TempByte=ZDHCalCheckSum(AccountPage,CheckSumIniValu,9,(ucharx *)(StartAdd+1));

		//返回解锁口令错
		if(TempByte!=0) 
			return(UnlockError);		
	}

	//获取账号总数
	TempByte=GetFreeAcctStart(0x01);			

	//系统无账号
	if(TempByte==0) 
		return(2);				

	ErrorFlag=0;
	
	//指向账号
	StartAdd+=10;						

	//账号信息校验
	for(counter=0;counter<AccontNumber;counter++)		
	{
		ZDHReadFlashToInterMem(AccountPage,1,StartAdd,(ucharx *)(&TempByte));
		if(TempByte==0x55)
		{
			TempByte=ZDHCalCheckSum(AccountPage,
				CheckSumIniValu,
				83,
				(ucharx *)(StartAdd+1));
			
			if(TempByte!=0)
			{
				ErrorFlag=1;
				//如果开机不进入通讯并且账号校验错,则删除错误的账号
				if(Flag==1)
				{
					TempByte=0;		
					ZDHWriteFlash(AccountPage,1,(ucharx *)&TempByte,StartAdd);
				}
			}
			StartAdd+=128;
		}
	}

	if((ErrorFlag==1)&&(Flag==1)) 
	{
		//如果重新整理了账号,则修改权限
		LineAcct();					
		FlashWriteEnable=Enable;
		//删除批量处理缓冲区
		EraseBlock(BatchBufferPage,TempRecordAdd/0x1000);
		FlashWriteEnable=Enable;
		//关机备份缓冲区
		EraseBlock(SystemBakBufPage,0xf000/0x1000);
	}

	return(ErrorFlag);
}

//去除非数字数据
void RemoveNoNumber(ucharx *point)
{
	uchar k,j=0;
	uchar m;

	for(k=0;k<32;k++)
	{
		if((k%2)==0)	
			m=*(point+15-(k/2))&0x0F;
		else 
			m=(*(point+15-(k/2))&0xF0)>>4;

		if((m+0x30)<0x3a)
		{
			if((j%2)==0)  
				( *(point+15-(j/2)))&=0xF0;
			else 
			{
				(*(point+15-(j/2)))&=0x0F;
				m=m<<4;     
			}
			(*(point+15-(j/2)))^=m;
			j++;
		}
	}

	for(;j<32;j++)
	{
		if((j%2)==0)
			(*(point+15-(j/2)))&=0xF0;
		else 
			(*(point+15-(j/2)))&=0x0F;
	}
}



⌨️ 快捷键说明

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