include "util.inc"
;****************************
;*							*
;*	Pausa1ms				;
;*	pausa de 1 ms			*
;*							*
;****************************
Pausa1ms	movlw	PAUSA_INIT_DELAY
			movwf	TMP1
			clrf	TMP2
LOOP_PAUSA	decfsz	TMP2, F	
			goto	LOOP_PAUSA
			decfsz	TMP1, F
			goto	LOOP_PAUSA
			return


;****************************
;*							*
;*	Pausa de w*10usec		*
;*							*
;****************************
DELAY_10USEC
	movwf	LOOP_10USEC
DELAY_10USEC_1
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	decfsz	LOOP_10USEC, F
	goto	DELAY_10USEC_1

	return


;****************************
;*							*
;*	Version firmware		*
;*							*
;****************************
MensajeVersion addwf PCL,1
					retlw 'V'
					retlw 'e'
					retlw 'r'
					retlw 's'
					retlw 'i'
					retlw 'o'
					retlw 'n'
					retlw ' '
					retlw '1'
					retlw '.'
					retlw '0'
					retlw 0x0

;********************************
;*								*
;* escribe el numero de version	*
;* Version 1·0					*
;*								*
;********************************
EscribeVersion		clrf LCD_RESULT
EscribeVersion1		movf LCD_RESULT, 0
					call MensajeVersion
					iorlw 0
					btfsc STATUS, 2
					return
					call LcdWriteData
					incf LCD_RESULT, 1
					goto EscribeVersion1

;****************************
;*							*
;*	Temperatura				*
;*							*
;****************************
MensajeTemperatura	addwf PCL,1
					retlw 'T'
					retlw 'e'
					retlw 'm'
					retlw 'p'
					retlw ':'
					retlw ' '
					retlw '-'
					retlw '0'
					retlw '0'
					retlw '.'
					retlw '0'
					retlw B'11011111'	; Simbolo de grados (en la version japopnesa)
					retlw 0x0

;********************************
;*								*
;* escribe la temperatura		*
;* Temnp: -28·5º				*
;*								*
;********************************
EscribeTemperatura	clrf LCD_RESULT
EscribeTemperatura1	movf LCD_RESULT, 0
					call MensajeTemperatura
					iorlw 0
					btfsc STATUS, 2
					return
					call LcdWriteData
					incf LCD_RESULT, 1
					goto EscribeTemperatura1

;****************************
;*							*
;*	pH						*
;*							*
;****************************
MensajePH	addwf PCL,1
					retlw 'p'
					retlw 'H'
					retlw ':'
					retlw ' '
					retlw ' '
					retlw '0'
					retlw 0x0

;********************************
;*								*
;* escribe la temperatura		*
;* Temnp: -28·5º				*
;*								*
;********************************
EscribePH			clrf LCD_RESULT
EscribePH1			movf LCD_RESULT, 0
					call MensajePH
					iorlw 0
					btfsc STATUS, 2
					return
					call LcdWriteData
					incf LCD_RESULT, 1
					goto EscribePH1


;****************************
;*							*
;*	Luz						*
;*							*
;****************************
MensajeLuz			addwf PCL,1
					retlw 'L'
					retlw 'u'
					retlw 'z'
					retlw ' '
					retlw '1'
					retlw ' '
					retlw ' '
					retlw ' '
					retlw ' '
					retlw ' '
					retlw ' '
					retlw 'O'
					retlw 'N'
					retlw ' '
					retlw ' '
					retlw '0'
					retlw '0'
					retlw ':'
					retlw '0'
					retlw '0'
					retlw 0x0

;********************************
;*								*
;* escribe la temperatura		*
;* Temnp: -28·5º				*
;*								*
;********************************
EscribeLuz			clrf LCD_RESULT
EscribeLuz1			movf LCD_RESULT, 0
					call MensajeLuz
					iorlw 0
					btfsc STATUS, 2
					return
					call LcdWriteData
					incf LCD_RESULT, 1
					goto EscribeLuz1

;****************************
;*							*
;*	Cebado					*
;*							*
;****************************
MensajeCebado		addwf PCL,1
					retlw 'C'
					retlw 'e'
					retlw 'b'
					retlw 'a'
					retlw 'd'
					retlw 'o'
					retlw 'r'
					retlw ' '
					retlw ' '
					retlw ' '
					retlw ' '
					retlw 'O'
					retlw 'N'
					retlw ' '
					retlw ' '
					retlw '0'
					retlw '0'
					retlw ':'
					retlw '0'
					retlw '0'
					retlw 0x0

;********************************
;*								*
;* escribe la temperatura		*
;* Temnp: -28·5º				*
;*								*
;********************************
EscribeCebado		clrf LCD_RESULT
EscribeCebado1		movf LCD_RESULT, 0
					call MensajeCebado
					iorlw 0
					btfsc STATUS, 2
					return
					call LcdWriteData
					incf LCD_RESULT, 1
					goto EscribeCebado1

;****************************
;*							*
;*	ON						*
;*							*
;****************************
EscribeON
	movf	'O', W
	call    LcdWriteData
	movf	'N', W
	call    LcdWriteData
	return

;****************************
;*							*
;*	OFF						*
;*							*
;****************************
EscribeOFF
	movf	'O', W
	call    LcdWriteData
	movf	'F', W
	call    LcdWriteData
	call    LcdWriteData
	return

;****************************************
;*										*
;*	Hora de activacion/desactivacion	*
;*										*
;****************************************
EscribeHoraActivacion
	movf	'0', W
	call    LcdWriteData
	call    LcdWriteData
	movf	':', W
	call    LcdWriteData
	movf	'0', W
	call    LcdWriteData
	call    LcdWriteData
	return

;************************************
;*                                  *
;* Actualiza la hora en el LCD		*
;*                                  *
;************************************
EscribeHoraLCD

	; ¿ha cambiado la hora?
	movf	HORA,W
	subwf	HORA_ANT, W
	btfsc	STATUS, Z
	goto	no_actualizar_hora

actualizar_hora
	movlw	LCD_ROW_0
	addlw	LCD_COL_12
	iorlw	LCD_SET_DDRAM 
	call	LcdWriteCommand

	movf	HORA, W
	movwf	HORA_ANT

	movf	HORA, W
	movwf	LO_BYTE
	call	Byte2Bcd

	movlw	0x30
	addwf	BCD2, W
	call    LcdWriteData
	movlw	0x30
	addwf	BCD3, W
	call    LcdWriteData

no_actualizar_hora

	return

;************************************
;*                                  *
;* Actualiza el minuto en el LCD	*
;*                                  *
;************************************
EscribeMinutoLCD

	; ¿ha cambiado el minuto?
	movf	MINUTO,W
	subwf	MINUTO_ANT, W
	btfsc	STATUS, Z
	goto	no_actualizar_minuto

actualizar_minuto
	movlw	LCD_ROW_0
	addlw	LCD_COL_15
	iorlw	LCD_SET_DDRAM 
	call	LcdWriteCommand

	movf	MINUTO, W
	movwf	MINUTO_ANT

	movf	MINUTO, W
	movwf	LO_BYTE
	call	Byte2Bcd

	movlw	0x30
	addwf	BCD2, W
	call    LcdWriteData
	movlw	0x30
	addwf	BCD3, W
	call    LcdWriteData

no_actualizar_minuto

	return

;************************************
;*                                  *
;* Actualiza el segundo en el LCD	*
;*                                  *
;************************************
EscribeSegundoLCD

	; ¿ha cambiado el minuto?
	movf	SEGUNDO,W
	subwf	SEGUNDO_ANT, W
	btfsc	STATUS, Z
	goto	no_actualizar_segundo

actualizar_segundo
	movlw	LCD_ROW_0
	addlw	LCD_COL_18
	iorlw	LCD_SET_DDRAM 
	call	LcdWriteCommand

	movf	SEGUNDO, W
	movwf	SEGUNDO_ANT

	movf	SEGUNDO, W
	movwf	LO_BYTE
	call	Byte2Bcd

	movlw	0x30
	addwf	BCD2, W
	call    LcdWriteData
	movlw	0x30
	addwf	BCD3, W
	call    LcdWriteData

no_actualizar_segundo

	return

;************************************
;*                                  *
;* Actualiza el tiempo en el LCD	*
;* en formato HH:MM:SS				*
;*                                  *
;************************************
EscribeTiempoLCD
	call	EscribeHoraLCD

	call	EscribeMinutoLCD

	call	EscribeSegundoLCD

	return

;************************************
;*                                  *
;* Convierte un byte en BCD y lo 	*
;* deja en BCD1 y BCD2				*
;*                                  *
;************************************
Byte2Bcd:
BCD_1_HUNDS:
	clrf	DEC_COUNT
BCD_1_HUNDS1:
	movlw	.100
	subwf	LO_BYTE, F		; LO_BYTE=LO_BYTE-100
	btfss	STATUS, C		; no borrow
	goto	BCD_1_HUNDS2
	call	INC_DEC_COUNT	; if no borrow
	goto	BCD_1_HUNDS1	; keep going

BCD_1_HUNDS2:
	movf	DEC_COUNT, W	; get the count
	movwf	BCD1

	movlw	.100
	addwf	LO_BYTE, F	; add back any falsely subtracted 101

BCD_1_DECS:
	clrf	DEC_COUNT
BCD_1_DECS1:
	movlw	.10
	subwf	LO_BYTE, F		; LO_BYTE=LO_BYTE-10
	btfss	STATUS, C		; no borrow
	goto	BCD_1_DECS2
	call	INC_DEC_COUNT	; if no borrow
	goto	BCD_1_DECS1		; keep going

BCD_1_DECS2:
	movf	DEC_COUNT, W	; get the count
	movwf	BCD2

	movlw	.10
	addwf	LO_BYTE, F		; add back any falsely subtracted 10

BCD_1_UNITS:
	clrf DEC_COUNT			; now for the units
BCD_1_UNITS1:
	movlw .1
	subwf LO_BYTE, F		; LO_BYTE=LO_BYTE-1
	btfss STATUS, C			; did not go from 00 to FF
	goto BCD_1_UNITS2		; done with units
	call INC_DEC_COUNT		; else increment and keep going
	goto BCD_1_UNITS1	

BCD_1_UNITS2:
	movf DEC_COUNT, W		; get the number of units
	movwf	BCD3

	return

;************************************
;*                                  *
;************************************
INC_DEC_COUNT:				; increments counter in BCD fashion
	incf DEC_COUNT, F
	movf DEC_COUNT, W
	andlw 0FH
	sublw .9				; W = low nibble - 9
	btfsc STATUS, C			; low nibble is in range of A - F
	goto INC_DEC_COUNT_DONE

	movf DEC_COUNT, W
	addlw .6
	movwf DEC_COUNT

INC_DEC_COUNT_DONE:
	return

;************************************
;*                                  *
;* Actualiza la hora las variables	*
;*                                  *
;************************************
ActualizaHora
TMR0_FILL
	;movf	TMR0, W			; Esperamos a que se de una vuelta el timer
	;btfss	STATUS, Z
	;goto	TMR0_FILL

	bcf     INTCON, T0IE    ; deshabilitamos la interrupcion

	incfsz	SEGUNDO_NTH, F	; si llegamos a cero hemos dado una vuelta completa
	goto	TIME_DONE		; y actualizamos los contadores de hora, minuto y segundos

	;* Actualizamos contadores
	movlw	MAXNTHS			; Volvemos a dejar las variables inicializadas para la siguiente
	movwf	SEGUNDO_NTH

INC_SEGUNDOS
	incf	SEGUNDO, F		; incrementamos el numero de segundos
	; ¿> 60?
	movf	SEGUNDO, W	
	movwf	TEMPORAL
	movlw	60
	subwf	TEMPORAL, F		; SEGUNDO=SEGUNDO-59
	btfss	STATUS, C		;
	goto	TIME_DONE		; no hay cambio 

INC_MINUTOS
	movlw	0				; PPonemos los segundos a 0
	movwf	SEGUNDO

	; AJUSTE
	movlw	ADJMIN
	subwf	SEGUNDO_NTH, F

	incf	MINUTO, F		; incrementamos el numero de minutos
	; ¿> 60?
	movf	MINUTO, W	
	movwf	TEMPORAL
	movlw	60
	subwf	TEMPORAL, F		; MINUTO=MINUTO-59
	btfss	STATUS, C		;
	goto	TIME_DONE		; no hay cambio 

INC_HORAS
	movlw	0				; PPonemos los minutos a 0
	movwf	MINUTO

	; AJUSTE
	movlw	ADJHR
	addwf	SEGUNDO_NTH, F

	incf	HORA, F			; incrementamos el numero de horas
	; ¿> 60?
	movf	HORA, W	
	movwf	TEMPORAL
	movlw	24
	subwf	TEMPORAL, F		; HORA=HORA-24
	btfss	STATUS, C		;
	goto	TIME_DONE		; no hay cambio 

	movlw	0				; PPonemos la hora a 0
	movwf	HORA

	; AJUSTE
	movlw	ADJDAY
	addwf	SEGUNDO_NTH, F
	addwf	SEGUNDO_NTH, F

TIME_DONE
	bcf     INTCON, T0IF    ; Limpiamos el bit de interrupcion para la proxima
	bsf     INTCON, T0IE    ; habilitamos la interrupcion

	return

;************************************
;*                                  *
;* Escribimos la temperatura en el	*
;* LCD								*
;*                                  *
;************************************
EscribeTemperaturaLCD
	movlw	LCD_SET_DDRAM | LCD_ROW_1 | LCD_COL_6
	call	LcdWriteCommand

	movf	TEMPERATURA_SIGNO, W
	xorwf	TEMPERATURA_SIGNO, W
	btfsc	STATUS, Z

	goto	temperatura_positiva
	movlw	'-'
	goto	pon_signo

temperatura_positiva
	movlw	' '

pon_signo
	call    LcdWriteData

	; Parte entera de la temperatura
	movf	TEMPERATURA, W
	movwf	LO_BYTE
	call	Byte2Bcd

	movlw	0x30
	addwf	BCD2, W
	call    LcdWriteData
	movlw	0x30
	addwf	BCD3, W
	call    LcdWriteData

	; Punto decimal
	movlw	'.'
	call    LcdWriteData

	; Parte decimal
	movf	TEMPERATURA_RESTO, W
	xorwf	TEMPERATURA_RESTO, W
	btfsc	STATUS, Z
	movlw	'0'
	movlw	'5'
	call    LcdWriteData

no_actualizar_temperatura

	return

;************************************
;*                                  *
;* Comprobamos la temperatura		*
;*                                  *
;************************************
CompruebaTemperatura
	; Leemos la temperatura del sensor
	call DS1820GetTemperature

comprueba_signo

comprueba_mayor
	; Lectura de la eeprom
	LEE_EEPROM_MACRO TEMPERATURA_MEDIA
	movwf	TMP1

	; ¿La temperatura actual es mayor que la programada?
	movf	TEMPERATURA, W
	movwf	TMP3			; TMP3=TEMPERATURA
	movf	TMP1, W
	subwf	TMP3, F			; TEMPERATURA=TEMPERATURA-TMP1
	btfss	STATUS, C		; Si C esta activo TEMPERATURA > TMP1
	goto	comprueba_menor

	; activamos el enfriamiento, desactivamos el calentamiento
	bsf		TEMPERATURA_PORT, ENFRIAR
	bcf		TEMPERATURA_PORT, CALENTAR

	goto	fin_temperatura

comprueba_menor
	; Lectura de la eeprom
	LEE_EEPROM_MACRO TEMPERATURA_MEDIA
	movwf	TMP1

	; ¿La temperatura actual es menor que la programada?
	movf	TMP1, W
	movwf	TMP3			; TMP3=TTMP1
	movf	TEMPERATURA, W
	subwf	TMP3, F			; TMP1=TMP1-TEMPERATURA
	btfss	STATUS, C		; Si C esta activo TMP1 > TEMPERATURA 
	goto	comprueba_mayor_resto

	; activamos el calentamiento, desactivamos el enfriamiento
	bsf		TEMPERATURA_PORT, CALENTAR
	bcf		TEMPERATURA_PORT, ENFRIAR

	goto	fin_temperatura




comprueba_mayor_resto
	; La parte entera coincide ¿y el resto?
	LEE_EEPROM_MACRO TEMPERATURA_MEDIA_RESTO
	movwf	TMP1

	; ¿La temperatura actual es mayor que la programada?
	movf	TEMPERATURA_RESTO, W
	movwf	TMP3			; TMP3=TEMPERATURA_RESTO
	movf	TMP1, W
	subwf	TMP3, F			; TEMPERATURA_RESTO=TEMPERATURA_RESTO-TMP1
	btfss	STATUS, C		; Si C esta activo TEMPERATURA_RESTO > TMP1
	goto	comprueba_menor_resto

	; activamos el enfriamiento, desactivamos el calentamiento
	bsf		TEMPERATURA_PORT, ENFRIAR
	bcf		TEMPERATURA_PORT, CALENTAR

	goto	fin_temperatura

comprueba_menor_resto
	; ¿La temperatura actual es menor que la programada?
	LEE_EEPROM_MACRO TEMPERATURA_MEDIA_RESTO
	movf	TMP1, W

	; ¿La temperatura actual es mayor que la programada?
	movwf	TMP3			; TMP3=TTMP1
	movf	TEMPERATURA, W
	subwf	TMP3, F			; TMP1=TMP1-TEMPERATURA_RESTO
	btfss	STATUS, C		; Si C esta activo TMP1 > TEMPERATURA_RESTO
	goto	temperatura_ok

	; activamos el calentamiento, desactivamos el enfriamiento
	bsf		TEMPERATURA_PORT, CALENTAR
	bcf		TEMPERATURA_PORT, ENFRIAR

	goto	fin_temperatura





temperatura_ok
	bcf		TEMPERATURA_PORT, CALENTAR
	bcf		TEMPERATURA_PORT, ENFRIAR

fin_temperatura
	call	EscribeTemperaturaLCD
	return

;************************************
;*                                  *
;* Escribimos el pH en el LCD		*
;*                                  *
;************************************
EscribePHLCD
	movlw	LCD_ROW_1
	addlw	LCD_COL_18
	iorlw	LCD_SET_DDRAM 
	call	LcdWriteCommand

	movf	PH, W
	movwf	LO_BYTE
	call	Byte2Bcd

	movlw	0x30
	addwf	BCD2, W
	call    LcdWriteData
	movlw	0x30
	addwf	BCD3, W
	call    LcdWriteData

	return

;************************************
;*                                  *
;* Obtenemos el pH					*
;*                                  *
;************************************
GetPH
	movlw	8
	movwf	PH
	return

;************************************
;*                                  *
;* Comprobamos el pH				*
;*                                  *
;************************************
CompruebaPH
	; Obtenemos el pH de las sondas
	call	GetPH

comprueba_mayor_ph
	; Lectura de la eeprom
	LEE_EEPROM_MACRO PH_MEDIO
	movwf	TMP1

	; ¿el pH actual es mayor que el programado?
	movf	PH, W
	movwf	TMP3			; TMP3=PH
	movf	TMP1, W
	subwf	TMP3, F			; PH=PH-TMP1
	btfss	STATUS, C		; Si C esta activo PH > TMP1
	goto	comprueba_menor_ph

	; activamos la disminucion de pH, desactivamos el aumento de pH
	bsf		PH_PORT, DISMINUIR_PH
	bcf		PH_PORT, AUMENTAR_PH

	goto	fin_ph

comprueba_menor_ph
	; Lectura de la eeprom
	LEE_EEPROM_MACRO PH_MEDIO
	movwf	TMP1

	; ¿el pH actual es menor que el programado?
	movf	TMP1, W
	movwf	TMP3			; TMP3=TTMP1
	movf	PH, W
	subwf	TMP3, F			; TMP1=TMP1-PH
	btfss	STATUS, C		; Si C esta activo TMP1 > PH 
	goto	ph_ok

	; activamos el aumento de pH, desactivamos la diminución de pH
	bsf		PH_PORT, AUMENTAR_PH
	bcf		PH_PORT, DISMINUIR_PH

	goto	fin_ph

ph_ok
	bcf		PH_PORT, AUMENTAR_PH
	bcf		PH_PORT, DISMINUIR_PH

fin_ph
	call	EscribePHLCD

	return

;************************************
;*                                  *
;* Obtenemos los niveles de agua	*
;*                                  *
;************************************
;GetNiveles2
	; Un sensor activo significa que llega el agua hasta el sensor

	; Comprobamos que el acuario tiene agua
;comprueba_nivel_acuario
	;btfsc	SNIVEL_ACUARIO_PORT, NIVEL_ACUARIO	; si esta activo (lleno) nos vamos a comprobar el filtro
	;goto	comprueba_nivel_filtro

	;bsf		SNIVEL_LLENADO_PORT, LLENAR

;loop_llenado									; llenamos hasta que se active SN1 (acuario lleno) o se desactive SN3 (deposito vacio)
	;btfsc	SNIVEL_ACUARIO_PORT, NIVEL_ACUARIO
	;goto	acuario_lleno
	;btfss	SNIVEL_LLENADO_PORT, NIVEL_LLENADO
	;goto	deposito_llenado_vacio
	;goto	loop_llenado

;acuario_lleno									; El acuario esta lleno, ponemos mensajito
	;bcf		SNIVEL_LLENADO_PORT, LLENAR
	;goto	comprueba_nivel_filtro

;deposito_llenado_vacio
	;bcf		SNIVEL_LLENADO_PORT, LLENAR			; El acuario no esta lleno y el deposito está vacio, ponemos mensajito
	;goto	fin_niveles

	; Comprobamos que el filtro tiene agua
	; en este punto el acuario debe estar lleno, si falta agua en el filtro puede ser temporal.....
;comprueba_nivel_filtro
	;btfsc	SNIVEL_FILTRO_PORT, NIVEL_FILTRO	; si esta activo (lleno) acabamos las comprobaciones
	;goto	fin_niveles

;filtro_vacio									; el filtro está vacio, ponemos mensajito ¿que hacemos?, el acuario está lleno ¿descebado?
	;goto	fin_niveles


;fin_niveles
	;return

;************************************
;*                                  *
;* Obtenemos los niveles de agua	*
;*                                  *
;************************************
GetNiveles
	; Un sensor activo significa que llega el agua hasta el sensor
comprueba_nivel_filtro
	btfsc	SNIVEL_FILTRO_PORT, NIVEL_FILTRO	; ¿Tenemos el filtro lleno?
	goto	comprueba_nivel_acuario				; si, comprobamos el nivel del acuario

comprueba_deposito_llenado						; no, activamos la bomba de llenado si hay agua en el deposito
	btfsc	SNIVEL_LLENADO_PORT, NIVEL_LLENADO	; ¿Tenemos el deposito con agua?
	goto	activa_llenado						; si, activamos llenado

alarma_deposito_vacio
	goto	fin_niveles							; No hay agua en el deposito (ALARMA)

activa_llenado
	bsf		NIVEL_PORT, LLENAR					; activamos la bomba de llenado
	goto	fin_niveles							; nos vamos a esperar otro ciclo de comprobaciones

comprueba_nivel_acuario
	bcf		NIVEL_PORT, LLENAR					; apagamos la bomba de llenado (podia estar activa de una pasada anterior)

	btfsc	SNIVEL_ACUARIO_PORT, NIVEL_ACUARIO	; ¿Tenemos el acuario lleno?
	goto	fin_niveles							; si, todo correcto

alarma_acuario_vacio
	goto	fin_niveles							; no hay agua en el acuario y el filtro está lleno (ALARMA)
	
fin_niveles
	return

;************************************
;*                                  *
;* Comprobamos las hora de			*
;* activacion de iluminacion		*
;*                                  *
;************************************
CompruebaHora
	; Miramos la hora de activacion de ADDR_MINUTO
	; ¿estamos en este minuto?
	movf	ADDR_MINUTO, W
	movwf	TMP1

	movf	TMP1,W
	subwf	MINUTO, W
	btfss	STATUS, Z
	goto	no_es_la_hora

	; ¿Estamos en esta hora?
	movf	ADDR_HORA, W
	movwf	TMP1

	movf	TMP1,W
	subwf	HORA, W
	btfss	STATUS, Z
	goto	no_es_la_hora

es_la_hora
	bsf		FLAGS, FLAG_HORA
	goto	fin_comprueba_hora

no_es_la_hora
	bcf		FLAGS, FLAG_HORA

fin_comprueba_hora

	return

;************************************
;*                                  *
;* Comprobamos las horas de			*
;* cebado							*
;*                                  *
;************************************
CompruebaIluminacion
	; Luz 1 ON
l1_on
	movfw	LUZ1_HORA_ON
	movwf	ADDR_HORA
	movfw	LUZ1_MINUTO_ON
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfss	FLAGS, FLAG_HORA
	goto	l2_on
	bsf		LUCES_PORT, LUCES_L1	; Encendemos la luz

l2_on
	; Luz 2 ON
	movfw	LUZ2_HORA_ON
	movwf	ADDR_HORA
	movfw	LUZ2_MINUTO_ON
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfss	FLAGS, FLAG_HORA
	goto	l3_on
	bsf		LUCES_PORT, LUCES_L2	; Encendemos la luz
	
l3_on
	; Luz 3 ON
	movfw	LUZ3_HORA_ON
	movwf	ADDR_HORA
	movfw	LUZ3_MINUTO_ON
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfss	FLAGS, FLAG_HORA
	goto	l4_on
	bsf		LUCES_PORT, LUCES_L3	; Encendemos la luz
	
l4_on
	; Luz 4 ON
	movfw	LUZ4_HORA_ON
	movwf	ADDR_HORA
	movfw	LUZ4_MINUTO_ON
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfss	FLAGS, FLAG_HORA
	goto	l1_off
	bsf		LUCES_PORT, LUCES_L4	; Encendemos la luz
	
l1_off
	; Luz 1 OFF
	movfw	LUZ1_HORA_OFF
	movwf	ADDR_HORA
	movfw	LUZ1_MINUTO_OFF
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfss	FLAGS, FLAG_HORA
	goto	l2_off
	bcf		LUCES_PORT, LUCES_L1	; Apagamos la luz
	
l2_off
	; Luz 2 OFF
	movfw	LUZ2_HORA_OFF
	movwf	ADDR_HORA
	movfw	LUZ2_MINUTO_OFF
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfss	FLAGS, FLAG_HORA
	goto	l3_off
	bcf		LUCES_PORT, LUCES_L2	; Apagamos la luz
	
l3_off
	; Luz 3 OFF
	movfw	LUZ3_HORA_OFF
	movwf	ADDR_HORA
	movfw	LUZ3_MINUTO_OFF
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfss	FLAGS, FLAG_HORA
	goto	l4_off
	bcf		LUCES_PORT, LUCES_L3	; Apagamos la luz
	
l4_off
	; Luz 4 OFF
	movfw	LUZ4_HORA_OFF
	movwf	ADDR_HORA
	movfw	LUZ4_MINUTO_OFF
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfss	FLAGS, FLAG_HORA
	goto	fin_luces
	bcf		LUCES_PORT, LUCES_L4	; Apagamos la luz

fin_luces
	return


;************************************
;*                                  *
;* Comprobamos las horas de			*
;* cebado							*
;*                                  *
;************************************
CompruebaCebado
comprueba_c1
	; Cebado 1 
	movfw	CEBADOR1_HORA_1
	movwf	ADDR_HORA
	movfw	CEBADOR1_MINUTO_1
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR1_HORA_2
	movwf	ADDR_HORA
	movfw	CEBADOR1_MINUTO_2
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR1_HORA_3
	movwf	ADDR_HORA
	movfw	CEBADOR1_MINUTO_3
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR1_HORA_4
	movwf	ADDR_HORA
	movfw	CEBADOR1_MINUTO_4
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR1_HORA_5
	movwf	ADDR_HORA
	movfw	CEBADOR1_MINUTO_5
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR1_HORA_6
	movwf	ADDR_HORA
	movfw	CEBADOR1_MINUTO_6
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR1_HORA_7
	movwf	ADDR_HORA
	movfw	CEBADOR1_MINUTO_7
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR1_HORA_8
	movwf	ADDR_HORA
	movfw	CEBADOR1_MINUTO_8
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR1_HORA_9
	movwf	ADDR_HORA
	movfw	CEBADOR1_MINUTO_9
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR1_HORA_10
	movwf	ADDR_HORA
	movfw	CEBADOR1_MINUTO_10
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	goto	comprueba_c2

activa_c1
	bsf		CEBADOR_PORT, CEBADOR_C1
	call	Pausa1ms
	call	Pausa1ms
	call	Pausa1ms
	call	Pausa1ms
	call	Pausa1ms
	bcf		CEBADOR_PORT, CEBADOR_C1

comprueba_c2
	; Cebado 1 
	movfw	CEBADOR2_HORA_1
	movwf	ADDR_HORA
	movfw	CEBADOR2_MINUTO_1
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR2_HORA_2
	movwf	ADDR_HORA
	movfw	CEBADOR2_MINUTO_2
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR2_HORA_3
	movwf	ADDR_HORA
	movfw	CEBADOR2_MINUTO_3
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR2_HORA_4
	movwf	ADDR_HORA
	movfw	CEBADOR2_MINUTO_4
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR2_HORA_5
	movwf	ADDR_HORA
	movfw	CEBADOR2_MINUTO_5
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR2_HORA_6
	movwf	ADDR_HORA
	movfw	CEBADOR2_MINUTO_6
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR2_HORA_7
	movwf	ADDR_HORA
	movfw	CEBADOR2_MINUTO_7
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR2_HORA_8
	movwf	ADDR_HORA
	movfw	CEBADOR2_MINUTO_8
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR2_HORA_9
	movwf	ADDR_HORA
	movfw	CEBADOR2_MINUTO_9
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	movfw	CEBADOR2_HORA_10
	movwf	ADDR_HORA
	movfw	CEBADOR2_MINUTO_10
	movwf	ADDR_MINUTO
	call	CompruebaHora
	btfsc	FLAGS, FLAG_HORA
	goto	activa_c1

	goto	fin_cebado

activa_c2
	bsf		CEBADOR_PORT, CEBADOR_C2
	call	Pausa1ms
	call	Pausa1ms
	call	Pausa1ms
	call	Pausa1ms
	call	Pausa1ms
	bcf		CEBADOR_PORT, CEBADOR_C2

fin_cebado

	return

;************************************
;*                                  *
;* Comprobamos el oleaje			*
;*                                  *
;************************************
CompruebaOleaje
	return

;************************************
;*                                  *
;* Escribe el mensaje en la linea	*
;* inferior haciendo scroll			*
;* en LINEA4 tenmos la siguiente	*
;* linea a escribir					*
;*                                  *
;************************************
LineaArribaLCD
	movlw	20
	movwf	TMP1

	; Vamos a escribir en la linea 3 del LCD
	movlw	LCD_ROW_3
	addlw	LCD_COL_0
	iorlw	LCD_SET_DDRAM 
	call	LcdWriteCommand

	movf	LINEA4, W
	movwf	TMP2

siguiente_l3
	; cojemos el datos de la linea 4
	movf	TMP2, W
	movwf	FSR
	movf	INDF, W
	call	LcdWriteCommand
	incf	TMP2, F

	decfsz	TMP1, F
	goto	siguiente_l3

	; Linea 4
	movlw	LCD_ROW_3
	addlw	LCD_COL_0
	iorlw	LCD_SET_DDRAM 
	call	LcdWriteCommand

	movlw	20
	movwf	TMP1
	movf	LINEA4, W
	movwf	FSR
siguiente_l4
	movf	INDF, W
	call	LcdWriteData
	incf	FSR, F
	decfsz	TMP1, F
	goto	siguiente_l4

	return

