winnie 发表于 2009-5-21 13:09:49

如何用tmr0做中断

bsf          status,5      ;选中bank1 movlw      0d5         ;11010101,tmr0预定标器倍率为1:64         
          movwf      option_reg
          bcf          status,5      ;返回bank0
          movlw      00
          movwf      tmr0          ;tmr0初值为0
          movlw      0a0         ;10100000(D5:为1允许tmr0中断;D7:为1开放所有中断;D2:tmr0内计数器计满溢出时该位被置1)
          movwf      intcon
;中断服务子程序,现场保护
intserv   movwf      w_temp            
          swapf      status,w
          clrf         status
          movwf      status_temp
          btfss      intcon,5          ;是否为tmr0中断
          goto         out
          bcf          intcon,2          ;清tmr0中断溢出标志,64us中断一次
          incf         in0,1             ;中断溢出单元+1
          movlw      7d                ;该单元为125吗?
          subwf      in0,0
          btfss      status,0
          goto         out               ;未到,恢复现场
          clrf         in0               ;是,清该单元
          incf         in1,1             ;计时单元1+1
          movlw      7d                ;该单元为125吗?
          subwf      in1,0
          btfss      status,0
          goto         out               ;未到,恢复现场
          clrf         in1               ;是,清该单元
          incf         in2,1             ;计时单元2+1
          movlw      3c
          subwf      in2,0
          btfss      status,0
          goto         out
          bsf          flag,0            ;置1分钟到标志,1分=64us*125*125*60
          clrf         in2
out       swapf      status_temp,w   ;现场恢复
          movwf      status
          swapf      w_temp,f
          swapf      w_temp,w
          retfie
页: [1]
查看完整版本: 如何用tmr0做中断