;haletető vezérlő
;naponta egyszer pár másodpercig aktív a GP5 kimenet
#include "p12f675.inc"

;__CONFIG  (_CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _CPD_OFF)
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BODEN_OFF)

cblock 0x20
  is_midnight
  timer_db
  sec
  min
  hour
  T1
  T2
  W_TEMP
  STATUS_TEMP
endc

org 0x000
  goto _init

org 0x004
  goto _megszakit

_init
  bcf STATUS,RP0 ;Bank 0
  clrf GPIO ;Init GPIO
  movlw 07h ;Set GP<2:0> to 
  movwf CMCON ;digital IO
  bsf STATUS,RP0 ;Bank 1
  clrf ANSEL ;Digital I/O
  movlw b'00001011' ;Set GP<3:2> as inputs
  movwf TRISIO ;and set GP<5:4,1:0>;as outputs
  movlw b'00000001'
  movwf PIE1  
  bcf STATUS,RP0 ;Bank 0
  movlw b'00001001'
  movwf T1CON
  movlw b'11000000'
  movwf INTCON
  movlw .50
  movwf sec
  movlw .59
  movwf min
  movlw .23
  movwf hour
  clrf timer_db
  clrf is_midnight
_main 
  BTFSS    is_midnight,0
  goto _main
  clrf is_midnight
  call _rezeg
 goto _main

_rezeg
  bsf GPIO,GPIO2
  call DELAY_SEC
;  call DELAY_SEC
  bcf GPIO,GPIO2
  return

DELAY_SEC:   MOVLW    d'125'  ;245 eredetleg, ha 1 mp-t akarunk
         MOVWF    T1
DEL:     MOVLW    d'255' 
         MOVWF    T2
DEL1:    NOP
		 NOP
		 NOP
		 NOP
		 NOP
		 NOP
		 NOP
		 NOP
		 NOP
		 NOP
		 NOP
		 NOP
		 NOP
         DECFSZ   T2,f
         GOTO     DEL1
         DECFSZ   T1,f
         GOTO     DEL

         RETURN


_megszakit
  MOVWF W_TEMP ;copy W to temp register, could be in either bank
  SWAPF STATUS,W ;swap status to be saved into W
  BCF STATUS,RP0 ;change to bank 0 regardless of current bank
  MOVWF STATUS_TEMP ;save status to bank 0 register
  
  bcf STATUS,RP0 ;Bank 0
  incf timer_db,f
;  movlw 0x10 elvileg ennyi kéne ha tenyleg 4MHz lenne az osc.
  movlw 0x13
  subwf timer_db,w
  btfss STATUS,Z
  goto _tovabb1
  movlw 0xBD
  addwf TMR1H,f
  movlw 0xC1
  addwf TMR1L,f
  clrf timer_db
  INCF	 sec
  MOVFW    sec
  XORLW    .60
  BTFSS    STATUS,Z
  GOTO	 _tovabb1
  MOVLW    d'0' 
  MOVWF    sec
  INCF	 min
  MOVFW    min
  XORLW    .60
  BTFSS    STATUS,Z
  GOTO	 _tovabb1
  MOVLW    d'0' 
  MOVWF    min
  INCF	 hour
  MOVFW    hour
  XORLW    .24
  BTFSS    STATUS,Z
  GOTO	 _tovabb1
  MOVLW    d'0' 
  MOVWF    hour
  bsf is_midnight,0
_tovabb1
  bcf PIR1,TMR1IF

  SWAPF STATUS_TEMP,W;swap STATUS_TEMP register into W, sets bank to original state
  MOVWF STATUS ;move W into STATUS register
  SWAPF W_TEMP,F ;swap W_TEMP
  SWAPF W_TEMP,W ;swap W_TEMP into W
  RETFIE
 end