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

📄 waterctrlv1.c

📁 一个基于PIC18F单片机的开发的流量计量仪表
💻 C
📖 第 1 页 / 共 5 页
字号:
//	0x29 ---- card number is error
//	0x2a ---- Stop mater option is error
//	0x2b ---- card on effect
//
//-----------------------------------------------------------------//                                              
	   unsigned char systemtemp;
	   unsigned char Systemnum[3];								   //system serail number
	   unsigned char Cardnum[3];								   //card user serail number
	   unsigned char CardUsingTimes;							   //
																   //02 test  
	   unsigned char Settingprice[3];                              //0x x.x xx
	   unsigned char Settingpricehalf[3]={0,0,0};
	   unsigned int  loopcnt;
 const unsigned char one[4] = {0,0,0,1};
 const unsigned char one1[5] = {0x0,0x0,0x0,0x0,0x50};       
	   unsigned char CardBalance[4];                               //XX XX X.X XX
	   unsigned char ShenYuShuiLiang[4]={0,0,0,0};
	   unsigned char ShuiLiang[3]={0,0,0};
	   unsigned char JinE[3]= {0,0,0};
	   unsigned char SheDinLiang[3]={0,0,0};                       //0x x.x xx
	   unsigned char SheDinJinE[3]={0,0,0};
	   unsigned char LieJiShuiLiang[5];
	   unsigned char panma = 1;                                    //counter pointer in meter pad area\
					//0x00:1m3
					//0x01:100L
					//0x02:10L
					//0x30:1L
	   unsigned char valvetime;
	   unsigned char setvalvetime;

//------------------------- LCD Number type Tab ----------------------------//
//LcdNum[X]=  B( x   x   x   x   x   x   x   x )
//			     d3  d2  d1  d0  d3  d2  d1  d0
//			     ---HighAddr--   ---LowAddr---
//[0]	'0':     X   1   1   1   0   1   1   1      HEX: 0x77
//[1]	'1':     X	 0   0   1   0   0   1   0 		HEX: 0x12
//[2]	'2':	 X	 1   1   0   1   0   1   1		HEX: 0x6b
//[3]	'3':	 X   1   0   1   1   0   1   1		HEX: 0x5b
//[4]	'4':     X   0   0   1   1   1   1   0		HEX: 0x1e
//[5]	'5':	 X   1   0   1   1   1   0   1		HEX: 0x5d
//[6]	'6':     X   1   1   1   1   1   0   1		HEX: 0x7d
//[7]	'7':     X   0   0   1   0   0   1   1		HEX: 0x13
//[8]	'8':     X   1   1   1   1   1   1   1		HEX: 0x7f
//[9]	'9':     X   1   0   1   1   1   1   1		HEX: 0x5f
//[10]	'A':     X   0   1   1   1   1   1   1      HEX: 0x3f
//[11]	'b':     X   1   1   1   1   1   0   0      HEX: 0x7c
//[12]	'c':     X   1   1   0   1   0   0   0      HEX: 0x68
//[13]	'd':     X   1   1   1   1   0   1   0      HEX: 0x7a 
//[14]	'E':     X   1   1   0   1   1   0   1      HEX: 0x6d
//[15]	'F':     X   0   1   0   1   1   0   1      HEX: 0x2d
//[16]	'G':     X
//[17]	'h':     X   0   1   1   1   1   0   0      HEX: 0x3c
//[18]	'o':     X   1   1   1   1   0   0   0      HEX: 0x78
//[19]	'-':     X   0   0   0   1   0   0   0      HEX: 0x08
//[20]	'_':	 X   1   0   0   0   0   0   0      HEX: 0x60
//[21]	' ':	 x	 0	 0	 0	 0	 0	 0	 0		HEX: 0x00 //on display 
//[22]  'a'      X   1   1   1   1   0   1   1      HEX: 0x7b
//[23]  'C'      X   0   0   1   1   1   0   1      HEX: 0x65
//[24]  'r'		 X   0   1   0   0   1   0   1      HEX: 0x25 
//[25]  'V'      x   1   1   1   0   1   1   0      HEX: 0x76
//[26]  'n'      x	 0   1   1   1   0   0   0      HEX: 0x28
//[27]  ''
//[28]	''
//------------------------- ------------------ ----------------------------//

const unsigned char LcdNum[27]=
	{
		0x77,0x12,0x6b,0x5b,0x1e,0x5d,
		0x7d,0x13,0x7f,0x5f,0x3f,0x7c,
		0x68,0x7a,0x6d,0x2d,0x00,0x3c,
		0x78,0x08,0x60,0x00,0x7b,0x65,
		0x25,0x76,0x28
	};
//Number type:('0'-'1'-'2'-'3'-'4'-'5'-'6'-'7'-'8'-'9'-'A'-'b'-'c'-'d'-'E'-'F'-'G'-'h'-'o'-'-'-'_'-' ')

const struct LcdNumArea
{
unsigned char LowAdr;
unsigned char HighAdr;
}NumNum[40] = { {0,1}  ,{2,3}  ,{4,5}  ,{6,7}  ,{8,9}  ,{10,11},{12,13},{14,15},{16,17},{18,19},
				{20,21},{22,23},{24,25},{26,27},{28,29},{30,31},{32,33},{34,35},{36,37},{38,39},
				{40,41},{42,43},{44,45},{46,47},{48,49},{50,51},{52,53},{54,55},{56,57},{58,59},
				{60,61},{62,63},{64,65},{66,67},{68,69},{70,71},{72,73},{74,75},{76,77},{78,79}
			  };
//This struck is statement the each Display-Number on LCD that what`s address at HT1623 Memory Map  
//Use NumNum[?].HighAdr/NumNum[?].LowAdr

//********************************* Main ***********************************//

void main(void)
{
	unsigned char tt;
	InitializeSystem();
	systemflag = 0x00;                         //systemflger reset
	systemflag1 = 0x00; 					   //-----------------
	while(1)
	{	
		//-------------------------------------main loop is closed value
		OPEN = 0;
		CLOSE = 0;
		//-------------------------------------Reflash time and data
		ReflashLcdTimeDpy();
		//-------------------------------------recevice whole frame from RS485?
		if(systemflag&0x80)// 
		{
//			FM1702HARTPO;
			Delay10KTCYx(5);
			systemflag &= 0x7f;
			Cmd_process();
			Uart1senddata(RevBuffer[0]+1, RevBuffer);
//			FM1702HARTPD;
		}
//		ReflashLcdTimeDpy();
     	//-------------------------------------Read card key on?
		if(systemflag1&0x01)                          	  
		{
//			FM1702HARTPO;								   //FM1702 POWERON
			InitialFM1702(0);
			systemflag1 = systemflag1 & 0xfe;              //clear flag
			carderrorbyte = IsFindCard();
			if(carderrorbyte == 0x01)
			{
				carderrorbyte = IsConflictOk();
				if(carderrorbyte == 0x01)
				{
					carderrorbyte = IsSelectCradOk();
					if(carderrorbyte == 0x01)
					{
						LEDCTRL = 0;					   //OPEN BACK LED LIGHT
						DYP_CardOn_Flg();                  //have card on					 						
						carderrorbyte = DownLoadm1CradKey(0x01,0x60);							
						if(carderrorbyte == 0x01)
						{
							carderrorbyte = ReadCardOneBank(4);
							if(carderrorbyte==0x01)
							{
								systemflag1 &= 0xbf;       //clear errorflag
								switch(RevBuffer[2])
								{
									//-------------------------------------startup mater card
									case 0x00:
												//check system serial number
												systemtemp = RevBuffer[3]+RevBuffer[4]+RevBuffer[5]-RevBuffer[14];
												if(RevBuffer[6]!=systemtemp)
												{
													carderrorbyte = 0x07;
													systemflag1|=0x40;
													break;	
												}
												//check card hart password checksum
												systemtemp = 0;
												for(systemtemp1 = 0;systemtemp1<6;systemtemp1++)
													 systemtemp += RevBuffer[systemtemp1+7];
												systemtemp-=RevBuffer[14];
												if(RevBuffer[13]!=systemtemp)
												{
													carderrorbyte = 0x0a;
													systemflag1|=0x40;
													break;
												}											
												//bank4 datas move to befor RevBuffer{18} 
												for(systemtemp1=0;systemtemp1<18;systemtemp1++)   
												{
													RevBuffer[systemtemp1+18]=RevBuffer[systemtemp1];
												}												
												//Read bank 5
												carderrorbyte = ReadCardOneBank(5);
												if(carderrorbyte!=0x01)
												{
													systemflag1|=0x40;
													break;													
												}
												//card setting price
												systemtemp = RevBuffer[6]+RevBuffer[7]+RevBuffer[8]-RevBuffer[32];
												if(systemtemp!=RevBuffer[9])
												{
													carderrorbyte = 0x0b;
													systemflag1|=0x40;
													break;							
												}
												//software card passwrod
												systemtemp = RevBuffer[2]+RevBuffer[3]+RevBuffer[4]-RevBuffer[32];
												if(systemtemp!=RevBuffer[5])
												{
													carderrorbyte = 0x08;
													systemflag1|=0x40;
													break;
												}
												//---------------------------------------------------------------
												//StartUp Card Check is complete
														
												WRITE_E2PROM(RevBuffer+21,SystemNumADD,3);
												for(systemtemp1=0;systemtemp1<3;systemtemp1++)
												{
 													READ_E2PROM(&systemtemp,SystemNumADD+systemtemp1,1);
													if(systemtemp!=RevBuffer[21+systemtemp1])
														goto writee2promerraddr;
												}

												systemtemp = 0xa5; 									//set StartUsingFlg 
												WRITE_E2PROM(&systemtemp,BeingUserFlagADD,1);
 												READ_E2PROM(&systemtemp,BeingUserFlagADD,1);
												if(systemtemp!=0xa5)
												{goto writee2promerraddr;}

												WRITE_E2PROM(RevBuffer+25,HartCardLoadPWAdd,6);
												for(systemtemp1=0;systemtemp1<6;systemtemp1++)
												{
 													READ_E2PROM(&systemtemp,HartCardLoadPWAdd+systemtemp1,1);
													if(systemtemp!=RevBuffer[25+systemtemp1])
														goto writee2promerraddr;
												}
								
												WRITE_E2PROM(RevBuffer+2,SoftcardPWADD,3);
												for(systemtemp1=0;systemtemp1<3;systemtemp1++)
												{
 													READ_E2PROM(&systemtemp,SoftcardPWADD+systemtemp1,1);
													if(systemtemp!=RevBuffer[2+systemtemp1])
														goto writee2promerraddr;
												}

												WRITE_E2PROM(RevBuffer+32,AD_DE_NumAdd,1);
 												READ_E2PROM(&systemtemp,AD_DE_NumAdd,1);
												if(systemtemp!=RevBuffer[32])
												{goto writee2promerraddr;}

												WRITE_E2PROM(RevBuffer+33,MaterWorkStateByteADD,1); 
 												READ_E2PROM(&systemtemp,MaterWorkStateByteADD,1);
												if(systemtemp!=RevBuffer[33])
												{goto writee2promerraddr;}

												WRITE_E2PROM(RevBuffer+21,SystemNumADD,3); 
												for(systemtemp1=0;systemtemp1<3;systemtemp1++)
												{
 													READ_E2PROM(&systemtemp,SystemNumADD+systemtemp1,1);
													if(systemtemp!=RevBuffer[21+systemtemp1])
														goto writee2promerraddr;
												}	
												//
												if(0)
												{
													writee2promerraddr:
													carderrorbyte = 0x26;
													systemflag1|=0x40;
													break;
												}		
												//将卡写成无效卡
												RevBuffer[0]=0x09; 
												RevBuffer[1]=0x04; 
												RevBuffer[2]=0x04;
												DsInt;		
												Cmd_process();
												OpInt;
												//display complete
									break;
									//-------------------------------------------User card
									case 0x01:
												//----------------------check system number
												for(systemtemp1=0;systemtemp1<3;systemtemp1++)
												{
													READ_E2PROM(&systemtemp,SystemNumADD+systemtemp1,1);
													if(systemtemp!=RevBuffer[systemtemp1+3])
													{
														carderrorbyte = 0x28;
														goto erroraddr1;	
													}			
												}
												//----------------------check card number
												systemtemp = 0;
												for(systemtemp1=0;systemtemp1<3;systemtemp1++)
												{
													systemtemp+=RevBuffer[6+systemtemp1];	
												}
												READ_E2PROM(&systemtemp1,AD_DE_NumAdd,1);												
												systemtemp -= systemtemp1;
												if(systemtemp!=RevBuffer[9])
												{
													carderrorbyte = 0x29;
													goto erroraddr1;	
												}	
												//----------------------check SoftCardPassWord
												for(systemtemp1=0;systemtemp1<3;systemtemp1++)
												{
													READ_E2PROM(&systemtemp,SoftcardPWADD+systemtemp1,1);
													if(systemtemp!=RevBuffer[systemtemp1+14])
													{
														carderrorbyte = 0x27;
														goto erroraddr1;	
													}			
												}
												//-----------------------take pirce
												READ_E2PROM(&systemtemp,MaterWorkStateByteADD,1);
												if(systemtemp&0x01)
												{								//if pirce from e2prom
													READ_E2PROM(Settingprice,CurrentPriceADD,3);//load price from e2prom
												}
												else
												{								//if priec from card		
													systemtemp = RevBuffer[10]+RevBuffer[11]+RevBuffer[12];
													READ_E2PROM(&systemtemp1,AD_DE_NumAdd,1);												
													systemtemp -= systemtemp1;
													if(RevBuffer[13]!=systemtemp)
													{
														carderrorbyte = 0x0b;
														goto erroraddr1;
													}			

													//load price to mcu ram
													Settingprice[0]= RevBuffer[10];
													Settingprice[1]= RevBuffer[11];
													Settingprice[2]= RevBuffer[12];	
												}
												for(systemtemp1=0;systemtemp1<18;systemtemp1++)//RevBuffer right move 18 bit   
												{
													RevBuffer[systemtemp]=RevBuffer[systemtemp+18];
												}									
												//Read Next Bank
												carderrorbyte = ReadCardOneBank(5);
												if(carderrorbyte!=0x01)
												{
													goto erroraddr1;
												}
												//check YuLiang checksum
												systemtemp = RevBuffer[2]+RevBuffer[3]+RevBuffer[4]+RevBuffer[5];
												READ_E2PROM(&systemtemp1,AD_DE_NumAdd,1);
												systemtemp -= systemtemp1;
												if(systemtemp!=RevBuffer[6])
												{
													carderrorbyte = 0x0c;
													goto erroraddr1;
												}
												systemtemp = RevBuffer[7]+RevBuffer[8]+RevBuffer[9]+RevBuffer[10];
												READ_E2PROM(&systemtemp1,AD_DE_NumAdd,1);
												systemtemp -= systemtemp1;												
												if((RevBuffer[11] != systemtemp)||(systemtemp!=RevBuffer[6]))
												{
													carderrorbyte = 0x0d;
													goto erroraddr1;
												}
												//YuLiang means what?
												READ_E2PROM(&systemtemp,MaterWorkStateByteADD,1);
												if(systemtemp&0x40)
												{//YuLiang means Yuan
													CardBalance[0]=RevBuffer[2];
													CardBalance[1]=RevBuffer[3];
													CardBalance[2]=RevBuffer[4];
													CardBalance[3]=RevBuffer[5];
												}
												else
												{
													ShenYuShuiLiang[0]=RevBuffer[2];
													ShenYuShuiLiang[1]=RevBuffer[3];
													ShenYuShuiLiang[2]=RevBuffer[4];
													ShenYuShuiLiang[3]=RevBuffer[5];
												}
												CardUsingTimes = RevBuffer[16];
												CardUsingTimes +=1;												
												systemflag |= 0x08;				//user card check is complete
												
												//error addr
												if(0)//error addr
												{
													erroraddr1:
													systemflag1|=0x40;													
												}																									
									break;
									

									//-------------------------------------------Updata metar setting card
									case 0x02:
												READ_E2PROM(&systemtemp,BeingUserFlagADD,1);
												if(systemtemp!=0xa5)
												{
													carderrorbyte = 0x09;
													systemflag1|=0x40;
													break;
												}
												//----------------------check system number
												for(systemtemp1=0;systemtemp1<3;systemtemp1++)
												{
													READ_E2PROM(&systemtemp,SystemNumADD+systemtemp1,1);
													if(systemtemp!=RevBuffer[systemtemp1+3])
													{
														carderrorbyte = 0x28;
														systemflag1|=0x40;
														break;	
													}			
												}
												//-----------------------check softcardpassword
												for(systemtemp1=0;systemtemp1<3;systemtemp1++)
												{
													READ_E2PROM(&systemtemp,SoftcardPWADD+systemtemp1,1);
													if(systemtemp!=RevBuffer[systemtemp1+6])
													{
														carderrorbyte = 0x27;
														systemflag1|=0x40;
														break;	
													}			
												}
												if(systemflag1&0x40)
												{
													break;

⌨️ 快捷键说明

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