| org        0X0000 goto      START_BEGIAN      ; On power-up begin at label "START_BEGIAN"
 nop
 nop
 nop
 movwf    acc_bak                 ;现场保护
 swapf     STATUS,W                ;用SWAPF才不会影响标志位
 movwf    status_bak              ;将W和STATUS存入各保护寄存器
 goto       ISR         ;Int. vector @ loc'n STARTUP+4
 START_BEGIAN:                           ;I/O口初始化
 banksel  OPTION_REG
 movlw    0X08
 movwf    OPTION_REG          ;分频器给WDT用,且分频比1:1,INT下降沿触发,GPIO带上拉
 bcf         STATUS,RP0          ;bank0
 clrf         GPIO                     ;初始化端口引脚电平为0
 movlw    07h                       ;关闭比较器功能
 movwf    CMCON
 bsf        STATUS,RP0           ;bank1
 clrf         ANSEL                   ;端口设置为数字I/O
 movlw    0x04
 movwf    WPU                     ;GP2带上拉电阻,其他I/O口不带
 movlw    0ch
 movwf    TRISIO           ;GP2(INT),GP3(MCLR)为输入,GP1(负载2),GP0(负载1),GP4,GP5为输出
 clrf         STATUS                  ;bank0
 movlw    0X20
 movwf    FSR
 clrram_loop:
 clrf          INDF                          ;变量初始化
 incf         FSR,f
 btfss       FSR,4
 goto       clrram_loop
 
 banksel  INTCON
 clrf         INTCON
 movlw    0x85           ;133(16进制是85H)=256-125+2---125是定是器tmr0每隔125us中断一次
 movwf    TMR0
 bsf         INTCON,T0IE             ;开启tmr0中断允许位
 bsf         INTCON,INTE             ;开启INT中断允许位
 bsf         INTCON,GIE              ;开启全局中断允许位
 bsf         temp,f_heat
 movlw    10
 movwf    ten_sec_test
 ;************************************
 ;***********主程序区*****************
 main:
 btfss    t_125us,3               ;到了1ms吗?
 goto     main                      ;没到,则返回到main处
 clrf       t_125us                   ;到了,则清t_125us变量
 ;CLRWDT
 ;call      rtc_man                   ;实时检测流量信号时间管理
 call       time_man                 ;标准时间管理
 goto     main
 ;************************************
 ;***********中断判断区***************
 ISR:
 btfss     INTCON,T0IE            ;测试是否tmer0中断允许
 goto     other_int                  ;T0IE=0,不可能是tmer0中断进入
 btfss     INTCON,T0IF            ;测试是否tmer0中断
 goto     other_int                  ;非tmer0中断,判断其它中断标志
 
 bcf         INTCON,T0IF           ;清除T0IF标志
 incf        t_125us
 movlw    0x85
 addwf    TMR0,f
 btfss      temp,f_heat             ;f_heat=1?
 goto      off_all_load              ;没有的话,则关闭所有负载.
 movlw    0
 xorwf     ten_sec_test,W
 btfss      STATUS,Z                  ;有延时功能吗?
 goto       isr_out_last               ;是的,则退出中断子程序
 movlw    0x03                       ;没有,则直接方波驱动:Frelay=4kHZ
 xorwf     GPIO,f
 goto       isr_out_last
 off_all_load:
 bcf        GPIO,relay1
 bcf        GPIO,relay2
 isr_out_last:
 swapf    status_bak,W            ;用SWAPF才不会影响标志位
 movwf    STATUS
 swapf    acc_bak,F
 swapf    acc_bak,W
 RETFIE
 other_int:
 btfss    INTCON,INTE               ;测试是否外部中断允许
 goto     isr_out_last                 ;INTE=0,不可能是外部中断进入,退出中断子程序
 btfss    INTCON,INTF                ;测试是否外部中断
 goto     isr_out_last                 ;非外部中断,退出中断子程序
 bcf       INTCON,INTF
 incf      zero_n                          ;脉冲次数加一
 btfsc    temp,f_start                 ;f_start为0吗?
 goto     isr_out_last
 bsf       temp,f_start                  ;不是,则置流量信号有的标志位(f_start=1)
 clrf       t_4ms
 goto     isr_out_last
 
 
 goto     main
 |