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

📄 main.src

📁 电能表源码
💻 SRC
📖 第 1 页 / 共 5 页
字号:
; 	         {if(checkone_bcd(wr_buff[0])==true)
;  		        { ram[RAM_engzaddr_f+3]=wr_buff[0];
; 			      couren_addrdot_f=data_addr.word[1]+1;
; 			      value1=1;
; 			      break;
; 			    }
; 	       }
; 	    }
;  return value1;
; }
; */
; 
; 
; /*
; //======================================================
; //函数名称:recover_dot()
; //函数功能:从FLASH中读取正向有功电量小数点部分,1个字节
; //备注:
; //======================================================
; unsigned char  Recover_dot(void)
; { unsigned int i;
;   unsigned char j,value1;
;   value1=0;
;   data_addr.word[1]=FL_engdotaddrtwo_z+511;
;   Read_data(FLASH,1);
;   if(wr_buff[0]==0xff)                                 //搜索第一非0xff的数据,作为上次停电保存数据。
;      { for(i=0;i<1024;i++)
;         { Read_data(FLASH,1);
; 	      (data_addr.word[1])--;
;           if(wr_buff[0]!=0xff)
; 	         {if(checkone_bcd(wr_buff[0])==true)
;  		        { ram[RAM_engzaddr_z+3]=wr_buff[0];
; 			      couren_addrdot_z=data_addr.word[1]+1;
; 			      value1=1;
; 			      break;
; 			    }
; 	       }
; 	    }
;     }
;   else                                               //如果最后一位都是非0xff,则另做处理
;    { data_addr.word[1]=FL_engdotaddrone_z;
;      for(j=0;j<100;j++)
; 	   {Read_data(FLASH,1);
; 	    data_addr.word[1]++;
; 		if(wr_buff[0]==0xff)
; 		   break;
;        }
; 	 if(data_addr.word[1]>(FL_engdotaddrone_z+1))                                  //有可能是上次停电时没有擦除的数据
; 	   {for(data_addr.word[1]=data_addr.word[1]-2;data_addr.word[1]>=FL_engdotaddrone_z;data_addr.word[1]--)
; 	      { Read_data(FLASH,1);
; 	        if(checkone_bcd(wr_buff[0])==true)
;  		       { ram[RAM_engzaddr_z+3]=wr_buff[0];
; 			     couren_addrdot_z=data_addr.word[1];
; 		         value1=1;
; 		         break;
; 		       }
; 	      }
; 	    }
; 	 else                                                                //也可能恰好是最后一次存贮的数据。
;        { for(data_addr.word[1]=FL_engdotaddrtwo_z+511;data_addr.word[1]>=FL_engdotaddrtwo_z;data_addr.word[1]--)
; 	       { Read_data(FLASH,1);
; 	         if(checkone_bcd(wr_buff[0])==true)
;  		       { ram[RAM_engzaddr_z+3]=wr_buff[0];
; 			     couren_addrdot_z=data_addr.word[1];
; 		         value1=1;
; 				 break;
; 		       }
; 		   }
; 	   } 
;     } 
;  return value1;
; }
; 
; */
; 
; 
; //=======================================================
; //函数功能:根据校验和恢复电量整数
; //返回值:1 恢复成功    0 恢复失败
; //=======================================================
; unsigned char recover_checksum(uint16 addr)

	RSEG  ?PR?_recover_checksum?MAIN
_recover_checksum:
	USING	0
			; SOURCE LINE # 417
	MOV  	DPTR,#addr?644
	MOV  	A,R6
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R7
	MOVX 	@DPTR,A
; { uint8 i,j,sum,value,value1;
			; SOURCE LINE # 418
;   value=0;
			; SOURCE LINE # 419
	CLR  	A
	MOV  	DPTR,#value?648
	MOVX 	@DPTR,A
;   for(i=0;i<2;i++)                          //从三备份中找出正确的数据
			; SOURCE LINE # 420
	MOV  	DPTR,#i?645
	MOVX 	@DPTR,A
?C0023:
	MOV  	DPTR,#i?645
	MOVX 	A,@DPTR
	MOV  	R7,A
	CLR  	C
	SUBB 	A,#02H
	JC   	$ + 5H
	LJMP 	?C0024
;      { data_addr.word[1]=addr+256*i;
			; SOURCE LINE # 421
	MOV  	A,R7
	MOV  	R6,A
	MOV  	DPTR,#addr?644+01H
	MOVX 	A,@DPTR
	ADD  	A,#00H
	MOV  	R7,A
	MOV  	DPTR,#addr?644
	MOVX 	A,@DPTR
	ADDC 	A,R6
	LCALL	L?0221
;        Read_data(FLASH,4);
			; SOURCE LINE # 422
	MOV  	R5,#04H
	MOV  	R7,#02H
	LCALL	_Read_data
;        sum=0;
			; SOURCE LINE # 423
	CLR  	A
	MOV  	DPTR,#sum?647
	MOVX 	@DPTR,A
; 	   value1=1;
			; SOURCE LINE # 424
	MOV  	DPTR,#value1?649
	INC  	A
	MOVX 	@DPTR,A
; 	   for(j=0;j<3;j++)                           //校验和检测
			; SOURCE LINE # 425
	CLR  	A
	MOV  	DPTR,#j?646
	MOVX 	@DPTR,A
?C0026:
	MOV  	DPTR,#j?646
	MOVX 	A,@DPTR
	MOV  	R7,A
	CLR  	C
	SUBB 	A,#03H
	JNC  	?C0027
; 	       { if(checkone_bcd(wr_buff[j])==1)      //首先检测是否为BCD码。
			; SOURCE LINE # 426
	LCALL	L?0222
	LCALL	_checkone_bcd
	CJNE 	R7,#01H,?C0029
; 		       { sum=sum+wr_buff[j];
			; SOURCE LINE # 427
	MOV  	DPTR,#j?646
	MOVX 	A,@DPTR
	ADD  	A,#LOW (wr_buff)
	LCALL	L?0224
	MOV  	DPTR,#sum?647
	MOVX 	A,@DPTR
	ADD  	A,R7
	MOVX 	@DPTR,A
; 			   }
			; SOURCE LINE # 428
	SJMP 	?C0028
?C0029:
; 			 else
; 			   { value1=0;
			; SOURCE LINE # 430
	CLR  	A
	MOV  	DPTR,#value1?649
	MOVX 	@DPTR,A
; 			     break;
			; SOURCE LINE # 431
	SJMP 	?C0027
; 			   }
			; SOURCE LINE # 432
; 		   }
			; SOURCE LINE # 433
?C0028:
	MOV  	DPTR,#j?646
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
	SJMP 	?C0026
?C0027:
; 	   if(value1==1)                                      //BCD码错误,取下一组数据
			; SOURCE LINE # 434
	MOV  	DPTR,#value1?649
	MOVX 	A,@DPTR
	XRL  	A,#01H
	JNZ  	?C0025
;            { if((sum+0x33)==wr_buff[3])                   //BCD 校验和都正确
			; SOURCE LINE # 435
	MOV  	DPTR,#sum?647
	MOVX 	A,@DPTR
	ADD  	A,#033H
	MOV  	R7,A
	CLR  	A
	RLC  	A
	MOV  	R6,A
	MOV  	DPTR,#wr_buff+03H
	MOVX 	A,@DPTR
	XRL  	A,R7
	JNZ  	?C0198
	MOV  	A,R6
?C0198:
	JNZ  	?C0025
; 		       { value=1;                                 //置标志位
			; SOURCE LINE # 436
	MOV  	DPTR,#value?648
	INC  	A
	MOVX 	@DPTR,A
; 			     addr_baseonIDandtype(RAM,ID_POSENGSUM);  //正向有功 
			; SOURCE LINE # 437
	MOV  	R5,#00H
	MOV  	R4,A
	CLR  	A
	MOV  	R7,A
	LCALL	_addr_baseonIDandtype
;                  data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
			; SOURCE LINE # 438
	LCALL	L?0217
	LCALL	L?0220
;  	             Write_data((*ID_coretalbpoint[0]).stortype,(*ID_coretalbpoint[0]).datalong-1); 
			; SOURCE LINE # 439
	LCALL	L?0246
	DEC  	A
	MOV  	R5,A
	LCALL	_Write_data
; 			     break;
			; SOURCE LINE # 440
	SJMP 	?C0024
;     		   }
			; SOURCE LINE # 441
;  		   }
			; SOURCE LINE # 442
; 	}
			; SOURCE LINE # 443
?C0025:
	MOV  	DPTR,#i?645
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
	LJMP 	?C0023
?C0024:
;  return value;
			; SOURCE LINE # 444
	MOV  	DPTR,#value?648
	MOVX 	A,@DPTR
	MOV  	R7,A
; }
			; SOURCE LINE # 445
?C0033:
	RET  	
; END OF _recover_checksum

; 
; 
; //==============================================================
; //函数功能:恢复电量的整数部分,3个字节
; //备注:1、恢复数据放在wr_buff中
; //       2、返回1表示恢复正确数据、0表示恢复错误
; //===============================================================
; 
; 
; uint8 Recover_int(void)

	RSEG  ?PR?Recover_int?MAIN
Recover_int:
	USING	0
			; SOURCE LINE # 455
; { uint8  value,i;
			; SOURCE LINE # 456
;   uint16 temp_addr;
;   value=0; 
			; SOURCE LINE # 458
	CLR  	A
	MOV  	DPTR,#value?750
	MOVX 	@DPTR,A
;   couren_addrint=FL_enginttwo_a;
			; SOURCE LINE # 459
;   offset_inteng=24;
			; SOURCE LINE # 460
;   temp_addr=couren_addrint+4*offset_inteng;
			; SOURCE LINE # 461
	LCALL	L?0228
?C0199:
	CLR  	C
	RLC  	A
	XCH  	A,R6
	RLC  	A
	XCH  	A,R6
	DJNZ 	R0,?C0199
;   if(recover_checksum(temp_addr)!=true)
			; SOURCE LINE # 462
	LCALL	L?0240
	MOV  	A,R7
	XRL  	A,#01H
	JZ   	?C0034
;      { for(i=0;i<50;i++)
			; SOURCE LINE # 463
	CLR  	A
	MOV  	DPTR,#i?751
	MOVX 	@DPTR,A
?C0035:
;           { temp_addr=couren_addrint+4*offset_inteng;
			; SOURCE LINE # 464
	LCALL	L?0230
?C0200:
	CLR  	C
	RLC  	A
	XCH  	A,R6
	RLC  	A
	XCH  	A,R6
	DJNZ 	R0,?C0200
	MOV  	R7,A
	MOV  	DPTR,#couren_addrint+01H
	MOVX 	A,@DPTR
	ADD  	A,R7
	MOV  	R7,A
	MOV  	DPTR,#couren_addrint
	MOVX 	A,@DPTR
	ADDC 	A,R6
; 	        if(recover_checksum(temp_addr)==true)            //数据合法,退出循环
			; SOURCE LINE # 465
	LCALL	L?0281
	CJNE 	R7,#01H,?C0038
; 	          { value=1;
			; SOURCE LINE # 466
; 			    break;
			; SOURCE LINE # 467
	LJMP 	?C0208
; 			   }
			; SOURCE LINE # 468
?C0038:
; 			else                                            //数据不合法                                       
; 			   { if(offset_inteng>0)
			; SOURCE LINE # 470
	SETB 	C
	MOV  	DPTR,#offset_inteng+01H
	MOVX 	A,@DPTR
	SUBB 	A,#00H
	MOV  	DPTR,#offset_inteng
	MOVX 	A,@DPTR
	SUBB 	A,#00H
	JC   	?C0040
; 			       offset_inteng--;
			; SOURCE LINE # 471
	MOV  	A,#0FFH
	MOV  	B,A
	LCALL	?C?IILDX
	SJMP 	?C0037
?C0040:
; 			     else
; 			        { offset_inteng=24;
			; SOURCE LINE # 473
	MOV  	DPTR,#offset_inteng
	CLR  	A
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,#018H
	MOVX 	@DPTR,A
; 				      couren_addrint=FL_engintone_a;
			; SOURCE LINE # 474
	LCALL	L?0259
; 				    }
			; SOURCE LINE # 475
; 			   }
			; SOURCE LINE # 476
;           }
			; SOURCE LINE # 477
?C0037:
	MOV  	DPTR,#i?751
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
	MOVX 	A,@DPTR
	CLR  	C
	SUBB 	A,#032H
	JC   	?C0035
	SJMP 	?C0042
; 	 }
			; SOURCE LINE # 478
?C0034:
;   else
;      { couren_addrint=FL_engintone_a;
			; SOURCE LINE # 480
	LCALL	L?0259
;        offset_inteng=0;
			; SOURCE LINE # 481
	MOV  	DPTR,#offset_inteng
	MOVX 	@DPTR,A
	INC  	DPTR
; 	   temp_addr=couren_addrint+4*offset_inteng;
			; SOURCE LINE # 482
	LCALL	L?0229
?C0201:
	CLR  	C
	RLC  	A
	XCH  	A,R6
	RLC  	A
	XCH  	A,R6
	DJNZ 	R0,?C0201
	ADD  	A,#00H
	MOV  	R7,A
	MOV  	A,R6
	ADDC 	A,#07CH
; 	   if(recover_checksum(temp_addr)!=true)
			; SOURCE LINE # 483
	LCALL	L?0281
	MOV  	A,R7
	XRL  	A,#01H
	JZ   	?C0043
; 	      { couren_addrint=FL_enginttwo_a;
			; SOURCE LINE # 484
;             offset_inteng=24;
			; SOURCE LINE # 485
; 	        temp_addr=couren_addrint+4*offset_inteng;
			; SOURCE LINE # 486
	LCALL	L?0228
?C0202:
	CLR  	C
	RLC  	A
	XCH  	A,R6
	RLC  	A
	XCH  	A,R6
	DJNZ 	R0,?C0202
; 			recover_checksum(temp_addr);
			; SOURCE LINE # 487
	LCALL	L?0240
; 			value=1;
			; SOURCE LINE # 488
; 		  }
			; SOURCE LINE # 489
	SJMP 	?C0209
?C0043:
; 	   else
; 	      { value=1;
			; SOURCE LINE # 491
?C0208:
?C0209:
	MOV  	DPTR,#value?750
	MOV  	A,#01H
	MOVX 	@DPTR,A
; 		  }
			; SOURCE LINE # 492
; 	 }
			; SOURCE LINE # 493
?C0042:
; 
;   return value;
			; SOURCE LINE # 495
	MOV  	DPTR,#value?750
	MOVX 	A,@DPTR
	MOV  	R7,A
; }  
			; SOURCE LINE # 496
?C0045:
	RET  	
L?0240:
	ADD  	A,#00H
	MOV  	R7,A
	MOV  	A,R6
	ADDC 	A,#07EH
	MOV  	R6,A
	MOV  	DPTR,#temp_addr?752
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R7
	MOVX 	@DPTR,A
	LCALL	_recover_checksum
	RET  	
L?0281:
	MOV  	R6,A
	MOV  	DPTR,#temp_addr?752
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R7
	MOVX 	@DPTR,A
	LCALL	_recover_checksum
	RET  	
; END OF Recover_int

; 
; //-----------------------------------------------------
; //函数功能:恢复电量数据
; //备注:
; //----------------------------------------------------
; void Recover_eng(void)

	RSEG  ?PR?Recover_eng?MAIN
Recover_eng:
	USING	0
			; SOURCE LINE # 502
; { uint8 i;
			; SOURCE LINE # 503
; /*
;   if(Recover_dot()==false)                 //恢复正向有功电量小数部分出错
;      { ram[RAM_engzaddr_z+3]=0x00;         //恢复为零
;        F_askerasdotone_z=1;                //擦flash
; 	   F_askerasdottwo_z=1;
;        couren_addrdot_z=FL_engdotaddrone_z;    
; 	 }
;   else                                     //恢复正向有功电量小数部分正确
;      {if(couren_addrdot_z<FL_engdotaddrtwo_z)
; 	     { F_askerasdottwo_z=1;
;            F_askerasdotone_z=0;
; 		 }
; 	  else
; 	     { F_askerasdotone_z=1; 
;            F_askerasdottwo_z=0;
; 		 }
; 	 }
; 
;   if(Recover_dot_f()==false)              //恢复反向有功小数出错
;      { ram[RAM_engzaddr_f+3]=0x00;         //恢复为零
;        F_askerasdot_f=1;                //擦flash
; 	   couren_addrdot_f=FL_engdotaddr_f;
; 	 }
;   else
;       F_askerasdot_f=0; 
; */
;   
;   if(Recover_int()==false)                //int err
			; SOURCE LINE # 531
	LCALL	Recover_int
	MOV  	A,R7
	JNZ  	?C0046
;      { addr_baseonIDandtype(RAM,ID_POSENGSUM);       //正向有功 
			; SOURCE LINE # 532
	MOV  	R5,A
	MOV  	R4,#01H
	MOV  	R7,A
	LCALL	_addr_baseonIDandtype
;        for(i=0;i<3;i++)
			; SOURCE LINE # 533
;---- Variable 'i?853' assigned to Register 'R7' ----
	CLR  	A
	MOV  	R7,A
?C0047:
;           {ram[(*ID_coretalbpoint[0]).dataaddr+i]=0;
			; SOURCE LINE # 534
	LCALL	L?0217
	LCALL	L?0226
	CLR  	A
	MOVX 	@DPTR,A
; 		  // ram[RAM_engzaddr_f+i]=0;
;           }
			; SOURCE LINE # 536
	INC  	R7
	MOV  	A,R7
	CJNE 	A,#03H,?C0047
?C0048:
;        couren_addrint=FL_engintone_a;
			; SOURCE LINE # 537
	LCALL	L?0260
; 	   offset_inteng=0;
			; SOURCE LINE # 538
	MOV  	DPTR,#offset_inteng
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
;        F_askerasintone=1;
			; SOURCE LINE # 539
	MOV  	DPTR,#flag_ereasflash01
	MOVX 	A,@DPTR
	ORL  	A,#01H
	MOVX 	@DPTR,A
; 	   F_askerasinttwo=1;
			; SOURCE LINE # 540
	MOVX 	A,@DPTR
	ORL  	A,#02H
	MOVX 	@DPTR,A
; 	 }
			; SOURCE LINE # 541
	RET  	
?C0046:
;   else                                    //int ok

⌨️ 快捷键说明

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