访问电脑版页面

导航:老古开发网手机版其他

程序参考---PIC---001

导读:
关键字:
bcf   WP            
        movf  R_MINUTE,W  
  btfss  STATUS,Z  ;零分?
  goto  ThrSav
  call  SenceAndCPA ;CPA:Clock Precision Adjustment
  movf  R_HOUR,W
  btfss  STATUS,Z  ;零点?
  goto  ThrSav
  clrf  PSDErrCounter
  bcf   fTimeUPDLocked  ;解除闭锁
;----------------------------------------------------------------------------代码开始
ThrSav:               
;      bcf _PAGE1
      nop 
 ;     goto CLRRecRegion
 ;     nop
 ;     bsf _PAGE1
;    sublw  .1   ;到每月1日
 ;   btfss  STATUS,Z
;  goto  Freeze_Out
 bcf _PAGE1;-------------------------------  
 I2C_READ_SUB 0x01,BFIIC,AT_MonthPointer,0
    bsf _PAGE1;-------------------------------
    nop
    bcf _C
 rlf BFIIC,W
 addlw 0x06
 movwf ADDRESS
 swapf ADDRESS,F
    movlw 0x10
 subwf ADDRESS,W
 movwf SubAddress
    bcf _PAGE1;-------------------------------  
 I2C_READ_SUB 0x05,BFIIC,AT_NMTime,0
    bsf _PAGE1;-------------------------------
    movfw (BFIIC+4)
    subwf R_Month,W
    btfsc STATUS,Z      ;如果新月月等于旧月
    goto Freeze_Out  ;当天数据已完成冻结
    btfss STATUS,C      ;如果C=1当前月份大于上次存储的月份              
    goto NewYear
    goto OriginalYear
               

; bsf _PAGE1  
; 将本月电量的小数部分写入到该电量的小数位置
; ***********************************************************************************************
NewYear:
    movfw R_Month
    movwf NewMonth
    movlw .12
 addwf NewMonth,F
    goto SaveStr
; ***********************************************************************************************
OriginalYear:
    movfw R_Month
    movwf NewMonth
    movfw NewMonth
    goto SaveStr
SaveStr:
  movfw (BFIIC+4);旧月数据装载
        subwf NewMonth,W       ; 新月减去老月
  movwf TEMP          ;新旧月份的差额
  movlw .3
  subwf TEMP,W
  btfsc STATUS,C      ;如果C等于零说明新月减去老月大于3执行ThrSave
  goto ThrSave
    movlw .2
  subwf TEMP,W       ;2-月份差如果等于零说明新月大于老月两个月
  movwf TEMP          ;新旧月份的差额
  btfsc STATUS,C      ;如果C等于零说明新月减去老月大于2
  goto TwoSave
    movlw .1
  subwf TEMP,W       ;1-月份差如果等于零说明新月大于老月两个月
  movwf TEMP          ;新旧月份的差额
  btfsc STATUS,C     ;如果C等于零说明新月减去老月大于1
  goto OneSave
; ***********************************************************************************************
OneSave:;上次转存和本次相差一个月的电量存储(本月数据保存)
    movfw R_Month
    movwf (BFIIC+8);月写入
    movfw R_YEAR
    movwf (BFIIC+9);年写入
    call SaveDate
    bcf _PAGE1;
    goto Freeze_Out;
; ***********************************************************************************************
TwoSave:            ;上次转存和本次相差两个月的电量存储

    movlw .1
 subwf R_Month,W
    btfsc STATUS,Z;当前月份减去一如果结果等于零(Z=1)说明但前月份是一月,指令运行到MonthOne20 
    goto MonthTwo20 ;否则运行指令运行到MMonthTwo20
    goto MonthOne20
MonthOne20:         ;去年12月数据填充
    movlw .12
    movwf (BFIIC+8);月写入
    decf R_YEAR,W
    movwf (BFIIC+9);年写入
MonthOne21:
    movlw .1       ;今年一月份数据填充
    movwf (BFIIC+8);月写入
    movfw R_YEAR
    movwf (BFIIC+9);年写入
    goto Freeze_Out;
MonthTwo20:        ;当前月份减去一数据填充
    movlw .1
 subwf R_Month,W
    movwf (BFIIC+8);月写入
    movfw R_YEAR
    movwf (BFIIC+9);年写入
    call SaveDate;
MonthTwo21:        ;当前月份数据填充
    movfw R_Month
    movwf (BFIIC+8);月写入
    movlw R_YEAR
    movwf (BFIIC+9);年写入
    call SaveDate;    
    goto Freeze_Out;上次转存和本次相差两个月的电量存储代码结束
; ***********************************************************************************************
ThrSave:           ;上次转存和本次相差三个月的电量存储
    movlw .1
 subwf R_Month,W
    btfss STATUS,Z;当前月份减去一如果结果等于零(Z=1)说明但前月份是一月,指令运行到MonthOne30 
    goto MonthTwo30 ;否则运行指令运行到MonthTwo30在MonthTwo30再作月份判断
    goto MonthOne30
MonthOne30:
    movlw .11
    movwf (BFIIC+8);月写入
    decf R_YEAR,W
    movwf (BFIIC+9);年写入
    movwf ADDRESS
    call SaveDate
MonthOne31:
    movlw .12
    movwf (BFIIC+8);月写入
    decf R_YEAR,W
    movwf (BFIIC+9);年写入
    call SaveDate
MonthOne32:
    movlw .1
    movwf (BFIIC+8);月写入
    movfw R_YEAR
    movwf (BFIIC+9);年写入
    call SaveDate
    goto Freeze_Out;
MonthTwo30:
    movlw .2
 subwf R_Month,W
    btfss STATUS,Z;当前月份减去二如果结果等于零(Z=1)说明但前月份是二月,指令跳过一行运行,开始填充二月份的相关数据 
    goto MonthTre30;否则运行指令运行到MonthTwo30
    movfw .12      ;去年12月数据填充
    movwf (BFIIC+8);月写入
    decf R_YEAR,W
    movwf (BFIIC+9);年写入
    call SaveDate
MonthTwo31:
    movfw .1       ;今天一月数据填充
    movwf (BFIIC+8);月写入
    movfw R_YEAR
    movwf (BFIIC+9);年写入
    call SaveDate
MonthTwo32:
    movfw .2       ;本月数据填充
    movwf (BFIIC+8);月写入
    movfw R_YEAR
    movwf (BFIIC+9);年写入
    call SaveDate
    goto Freeze_Out;
MonthTre30:;当前月份减去二写入存储缓冲区 
    movlw .2
 subwf R_Month,W
    movwf (BFIIC+8);月写入
    movfw R_YEAR
    movwf (BFIIC+9);年写入
    call SaveDate
MonthTre31:;当前月份减去一写入存储缓冲区
    movlw .1
 subwf R_Month,W
    movwf (BFIIC+8);月写入
    movfw R_YEAR
    movwf (BFIIC+9);年写入
    bsf _PAGE1;
    call SaveDate
    bcf _PAGE1;
MonthTre32:;当前月份写入存储缓冲区
    movfw R_Month
    movwf (BFIIC+8);月写入
    movfw R_YEAR
    movwf (BFIIC+9);年写入
    bsf _PAGE1;
    call SaveDate
    bcf _PAGE1; 
    nop
    bsf _PAGE1;  
    goto Freeze_Out; 
SaveDate:
    bcf _PAGE1  
 I2C_READ_SUB 0x01,BFIIC,AT_MonthPointer,0
 bcf _C
 rlf BFIIC,W
 addlw 0x06
 movwf ADDRESS
 swapf ADDRESS,F
    nop
    movlw 0x10
 subwf ADDRESS,W
 movwf SubAddress
    movlw .0
    movwf (BFIIC+5)
    movwf (BFIIC+6)
    movlw .1
    movwf (BFIIC+7);日写入1日
 movlw .5
 movwf BYTES
 movlw (BFIIC+5)
 movwf SourcePointer
    call    W24WC64
    nop
 movlw AT_Total
 movwf SubAddress
 clrf SubAdd_H
 movlw .1
 movwf BYTES
 movlw T_DEC
 movwf SourcePointer
    call    W24WC64

 movlw AT_Day
 movwf SubAddress
 movlw O_DEC
 movwf SourcePointer
    call    W24WC64

 movlw AT_Low
 movwf SubAddress
 movlw L_DEC
 movwf SourcePointer
    call    W24WC64
         
    I2C_READ_SUB 0x0C,(BFIIC+3),AT_Total,0 ;读出当前总电量;写入电量转存区
 movf ADDRESS,W
 movwf SubAddress
 clrf SubAdd_H
 movlw .12
 movwf BYTES
 movlw (BFIIC+3)
 movwf SourcePointer
      call    W24WC64
   
    nop
    incf BFIIC,F
 movlw .3
 subwf BFIIC,W  ; BFIIC-3->W
 btfsc  STATUS,C
 clrf BFIIC  ; C=1:结果为正
    bcf _PAGE1;  
 I2C_WR_SUB 0x01,BFIIC,AT_MonthPointer,0;返写月电量存储区指针
    nop
    return
Rsp:
;读出月电量存储区指针    
        bcf _C
  rlf BFIIC,W
  addlw 0x06
  movwf ADDRESS
  swapf ADDRESS,F
    return
Wsp:
    I2C_WR_SUB 0x01,BFIIC,AT_MonthPointer,0
    return
Write_AccFlag:
   bcf _PAGE1;-------------------------------  
   I2C_WR_SUB    0x01, BFIIC, AT_Accounted,0
   bsf _PAGE1;-------------------------------  
Freeze_Out:
  bsf WP              
  return

来源:   作者:  2006/9/25 16:50:53
栏目: [ ]

相关阅读

安森美推出新的高功率图腾柱PFC控制器,满足具挑战的能效标准

动态功耗低至60μA/MHz!助力设备超长续航,首选国民技术低功耗MCU!