;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

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 movfw	CMCON	; read value in CMCON register
;  BTFSS    is_midnight,0
;  goto _main
  clrf is_midnight
  call _rezeg
 goto _main

_rezeg
  call DELAY_SEC
  bsf GPIO,GPIO2
  bsf GPIO,GPIO4
  bsf GPIO,GPIO5
  call DELAY_SEC
  bcf GPIO,GPIO2
  bcf GPIO,GPIO4
  bcf GPIO,GPIO5
  return

DELAY_SEC:   MOVLW    d'245'
         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
  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