📄 rtc_dsp.lst
字号:
211 1 if(DspFlag==1) //显示刷新标志位(1秒刷新一次)
212 1 {
213 2 DspFlag = 0; //清除显示刷新标志位
214 2
215 2 //※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
216 2 if(CommSec==0x00) //通讯指示灯灭,指示时间超出或没有通讯产生
217 2 {
218 3 LED_COMM = 1;
219 3 }
220 2 else
221 2 {
222 3 LED_COMM = 0; //通讯指示灯亮
223 3 CommSec--; //维持时间减一
224 3 }
225 2 //※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
226 2
227 2
228 2 //※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
229 2 if(Sec==0x59)
230 2 {
231 3 //整分时刻任务事件处理
232 3
233 3 RTC_Read(); //1分钟间隔校时
234 3
235 3 if(Sec<=0x02) //3秒时间窗口
236 3 {
237 4 if(Min&0x01) RTC_BAK(); //逢单时间备份(2分钟备份一次)
238 4
239 4 AdjDate = DateTerm(); //日期条件检查
240 4
241 4 if(((Min==0x00)||(Min==0x30))) //半小时间隔判断检查
C51 COMPILER V7.50 RTC_DSP 04/13/2007 13:24:54 PAGE 5
242 4 {
243 5 Fee_Flag = 1; //时段费率检查标志位
244 5
245 5 RTC_Init(); //时钟配置初始化(刷新)
246 5
247 5 if(Min==0x00) //整点时刻任务处理
248 5 {
249 6 EryBln_Flag = 1; //电量冻结计算标志
250 6 Temp_Equalize(); //1小时时钟温度补偿
251 6 }
252 5 }
253 4 }
254 3 }
255 2 else SECINC(); //秒加1
256 2
257 2
258 2 //※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
259 2
260 2 Rev_Proc(); //电能反向事件处理
261 2
262 2 Dsp_Proc(); //显示处理
263 2 }
264 1
265 1 if(CommFlag==0) //不在通讯状态
266 1 {
267 2 HW38K = 1;
268 2
269 2 if(COMMSEL==0) KBMASK = 0x40; //默认红外通讯
270 2
271 2 if(Fee_Flag==1) Fee_CHK(); //时段费率处理
272 2
273 2 if(EryBln_Flag==1) Ery_Balance(); //结算日处理(日、时)
274 2 }
275 1 }
276
277
278
279
280 //**********************************************************
281 // 名称:Rev_Proc()
282 // 功能:
283 // 说明:电能反向时间处理
284 //**********************************************************
285 void Rev_Proc(void)
286 {
287 1 uchar DataTime[8];
288 1
289 1 //电能反向起始时间判断
290 1 if( REVP==0 )
291 1 {
292 2 DelayNms(10);
293 2
294 2 if( REVP==0 )
295 2 {
296 3 if(EryRev==0) //电能反向起始条件及时间
297 3 {
298 4 //反向事件发生时实时时间
299 4 DataTime[0] = Min; //分
300 4 DataTime[1] = Hour; //时
301 4 DataTime[2] = Day; //日
302 4 DataTime[3] = Month; //月
303 4 DataTime[4] = SumCHK(DataTime,4);
C51 COMPILER V7.50 RTC_DSP 04/13/2007 13:24:54 PAGE 6
304 4
305 4 Addr[0] = 0xA0;
306 4 Addr[1] = 0xAA;
307 4 Len[1] = 0x05;
308 4 WriteEPMData(DataTime);
309 4 }
310 3 EryRev = 1; //电能反向标志置位
311 3 }
312 2 }
313 1 else EryRev = 0; //电能正常
314 1
315 1
316 1 //电能反向累计总时间计算
317 1 if( RevSec>59 ) //反向时间累计满1分钟处理
318 1 {
319 2 RevSec = 0x00;
320 2
321 2 Addr[0] = 0xA0;
322 2 Addr[1] = Ptr[6];
323 2 Len[1] = 0x04;
324 2 do
325 2 {
326 3 ReadData(DataTime);
327 3 DataTime[4]= DataTime[0]+DataTime[1]+DataTime[2]; //SumCHK(DataTime,3);
328 3 } while((DataTime[4]!=DataTime[3])&&(Addr[0]<=0xA4));
329 2
330 2 if(DataTime[4]!=DataTime[3]) ArrayInit(DataTime,4); //数据错误,清零
331 2
332 2 BCDINC(DataTime,3,1); //+1
333 2 DataTime[3] = DataTime[0]+DataTime[1]+DataTime[2]; //SumCHK(DataTime,3);
334 2
335 2 Addr[0] = 0xA0;
336 2 WriteEPMData(DataTime); //写数据
337 2
338 2 Addr[0] = 0xA0; //读取存储区数据
339 2 ReadData(&DataTime[4]);
340 2
341 2 if((DataTime[7]!=SumCHK(&DataTime[4],3))||(DataTime[3]!=DataTime[7]))//比较数据的正确性
342 2 {
343 3 EC = 0; //关闭掉电检测
344 3
345 3 Addr[0] = 0xA0;
346 3 WriteEPMData(DataTime); //再次写入数据
347 3
348 3 Addr[0] = 0xA0;
349 3 ReadData(&DataTime[4]); //再次读取数据
350 3
351 3 if((DataTime[7]!=SumCHK(&DataTime[4],3))||(DataTime[3]!=DataTime[7]))//再次数据比较判断
352 3 {
353 4 Ptr[6] += 0x04;
354 4 if(Ptr[6]>=0x40)Ptr[6] = 0x30; //指针边界处理
355 4
356 4 DataTime[4] = Ptr[6];
357 4 DataTime[5] =~Ptr[6];
358 4
359 4 Addr[0] = 0xA0;
360 4 Addr[1] = 0xBC;
361 4 Len[1] = 0x02;
362 4 WriteEPMData(&DataTime[4]); //指针值
363 4
364 4 Addr[0] = 0xA0;
365 4 Addr[1] = Ptr[6];
C51 COMPILER V7.50 RTC_DSP 04/13/2007 13:24:54 PAGE 7
366 4 Len[1] = 0x04;
367 4 WriteEPMData(DataTime); //反向累计时间值
368 4
369 4 Ptr[7] = SumCHK(Ptr,7);
370 4 }
371 3 EC = 1; //开启掉电检测
372 3 }
373 2 }
374 1 }
375
376
377
378
379
380
381 //**********************************************************
382 // 名称:Dsp_Proc()
383 // 功能:
384 // 说明:
385 //**********************************************************
386 void Dsp_Proc(void)
387 {
388 1 uchar i;
389 1 uchar DspBuf[8]; //显示缓冲区
390 1
391 1 ArrayInit(DspBuf,8); //显示缓冲区清零
392 1
393 1 //显示方式
394 1 DspType = 0; //5+1显示
395 1 if(DspCtrl1&0x80)DspType = 1; //小数分开显示
396 1
397 1 DspSec++; //轮显时间+1
398 1
399 1 //显示项目切换
400 1 if(DspSec>=BCD2HEX(DspTime)) //轮显时间满,更新显示指针
401 1 {
402 2 DspSec = 0; //显示计数清零
403 2 DspPage = 0; //显示首页
404 2
405 2 i = 0x00; //轮显指针处理
406 2 do
407 2 {
408 3 DspPtr++;
409 3 if( DspPtr<7 ) i = (DspCtrl1>>DspPtr)&0x01; //
410 3 if( DspPtr>7 )
411 3 {
412 4 /*
413 4 if(DspPtr<16) i = (DspCtrl2>>(DspPtr-8))&0x01; //
414 4
415 4 else if(DspPtr==16)
416 4 {
417 4 if(DspCtrl1&0x40) i = 0x01; //电表自检有效
418 4 else DspPtr = 0xFF;
419 4 }
420 4 else DspPtr = 0xFF;
421 4 */
422 4
423 4 if(DspPtr<16)
424 4 {
425 5 i = (DspCtrl2>>(DspPtr-8))&0x01;
426 5 }
427 4 else if(DspPtr==16) //电表自检有效
C51 COMPILER V7.50 RTC_DSP 04/13/2007 13:24:54 PAGE 8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -