📄 main.src
字号:
; {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 + -