📄 main.src
字号:
; *point = 0x00; //close LCD display
; point = 0x28d1;
; *point = 0x01; //close LCD clock
;
; point = 0x2894;
; *point = 0x00;
; //close analog circuit
;
; point = 0x2898;
; *point = 0x00;
;
; point = 0x2896;
; *point = 0x0c;
; point = 0x2897;
; *point = 0x00;
; // point = 0x28d0;
; // *point = 0x01; //using OSC
;
; }
;
; ------------------------------------------------------------------*/
;
; /*
; void SetAnalogPara2(void)
; { // CrtlLDO |= DGEN;
; CrtlGA = 0x33; // 0x2888
; CrtlGB = 0x33; // 0x2889
; CrtlGU = 0x31; // 0x288a
; CrtlADC = 0x37; // 0x2894
; // CrtlIAT = 0x00;
; // CrtlCLK = 0x85;
;
; // CrtlIAT = 0x7f; // 0x288c
; // CrtlIAD = 0x12; // 0x288d
; // CrtlIBT = 0x01; // 0x288e
; // CrtlIBD = 0x12; // 0x288f
; // CrtlUT = 0x7f; // 0x2890
; // CrtlBGP = 0x00; // 0x2892
; // CrtlPow = 0x80; // 0x2893
; CrtlCry = 0x03; // 0x2895
; CrtlLDO = 0x11; // 0x2896
; }
;
; */
;
; //=================================================
; //函数功能: 初始化Timer0
; //
; //=================================================
; void Init_Timer0(void)
RSEG ?PR?Init_Timer0?MAIN
Init_Timer0:
USING 0
; SOURCE LINE # 163
; {
; SOURCE LINE # 164
; TMOD = 0x01; // 工作在模式1
; SOURCE LINE # 165
MOV TMOD,#01H
; CKCON|=0x08; // clk/4
; SOURCE LINE # 166
ORL CKCON,#08H
; TL0 = 0xff; //10ms
; SOURCE LINE # 167
MOV TL0,#0FFH
; TH0 = 0xdf;
; SOURCE LINE # 168
MOV TH0,#0DFH
; TR0 = 1; // 开定时器0
; SOURCE LINE # 169
SETB TR0
; Ctor_intrupt(1,1); //打开中断
; SOURCE LINE # 170
MOV R5,#01H
MOV R7,#01H
LJMP _Ctor_intrupt
; END OF Init_Timer0
; //SetInterrupt(1); //打开中断
;
; }
;
; //===========================================
; //函数功能:初始化io口
; //
; //===========================================
; void Init_io(void)
RSEG ?PR?Init_io?MAIN
Init_io:
; SOURCE LINE # 179
; {
; SOURCE LINE # 180
; P1_1OE=1;
; SOURCE LINE # 181
MOV DPTR,#P1OE_ADDR
; P1_2OE=1;
; SOURCE LINE # 182
; P1_1IE=0;
; SOURCE LINE # 183
LCALL L?0275
ANL A,#0FDH
MOVX @DPTR,A
; P1_2IE=0;
; SOURCE LINE # 184
MOVX A,@DPTR
ANL A,#0FBH
MOVX @DPTR,A
; P2_3OE=0;
; SOURCE LINE # 185
MOV DPTR,#P2OE_ADDR
MOVX A,@DPTR
ANL A,#0F7H
MOVX @DPTR,A
; P2_3OD=0;
; SOURCE LINE # 186
MOV DPTR,#P2OD_ADDR
MOVX A,@DPTR
ANL A,#0F7H
MOVX @DPTR,A
; P0OE=0;
; SOURCE LINE # 187
CLR A
MOV DPTR,#P0OE_ADDR
MOVX @DPTR,A
; P0OD=0;
; SOURCE LINE # 188
MOV DPTR,#P0OD_ADDR
MOVX @DPTR,A
; P0IE=0xff;
; SOURCE LINE # 189
MOV DPTR,#P0IE_ADDR
MOV A,#0FFH
MOVX @DPTR,A
; }
; SOURCE LINE # 190
RET
; END OF Init_io
;
; //==========================================
; //函数功能:系统初始化,
; //备注:初始化模拟部分和数字部分寄存器
; //===========================================
; void Init_System(void)
RSEG ?PR?Init_System?MAIN
Init_System:
USING 0
; SOURCE LINE # 196
; {
; SOURCE LINE # 197
; port_init(); //初始化io口
; SOURCE LINE # 198
LCALL port_init
; // SetPLL(); //开pll电路
; InitMeter(); //初始化计量电路
; SOURCE LINE # 200
LCALL InitMeter
; SetMeterFunc(0x07); //启动关闭,A通道计量,关CF输出
; SOURCE LINE # 201
MOV R7,#07H
LCALL _SetMeterFunc
; //SetAnalogPara2(); //初始化模拟电路
; SetADC(1,8); //A通道电流,采用8倍增益
; SOURCE LINE # 203
MOV R5,#08H
MOV R7,#01H
LCALL _SetADC
; SetADC(2,8); //B通道电流,采用8倍增益
; SOURCE LINE # 204
MOV R5,#08H
MOV R7,#02H
LCALL _SetADC
; SetADC(3,8); //电压通道,采用8倍增益
; SOURCE LINE # 205
MOV R5,#08H
MOV R7,#03H
LCALL _SetADC
; SetXRam(1); //开启对XRAM的写保护
; SOURCE LINE # 206
MOV R7,#01H
LCALL _SetXRam
; //Init_eeprom(); //初始化EEPROM 上电误操作
; Init_Timer0();
; SOURCE LINE # 208
LJMP Init_Timer0
; END OF Init_System
; }
;
; //============================================================================
; //读取CF脉冲
; //===========================================================================
; void read_encount(void)
RSEG ?PR?read_encount?MAIN
read_encount:
USING 0
; SOURCE LINE # 214
; { unsigned char temp_CF,temp_data;
; SOURCE LINE # 215
; temp_data=ReadMeterFunc();
; SOURCE LINE # 216
LCALL ReadMeterFunc
;---- Variable 'temp_data?441' assigned to Register 'R7' ----
; if((temp_data&0x40)!=0x40)
; SOURCE LINE # 217
MOV A,R7
JB ACC.6,?C0005
; buffer_energ[0]=ReadMeterPara(12)+ReadMeterPara(9); //读有功脉冲数
; SOURCE LINE # 218
MOV R7,#09H
LCALL _ReadMeterPara
MOV A,R4
PUSH ACC
MOV A,R5
PUSH ACC
MOV A,R6
PUSH ACC
MOV A,R7
PUSH ACC
MOV R7,#0CH
LCALL _ReadMeterPara
POP ACC
MOV R3,A
POP ACC
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
LCALL ?C?LADD
SJMP ?C0207
?C0005:
; else
; buffer_energ[0]=ReadMeterPara(15);
; SOURCE LINE # 220
MOV R7,#0FH
LCALL _ReadMeterPara
?C0207:
MOV DPTR,#buffer_energ
LCALL ?C?LSTXDATA
?C0006:
; if(buffer_energ[0]>buffer_energ[1]) //如果脉冲数有增加
; SOURCE LINE # 221
MOV DPTR,#buffer_energ+04H
LCALL ?C?LLDXDATA
MOV DPTR,#buffer_energ
LCALL ?C?LLDXDATA0
SETB C
LCALL ?C?ULCMP
JC ?C0011
; { temp_CF=buffer_energ[0]-buffer_energ[1]; //计算增加的脉冲数
; SOURCE LINE # 222
MOV DPTR,#buffer_energ+04H
LCALL ?C?LLDXDATA
XCH A,R3
MOV A,R7
XCH A,R3
MOV DPTR,#buffer_energ
LCALL ?C?LLDXDATA
CLR C
MOV A,R7
SUBB A,R3
MOV R7,A
;---- Variable 'temp_CF?440' assigned to Register 'R7' ----
; sumCF_Z=sumCF_Z+temp_CF; //能量脉冲累加
; SOURCE LINE # 223
MOV DPTR,#sumCF_Z
MOVX A,@DPTR
ADD A,R7
MOVX @DPTR,A
; num_xuliangCF_z=num_xuliangCF_z+temp_CF; //需量脉冲累加
; SOURCE LINE # 224
MOV DPTR,#num_xuliangCF_z
CLR A
MOV B,R7
LCALL ?C?IILDX
; if(num_xuliangCF_z==1) //第一个脉冲启动计数器
; SOURCE LINE # 225
MOV DPTR,#num_xuliangCF_z
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
XRL A,#01H
ORL A,R6
JNZ ?C0008
; time_count_z=0;
; SOURCE LINE # 226
MOV DPTR,#time_count_z
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
SJMP ?C0009
?C0008:
; else if(num_xuliangCF_z>1) //如果脉冲大于1,则记录时间
; SOURCE LINE # 227
SETB C
MOV A,R7
SUBB A,#01H
MOV A,R6
SUBB A,#00H
JC ?C0009
; time_maichong_z=time_count_z;
; SOURCE LINE # 228
MOV DPTR,#time_count_z
MOVX A,@DPTR
MOV R7,A
INC DPTR
MOVX A,@DPTR
MOV DPTR,#time_maichong_z
XCH A,R7
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
?C0009:
; buffer_energ[1]=buffer_energ[0];
; SOURCE LINE # 229
MOV DPTR,#buffer_energ
LCALL ?C?LLDXDATA
MOV DPTR,#buffer_energ+04H
LCALL ?C?LSTXDATA
; //qidong_time=0;
; }
; SOURCE LINE # 231
; /*
; buffer_energ_F[0]=ReadMeterPara(9); //读反向有功脉冲数
; if(buffer_energ_F[0]>buffer_energ_F[1])
; { temp_CF=buffer_energ_F[0]-buffer_energ_F[1];
; sumCF_F=sumCF_F+temp_CF;
; num_xuliangCF_f=num_xuliangCF_f+temp_CF;
; if(num_xuliangCF_f==1)
; time_count_f=0;
; else if(num_xuliangCF_f>1) //如果脉冲大于1,则记录时间
; time_maichong_f=time_count_f;
; if(ram[RAM_modeengadd]==1) //有功组合方式,反记入正
; { sumCF_Z=sumCF_Z+temp_CF; //能量脉冲累加
; num_xuliangCF_z=num_xuliangCF_z+temp_CF; //需量脉冲累加
; if(num_xuliangCF_z==1) //第一个脉冲启动计数器
; time_count_z=0;
; else if(num_xuliangCF_z>1) //如果脉冲大于1,则记录时间
; time_maichong_z=time_count_z;
; }
; buffer_energ_F[1]=buffer_energ_F[0];
; }
; */
; }
; SOURCE LINE # 253
?C0011:
RET
; END OF read_encount
;
; /*
; //==================================================
; //函数功能:恢复月平均功率因数
; //
; //==================================================
; void Recover_yinshu(void)
; { uint8 i,value;
; value=0;
;
; offset_yinshuflash=127;
; for(i=0;i<128;i++)
; { data_addr.word[1]=FL_yinshu+4*offset_yinshuflash; //xx.xxxx
; Read_data(FLASH,3);
; if(check_X_bcd(3,wr_buff)==1) //如果数据合法
; { data_addr.word[1]=RAM_yinshu;
; Write_data(RAM,3);
; buff_yingshu=value_hex_from_2bcd(&ram[RAM_yinshu]); //转为hex码
; buff_yingshu=buff_yingshu*100+value_hex_from_bcd(ram[RAM_yinshu+2]);
; value=1;
; }
; else
; offset_yinshuflash--;
; }
; if(value==0) //如果恢复出错
; { F_askerasyingshu=1; //擦flash
; for(i=0;i<3;i++)
; ram[i+RAM_yinshu]=0;
; buff_yingshu=0;
; }
; else
; F_askerasyingshu=0;
; }
; */
;
;
; //====================================================
; //函数功能:恢复需量数据
; //====================================================
; void Recover_xuliang(void)
RSEG ?PR?Recover_xuliang?MAIN
Recover_xuliang:
USING 0
; SOURCE LINE # 293
; { uint8 i,value;
; SOURCE LINE # 294
; value=0;
; SOURCE LINE # 295
CLR A
MOV DPTR,#value?543
MOVX @DPTR,A
; offset_xuliangaddr=55;
; SOURCE LINE # 296
MOV DPTR,#offset_xuliangaddr
MOVX @DPTR,A
INC DPTR
MOV A,#037H
MOVX @DPTR,A
; for(i=0;i<56;i++)
; SOURCE LINE # 297
CLR A
MOV DPTR,#i?542
MOVX @DPTR,A
?C0012:
; { data_addr.word[1]=FL_maxxuliang+offset_xuliangaddr*9;
; SOURCE LINE # 298
MOV DPTR,#offset_xuliangaddr
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV R4,#00H
MOV R5,#09H
LCALL ?C?IMUL
CLR A
ADD A,R7
MOV R7,A
MOV A,R6
ADDC A,#07AH
LCALL L?0221
; Read_data(FLASH,9);
; SOURCE LINE # 299
MOV R7,#02H
LCALL _Read_data
; if(check_X_bcd(8,wr_buff)==1) //如果数据合法
; SOURCE LINE # 300
LCALL L?0248
MOV R7,#08H
LCALL _check_X_bcd
MOV A,R7
XRL A,#01H
JNZ ?C0015
; { addr_baseonIDandtype(RAM,ID_XULENGPOSSUM);
; SOURCE LINE # 301
MOV R5,A
MOV R4,#041H
MOV R7,A
LCALL _addr_baseonIDandtype
; data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
; SOURCE LINE # 302
LCALL L?0217
LCALL L?0219
; Write_data((*ID_coretalbpoint[0]).stortype,(*ID_coretalbpoint[0]).datalong);
; SOURCE LINE # 303
LCALL L?0245
MOV R5,A
LCALL _Write_data
; value=1;
; SOURCE LINE # 304
MOV DPTR,#value?543
MOV A,#01H
MOVX @DPTR,A
; }
; SOURCE LINE # 305
SJMP ?C0014
?C0015:
; else
; offset_xuliangaddr--;
; SOURCE LINE # 307
MOV DPTR,#offset_xuliangaddr
MOV A,#0FFH
MOV B,A
LCALL ?C?IILDX
; }
; SOURCE LINE # 308
?C0014:
MOV DPTR,#i?542
MOVX A,@DPTR
INC A
MOVX @DPTR,A
MOVX A,@DPTR
CLR C
SUBB A,#038H
JC ?C0012
?C0013:
; if(value==0) //如果恢复出错
; SOURCE LINE # 309
MOV DPTR,#value?543
MOVX A,@DPTR
JNZ ?C0017
; { F_askerasxuliang=1; //擦flash
; SOURCE LINE # 310
MOV DPTR,#flag_ereasflash01
MOVX A,@DPTR
ORL A,#04H
MOVX @DPTR,A
; for(i=0;i<8;i++)
; SOURCE LINE # 311
CLR A
MOV DPTR,#i?542
MOVX @DPTR,A
?C0018:
MOV DPTR,#i?542
MOVX A,@DPTR
MOV R7,A
CLR C
SUBB A,#08H
JNC ?C0019
; wr_buff[i]=0;
; SOURCE LINE # 312
MOV A,#LOW (wr_buff)
ADD A,R7
MOV DPL,A
CLR A
ADDC A,#HIGH (wr_buff)
MOV DPH,A
CLR A
MOVX @DPTR,A
MOV DPTR,#i?542
MOVX A,@DPTR
INC A
MOVX @DPTR,A
SJMP ?C0018
?C0019:
; addr_baseonIDandtype(RAM,ID_XULENGPOSSUM);
; SOURCE LINE # 313
MOV R5,#00H
MOV R4,#041H
CLR A
MOV R7,A
LCALL _addr_baseonIDandtype
; data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
; SOURCE LINE # 314
LCALL L?0217
LCALL L?0219
; Write_data((*ID_coretalbpoint[0]).stortype,(*ID_coretalbpoint[0]).datalong);
; SOURCE LINE # 315
LCALL L?0245
MOV R5,A
LJMP _Write_data
; }
; SOURCE LINE # 316
?C0017:
; else
; F_askerasxuliang=0;
; SOURCE LINE # 318
MOV DPTR,#flag_ereasflash01
MOVX A,@DPTR
ANL A,#0FBH
MOVX @DPTR,A
; }
; SOURCE LINE # 319
?C0022:
RET
; END OF Recover_xuliang
; /*
;
; //======================================================
; //函数名称:recover_dot_f()
; //函数功能:从FLASH中读取反向有功电量小数点部分,1个字节
; //备注:
; //======================================================
; unsigned char Recover_dot_f(void)
; { unsigned int i;
; unsigned char value1;
; value1=0;
; data_addr.word[1]=FL_engdotaddr_f+511;
; Read_data(FLASH,1);
; for(i=0;i<512;i++)
; { Read_data(FLASH,1);
; data_addr.word[1]--;
; if(wr_buff[0]!=0xff)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -