;__________________________Programa_Completo_______________________________________________






		List	p=16F876	;Tipo de procesador
		include	"P16F876.INC"	;Definiciones de registros internos
                 
Lcd_var		equ	0x20		;Inicio de las variables para el LCD
Key_var		equ	0x22		;Inicio de las variables del teclado				
Temporal_1	equ	0x28		;Variable temporal nº 1
Temporal_2	equ	0x29		;Variable temporal nº 2
Temporal_3	equ	0x2a		;Variable temporal nº 3, Para la rutina de servicio de interrupciones ISR
Reg_W		equ	0x2b
Reg_S		equ	0x2c
Rango		equ	0x2d
T_ambH		equ	0x2e
T_pisH		equ	0x2f
T_amb		equ	0x31
T_pis		equ	0x32
T_deseada	equ	0x33
T_deseada_inf	equ	0x34
T_deseada_sup	equ	0x35
decena_pis		equ	0x36
unidad_pis		equ	0x37
decimal_pis		equ	0x38
decena_amb		equ	0x39
unidad_amb		equ	0x3a
decimal_amb		equ	0x3b
ah			equ	0x3c
al			equ	0x3d
bh			equ	0x3e
bl			equ	0x3f
c			equ	0x40
decena		equ	0x41
unidad		equ	0x42
T_pedidaH	equ	0x43
T_pedida	equ	0x44
T_deseada_infH	equ	0x45
T_deseada_supH	equ	0x46
decena_temporal	equ	0x47
Rango10		equ	0x48
PDel0		equ	0x49
PDel1		equ	0x4a
PDel2		equ	0x4b

		org	0x04
		goto	ISR	;Vector de interrupción		
		org	0x05
		goto	Inicio
				
		









;_____________________________________RUTINA_ESCANEO_DEL_TECLADO____________________________________
;
;
;
;IMP: ¡¡Retorna en el banco 0!!
;
;
;
;
;Presenta dos rutinas que permiten la gestión de un teclado hexadecimal organi-
;zado en una matriz de 4 x 4 
;
;
;Key_Scan: 	realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
;		variable "Tecla" se carga con el código de la tecla pulsada o el 0x80 en caso 
;		de no haber ninguna.
;
;Key_BCD:	Convierte el código de tecla en código BCD (del 0 a F). Antes de llamar a la
;		rutina la variable "Tecla" contiene el código de tecla. Al finalizar, la
;		rutina devuelve el código BCD en la misma variable "Tecla".
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
;		 		      TECLA	    	 			CODIGO
;                 		      			---------------------
;			|---|---|---|---|			0	01111101 = 0x7D
;	RB4 <--	| 1 | 2 | 3 | A |			1	11101110 = 0xEE
;			|---|---|---|---|			2	11101101 = 0xED
;	RB5 <--	| 4 | 5 | 6 | B |			3	11101011 = 0xEB
;			|---|---|---|---|			4	11011110 = 0xDE
;	RB6 <--	| 7 | 8 | 9 | C |			5	11011101 = 0xDD
;			|---|---|---|---|			6	11011011 = 0xDB
;	RB7 <--	| * | 0 | # | D |			7	10111110 = 0xBE
;			|---|---|---|---|			8	10111101 = 0xBD
;		           	        			9	10111011 = 0xBB
;		  	  ^   ^   ^   ^	        	A	11100111 = 0xE7
;		  	  |   |   |   |       		B	11010111 = 0xD7
;		   	 RB0 RB1 RB2 RB3			C	10110111 = 0xB7
;										D	01110111 = 0x77
;										*	01111110 = 0x7E
;										#	01111011 = 0x7B
;
;		

		cblock	Key_var   	;Inicio de las variables
		Tecla			;Retorno del código BCD de la tecla
		Key_1			;Nº de columnas a explorar
		Key_2               	;Temporal de código
		Key_Delay_1		;Variable de temporización
		Key_Delay_2		;Variable de temporización
		endc						



;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" se carga con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.




Key_Scan:	bcf	STATUS,RP0	;Selecciona página 0
		movlw	.4
		movwf	Key_1		;Nº de columnas a explorar
		movlw	b'11110111'
		movwf	Tecla		;1ª columna a activar
Key_Scan_1:	movf    Tecla,W
		movwf	PORTB		;Activa columna				
		nop
		nop
		nop
		nop
		nop
		nop

		movf	PORTB,W
		movwf	Key_2
		subwf	Tecla,W		;Lee las filas
		btfss	STATUS,Z	;Hay alguna pulsada ?
		goto	Key_Scan_2	;Si
		bsf		STATUS,C	;No, no hay ninguna en esa columna
		rrf		Tecla,F		;Seleciona siguiente columna
		decfsz	Key_1,F		;Se han explorado todas las columnas ??
		goto	Key_Scan_1	;No, explorar la siguiente
		movlw	0x80
		movwf	Tecla		;Si, retorna código 0x80 (no hay pulsación)

Key_Scan_5:	bcf	STATUS,RP0	;Selecciona página 0
		return			;Fin de exploración
				
Key_Scan_2:	movlw	.255		;Bucle de temporización de unos 20 mS
		movwf	Key_Delay_1	;para evitar el rebote de los pulsado-
Key_Scan_3:	clrf	Key_Delay_2	;res.
Key_Scan_4:	clrwdt
		nop
		nop
		nop
		nop
		decfsz	Key_Delay_2,F
		goto	Key_Scan_4
		decfsz	Key_Delay_1,F
		goto	Key_Scan_3
				
		movf	Key_2,W		;Guardar código de tecla
		movwf	Tecla
		call	Key_BCD		;Convertir código de tecla a BCD
		goto	Key_Scan_5	;Fin de exploración													

;*************************************************************************************
;Key_BCD: Convierte a BCD el código de tecla que haya en la variable "Tecla" 
 


Key_Tabla	movf	Key_1,W
		addwf	PCL,F		;Calcula desplazamiento
		retlw	0x7d		;0
		retlw	0xee		;1
		retlw	0xed		;2
		retlw	0xeb		;3
		retlw	0xde		;4
		retlw	0xdd		;5
		retlw	0xdb		;6
		retlw	0xbe		;7
		retlw	0xbd		;8
		retlw	0xbb		;9
		retlw	0xe7		;A
		retlw	0xd7		;B
		retlw	0xb7		;C
		retlw	0x77		;D
		retlw	0x7e		;*
		retlw	0x7b		;#
				
Key_BCD:	movf	Tecla,W
 		movwf	Key_2		;Almacena el código de tecla temporalmente
 		clrf	Key_1		;Contador BCD a 0
Key_BCD_2	call	Key_Tabla	;Busca código en la tabla
 		subwf	Key_2,W		;Compara con el de la tecla pulsada
 		btfsc	STATUS,Z	;Coincide ??
 		goto	Key_BCD_1	;Si, el valor de Key_1 es el código BCD de la tecla
 		incf	Key_1,F		;No, incrementa contador BCD
 		movlw	0x10
		subwf	Key_1,W
		btfss	STATUS,Z	;Se han comparado los 16 valores posibles (0-F) ?
		goto	Key_BCD_2	;No, a comparar el siguiente
		movlw	0x80		;Si, la pulsación ha sido incorrecta (una o más teclas
		movwf	Tecla		;pulsadas). Se retorna el código 0x80
		return	
Key_BCD_1	movf	Key_1,W
		movwf	Tecla		;Carga contador BCD en la variable Tecla de salida
		return
				


;*******************************************************************************************
;KEY_PORT_MOL:Inicializa el puerto B del PIC para ser usado con el teclado: 0-3 salidas, 4-7 entradas
;

KEY_PORT_MOL	bsf	STATUS,RP0	;Banco1
		movlw	b'00000111'
		movwf	OPTION_REG	;Activa Pull-Up para las entradas de la puerta B
		movlw	b'11110000'
		movwf	TRISB
		return



















;__________________________________RUTINAS MANEJO DEL LCD___________________________________________
;
;						ADAPTADO PARA USAR POR EL PUERTO C Y A0-A2
;
;Las rutinas están adaptadas a las velocidades más lentas de los nuevos módulos LCD, en las cuales 
;el tiempo de activación (Tc) de la señal ENABLE es de unos 40 uS. La velocidad de trabajo del 
;PIC es de 20MHz
;


#define ENABLE       bsf PORTA,2        ;Activa señal E
#define DISABLE      bcf PORTA,2        ;Desactiva señal E
#define LEER         bsf PORTA,1        ;Pone LCD en Modo RD
#define ESCRIBIR     bcf PORTA,1        ;Pone LCD en Modo WR
#define OFF_COMANDO  bcf PORTA,0        ;Desactiva RS (modo comando)
#define ON_COMANDO   bsf PORTA,0        ;Activa RS (modo dato

		CBLOCK	Lcd_var		;Inicio de las variables. Será la primera						
		Lcd_Temp_1		;direccón libre disponible
		Lcd_Temp_2
		ENDC											

;*************************************************************************
;LCD_PORT_MOL: Configuración PIC para el LCD, ¡¡Modificado por mi!!.
;
LCD_PORT_MOL	bsf     STATUS,RP0      ;Banco 1
                movlw	b'00000110'
				movwf	ADCON1		;Puerto A digital
				clrf    TRISC           ;RC <0-7> salidas digitales
                movlw	b'00011000'    	;A3,A4 entradas resto de A salidas
                movwf	TRISA
				bcf     STATUS,RP0      ;Banco 0
                OFF_COMANDO             ;RS=0
                DISABLE                 ;E=0
                return
;
;**************************************************************************
;LCD_BUSY: Lectura del Flag Busy y la dirección.
;
LCD_BUSY        LEER                    ;Pone el LCD en Modo RD
                bsf     STATUS,RP0           
                movlw   0xFF
                movwf   TRISC           ;Puerta C como entrada
                bcf     STATUS,RP0      ;Selecciona el banco 0
                ENABLE                  ;Activa el LCD
                nop
LCD_BUSY_1		btfsc   PORTC,7         ;Chequea bit de Busy
                goto    LCD_BUSY_1		;
                DISABLE                 ;Desactiva LCD
                bsf     STATUS,RP0                               
                clrf    TRISC           ;Puerta C salida
                bcf     STATUS,RP0                              
                ESCRIBIR                ;Pone LCD en modo WR
                return

;**************************************************************************
;LCD_E: Pulso de Enable. En los nuevos LCD's esta señal debe estar a "0" unos 40uS 
;antes de volver a ponerse a "1".
;
LCD_E           ENABLE          	;Activa E
		nop
		nop
		nop
       	DISABLE                 	;Desactiva E
		movlw	.75
		movwf	Lcd_Temp_1
LCD_E_1		decfsz	Lcd_Temp_1,F	;Pierde unos 40 uS para la constante de tiempo Tc
		goto	LCD_E_1				;de los nuevos módulos LCD de winteck
		return
;
;**************************************************************************
;LCD_DATO: Escritura de datos en DDRAM o CGRAM. Envía el dato presente en el W
;
LCD_DATO        OFF_COMANDO             ;Desactiva RS (modo comando)
                movwf   PORTC           ;Valor ASCII a sacar por portb
                call    LCD_BUSY        ;Espera a que se libere el LCD
                ON_COMANDO              ;Activa RS (modo dato).
                goto    LCD_E           ;Genera pulso de E

;**************************************************************************
;LCD_REG: Escritura de comandos en el LCD. Envía el comando presente en el W

LCD_REG         OFF_COMANDO             ;Desactiva RS (modo comando)
                movwf   PORTC           ;Código de comando.
                call    LCD_BUSY        ;LCD libre?.
                goto    LCD_E           ;SI.Genera pulso de E.

;***************************************************************************
;LCD_INI: inicialización del LCD enviando el comando "Function Set" 3 veces consecutivas
;con un intervalo de unos 5 mS. El LCD queda borrado y el cursor en la primera posición

LCD_INI		movlw	b'00111000'
		call	LCD_REG		;Código de instrucción
		call	LCD_DELAY	;Temporiza
		movlw	b'00111000'
		call	LCD_REG		;Código de instrucción
		call	LCD_DELAY	;Temporiza
		movlw	b'00111000'
		call	LCD_REG		;Código de instrucción
		call	LCD_DELAY	;Temporiza
		movlw   b'00000001'     ;Borra LCD y Home.
                call    LCD_REG
                return

;*****************************************************************************
;LCD_DELAY: Rutina de temporización de unos 5 mS a 20MHz. Se emplean las variables Lcd_Temp_1
;y LCD_Temp_2 en lugar del TMR0. Este queda libre para las aplicaciones del usuario

LCD_DELAY:	clrwdt
                movlw	.35
                movwf	Lcd_Temp_1
                clrf	Lcd_Temp_2
LCD_DELAY_1:	decfsz	Lcd_Temp_2,F
		goto	LCD_DELAY_1
		decfsz	Lcd_Temp_1,F
		goto	LCD_DELAY_1
		return














;______________________________________ISR______________________________________________________
;		Rutina de Servicio de Interrupcion
;
ISR
		movwf	Reg_W			;Recomendacion de Microchip para guardar los regisros STATUS y W en una interrupcion
		swapf	STATUS,W
		movwf	Reg_S

		bcf		INTCON,RBIE		;Deshabilita Interrupcion por teclado
		call	Key_Scan
		movf	Tecla,W
		movwf	Temporal_3		;guarda la tecla que activa la interrupcion en Temporal_3
		call	Retardo_10ms	;Evitar los rebotes

ISR_1	call	Key_Scan
		movlw	0x80
		subwf	Tecla,W			
		btfss	STATUS,Z		;¿Se ha soltado la tecla?
		goto	ISR_1			;No se ha soltado aun
		call	Retardo_10ms	;Ya se ha soltado, se continua con el ISR

		movf	Temporal_3,W	;Recupera la tecla que causo la interrupcion
		sublw	b'00001101'		;Tecla D
		btfsc	STATUS,Z
		goto	Reinicio_Total

		movf	Temporal_3,W
		sublw	b'00001100'		;Tecla C
		btfsc	STATUS,Z
		goto	Parada

ISR_FIN	swapf	Reg_S,W
		movwf	STATUS
		swapf	Reg_W,f
		swapf	Reg_W,W
		
		bcf		INTCON,RBIF		;Pone a cero la bandera de interrupcion por teclado
		bsf		INTCON,RBIE		;Rehabilita la interrupcion por teclado
		retfie					;Retorna a la instruccion siguiente a la interrupcion y habilita GIE	








;____________________________________OTRAS_RUTINAS______________________________________________
;
;
;
;************************************************************************************************

Apagar_Bomba	bcf	STATUS,RP0
		bcf	PORTA,5
		return

Encender_Bomba	bcf	STATUS,RP0
		bsf	PORTA,5
		return




Retardo_1seg
		movlw     .165      ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .41       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .147      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
        return              ; 2+2 Fin.
		
Retardo_10ms			;Para la ISR

		movlw     .55       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop11  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop22  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop22    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop11    ; 2 no, loop
        return              ; 2+2 Fin.


Retardo_Transm_Temp	return	;aqui pondre un retado de 20seg

Reinicio_Total	return	;Para la ISR usando el wdt, estudiar de r-luis bucle infinito, contador, etc.



Habilitar_Interrupciones
		bcf		STATUS,RP0	;Banco 0
		movlw	b'10001000'
		movf	INTCON,W
		return


Deshabilitar_Interrupciones
		bcf		STATUS,RP0	;Bnco 0
		clrf	INTCON		
		



Parada	movlw	Mensaje_3.1a
		call	Mensaje
		movlw	0xc0
		call	LCD_REG
		movlw	Mensaje_3.1b
		call	Mensaje

Parada_1	call	Key_Scan
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z
		goto	Parada_1

		movf	Tecla,W
		sublw	b'00001100'
		btfsc	STATUS,Z
		goto	Retorno_Parada	;es la C
		call	Retardo_10ms
		goto	Parada_1

Retorno_Parada	return






;*******************************************************************************

;Calculo_de_Temperaturas deseadas superior e inferior

Calculo_de_Temperaturas

	movf	Rango,W
	movwf	Rango10
	bcf		STATUS,C
	rlf		Rango10,1
	rlf		Rango10,1
	rlf		Rango10,1
	addwf	Rango10,1
	addwf	Rango10,1
	
Tinferior

	movf	Rango10			;Rango10 > T_amb
	subwf	T_amb,W			;T_amb - Rango10
	btfss	STATUS,C
	goto	Paso1			;si
	movwf	T_deseada_inf	;no, entonces no desborda y guarda la resta
	btfss	T_ambH,0		;mantiene el bit alto
	goto	BitBajo
	bsf		T_deseada_infH,0
	goto	Tsuperior

BitBajo
	bcf		T_deseada_infH,0
	goto	Tsuperior


Paso1

	btfss	T_ambH,0
	goto	Problem1			;pretente mantener una temperatura menor de cero
	movlw	b'11111111'
	movwf	T_deseada_inf		;T_deseada_inf como registro auxiliar = 1111 1111
	movf	Rango10,W
	subwf	T_deseada_inf,0		;W = 1111 1111 - Rango10 (resta del bit H que ahora pondre a cero)
	addwf	T_amb,0				;sumo la resta anterior con la parte baja de T_amb
	movwf	T_deseada_inf
	incf	T_deseada_inf		;sumo uno, lo que falta de 1111 1111 hasta 1 0000 0000
	bcf		T_deseada_infH,0		;pongo a cero el bit H

Tsuperior
	
	movf	T_amb,W
	addwf	Rango10,0		;W = Rango10 + T_amb
	movwf	T_deseada_sup
	btfss	STATUS,C		;¿desborda?
	goto	CARRY1NO		;no
	btfsc	T_ambH,0			;si, entonces si el bit H es cero lo pone a 1, si ya era 1 pretende calcular una Temp mayor de 50ºC
	goto	Problem1		;es un 1
Paso2	
	bsf		T_deseada_supH,0	;es un cero, asi que pone un 1 en el bit H
	return

CARRY1NO
	btfsc	T_ambH,0
	goto	Paso2
	bcf		T_deseada_supH,0
	return 
Problem1
	return








;*******************************************************************************

ObtenerT_pedida					
	bcf		T_pedidaH,0
	movf	decena,W
	movwf	decena_temporal
	bcf		STATUS,C
	rlf		decena_temporal,1
	rlf		decena_temporal,1
	rlf		decena_temporal,1	;decena x 8
	addwf	decena_temporal,1
	addwf	decena_temporal,1	;decena x 10
	movf	unidad,W
	addwf	decena_temporal,1	;(decena x 10) + unidad
	movf	decena_temporal,W
	movwf	T_pedida			;ahora multiplico T_pedida por 10
	rlf		T_pedida,1
	rlf		T_pedida,1
	rlf		T_pedida,1			;a partir de aqui es donde puede activarse el bit de CARRY (si es mayor de 25)
	btfsc	STATUS,C			;¿desborda?
	goto	desbordamiento_1
sal1	addwf	T_pedida,1			
	btfsc	STATUS,C			;¿desborda?
	goto	desbordamiento_2
sal2	addwf	T_pedida,1
	btfsc	STATUS,C			;¿desborda?
	goto	desbordamiento_3
	return

desbordamiento_1
	bsf		T_pedidaH,0
	bcf		STATUS,C
	goto	sal1

desbordamiento_2
	bsf		T_pedidaH,0
	bcf		STATUS,C
	goto	sal2

desbordamiento_3
	bsf		T_pedidaH,0
	bcf		STATUS,C
	return

;********************************************************************************

Comparacion			; ¿a>b? SI--> c = 0. NO--> c = 1 (bit 0)

	bcf		STATUS,C	;limpio el bit de CARRY
	btfsc	ah,0		;¿Como es a?
	goto	agrande
	
	btfsc	bh,0		;a es pequeña (menor de 25,5ºC) ¿como es b?
	goto	NO			;b grande a pequeña, entonces a>b-->NO
	goto	iguales		;las dos pequeñas

agrande
	btfss	bh,0		;¿como es b?
	goto	SI			;a grande b pequeña, entonces a>b-->SI
	
iguales
	movf	al,W
	subwf	bl,W
	btfsc	STATUS,C
	goto	NO

SI	bcf		c,0
	goto	fin_comparacion

NO	bsf		c,0

fin_comparacion	return






;***************************************************************************

ConversorADPis

	bsf		STATUS,RP0	;banco1
	clrf	ADCON1		;PORTA analogico
	bcf		STATUS,RP0	;banco0

	bsf		ADCON0,ADON	;Activa el conversor
	bsf		ADCON0,CHS0	;Selecciona Chanel 3 de la piscina
	bsf		ADCON0,CHS1
	bcf		ADCON0,CHS2

Ciclo_Pis
	bsf		ADCON0,2	;Inicia conversion
	btfsc	ADCON0,2
	goto	Ciclo_Pis

	bsf		STATUS,RP0
	movf	ADRESL,W
	bcf		STATUS,RP0
	movwf	T_pis
	movwf	decimal_pis
	movf	ADRESH,W
	movwf	T_pisH

	movwf	decimal_pis		;Convierte el dato presente en W en decena, unidad y decimal
	clrf	unidad_pis
	clrf	decena_pis
	movlw	d'100'			;Determina la cant. de decimales

DECI1	subwf	decimal_pis, 1
	btfsc	STATUS,C
	goto	DIEZ1
	incf	decena_pis, 1
	goto	DECI1

DIEZ1	addwf	decimal_pis, 1
	movlw	d'10'			;Determina la cant. de unidades

UNI1	subwf	decimal_pis, 1
	btfsc	STATUS,C
	goto	UNO1
	incf	unidad_pis, 1
	goto	UNI1
UNO1	addwf	decimal_pis, 1		;decimal queda con la cant. de decimales (sin decenas ni unidades)



	btfsc	ADRESH,0		;Compruebo si la Tª es mayor de 25,5ºC
	goto	Mas_de_255Pis		;Lo es, la trato
	goto	Fin_conver_pis
Mas_de_255Pis
	movlw	.6					;sumo 256
	addwf	decimal_pis,1
	movlw	.5
	addwf	unidad_pis,1
	movlw	.2
	addwf	decena_pis,1

AjustePis	movlw	.10
	subwf	decimal_pis,1
	btfss	STATUS,C
	goto	AjustePis1
	incf	unidad_pis,1
	goto	AjustePis
AjustePis1	addwf	decimal_pis,1	;repone
AjustePis2	subwf	unidad_pis,1
	btfss	STATUS,C
	goto	AjustePis3
	incf	decena_pis,1
	goto	AjustePis2
AjustePis3	addwf	unidad_pis,1	;repone


Fin_conver_pis

	movlw	0x30			;Le suma 30h a los valores de decena, unidad y decimal para que queden en ASCII
	addwf	decimal_pis, 1
	addwf	unidad_pis, 1
	addwf	decena_pis, 1
	
	bsf		STATUS,RP0		;banco1
	movlw	b'00000110'		;PORTA	digital
	movwf	ADCON1
	bcf		STATUS,RP0		;banco0
	return





;*********************************************************************************

ConversorADAmb

	bsf		STATUS,RP0	;banco1
	clrf	ADCON1		;PORTA	analogico
	bcf		STATUS,RP0	;banco0
	bsf		ADCON0,ADON	;Activa el conversor
	bcf		ADCON0,CHS0	;Selecciona Chanel 4 de la amb
	bcf		ADCON0,CHS1
	bsf		ADCON0,CHS2

Ciclo_Amb
	bsf		ADCON0,2	;Inicia conversion
	btfsc	ADCON0,2
	goto	Ciclo_Amb
	bsf		STATUS,RP0
	movf	ADRESL,W
	bcf		STATUS,RP0
	movwf	T_amb
	movwf	decimal_amb
	movf	ADRESH,W
	movwf	T_ambH

	movwf	decimal_amb		;Convierte el dato presente en W en decena, unidad y decimal
	clrf	unidad_amb
	clrf	decena_amb
	movlw	d'100'			;Determina la cant. de decimales

DECI2	subwf	decimal_amb, 1
	btfsc	STATUS,C
	goto	DIEZ2
	incf	decena_amb, 1
	goto	DECI2

DIEZ2	addwf	decimal_amb, 1
	movlw	d'10'			;Determina la cant. de unidades

UNI2	subwf	decimal_amb, 1
	btfsc	STATUS,C
	goto	UNO2
	incf	unidad_amb, 1
	goto	UNI2
UNO2	addwf	decimal_amb, 1		;decimal queda con la cant. de decimales (sin decenas ni unidades)



	btfsc	ADRESH,0		;Compruebo si la Tª es mayor de 25,5ºC
	goto	Mas_de_255Amb		;Lo es, la trato
	goto	Fin_conver_amb
Mas_de_255Amb
	movlw	.6					;sumo 256
	addwf	decimal_amb,1
	movlw	.5
	addwf	unidad_amb,1
	movlw	.2
	addwf	decena_amb,1

AjusteAmb	movlw	.10
	subwf	decimal_amb,1
	btfss	STATUS,C
	goto	AjusteAmb1
	incf	unidad_amb,1
	goto	AjusteAmb
AjusteAmb1	addwf	decimal_amb,1	;repone
AjusteAmb2	subwf	unidad_amb,1
	btfss	STATUS,C
	goto	AjusteAmb3
	incf	decena_amb,1
	goto	AjusteAmb2
AjusteAmb3	addwf	unidad_amb,1	;repone


Fin_conver_amb

	movlw	0x30			;Le suma 30h a los valores de decena, unidad y decimal para que queden en ASCII
	addwf	decimal_amb, 1
	addwf	unidad_amb, 1
	addwf	decena_amb, 1

	bsf		STATUS,RP0		;banco1
	movlw	b'00000110'		;PORTA digital
	movwf	ADCON1
	bcf		STATUS,RP0		;banco0
	return









;______________________________________TABLA DE MENSAJES______________________________________


Tabla_Mensajes	movwf	PCL		;Desplazamiento sobre la tabla

Mensaje_0a	equ $
			dt	"A_Programa 1",0x00

Mensaje_0b	equ	$
			dt	"B_Programa 2",0x00		

Mensaje_Error_1		equ	$
			dt	"Comando invalido",0x00

Mensaje_Error_2a	equ	$
			dt	"TEMPERAT AMBIENTE",0x00

Mensaje_Error_2b	equ	$
			dt	"BAJA ESPERE....",0x00

Mensaje_1.1			equ	$
			dt	"INTRODUZCA RANGO ",0x00

Mensaje_1.2			equ	$
			dt	"RANGO:",0x00

Mensaje_1.3a		equ	$
			dt	"A_aceptar" 
Mensaje_1.3b		equ	$
			dt	"B_borrar C_salir",0x00

Mensaje_1.4a		equ	$
			dt	"Ta:",0x00
Mensaje_1.4b		equ	$
			dt	" Tp:",0x00

Mensaje_Bact		equ	$
			dt	"  BOMBA ACTIVA",0x00

Mensaje_Bpar		equ	$
			dt	"  BOMBA PARADA",0x00

Mensaje_2.1			equ	$
			dt	"INTRODUZCA TEMP.",0x00

Mensaje_2.2			equ	$
			dt	"TEMP:",0x00

Mensaje_2.3			equ	$
			dt	"Tfija:",0x00

Mensaje_3.1a		equ	$
			dt	"PARO DEL SISTEMA",0x00

Mensaje_3.1b		equ	$
			dt	"PULSE C",0x00


Mensaje_Calibracion	equ	$
			dt	"Pulse A: Refresh"









;______________________________________PROCEDIMIENTO DE IMPRESION_______________________________


Mensaje         	movwf   	Temporal_1      	;Salva posición de la tabla
Mens_1       		movf    	Temporal_1,W    	;Recupera posición de la tabla
                	call    	Tabla_Mensajes  	;Busca caracter de salida
                	movwf   	Temporal_2      	;Guarda el caracter
                	movf    	Temporal_2,F
                	btfss   	STATUS,Z        	;Mira si es el último
                	goto    	No_es_ultimo
                	return
No_es_ultimo    	call    	LCD_DATO        	;Visualiza en el LCD
                	incf    	Temporal_1,F    	;Siguiente caracter
                	goto    	Mens_1

















;______________________________________PROGRAMA PRINCIPAL________________________________________

Inicio		
		
		call	LCD_PORT_MOL
		call	KEY_PORT_MOL
		
		call	Deshabilitar_Interrupciones

		call 	Apagar_Bomba
		
		call	LCD_INI

		movlw	b'00000110'
		call	LCD_REG	

		movlw b'00001100'
		call LCD_REG		;Display ON, cursor OFF, Parpadeo OFF

Mensaje_Selecc_Prog
		
		movlw	b'00000001'	
		call	LCD_REG		;Borra LCD y pasa el cursor a la primera posicion

		movlw	Mensaje_0a	;A_programa 1
		call	Mensaje

		movlw	0xc0		;segunda linea
		call	LCD_REG

		movlw	Mensaje_0b	;B_programa 2
		call	Mensaje

Exploracion_del_teclado_1

		call	Key_Scan
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z
		goto	Exploracion_del_teclado_1	;Bucle hasta que se pulse alguna

		movf	Tecla,W
		sublw	b'00001010'
		btfsc	STATUS,Z
		goto	Secuencia_1	;es la A

		movf	Tecla,W
		sublw	b'00001011'
		btfsc	STATUS,Z
		goto	Secuencia_2	;es la B
		
		movf	Tecla,W
		sublw	b'00001100'
		btfsc	STATUS,Z
		goto	Calibracion	;es la C

		movf	Tecla,W
		sublw	b'00001101'
		btfsc	STATUS,Z
		goto	Inicio		;es la D


		movlw	b'00000001'	
		call	LCD_REG		;Borra LCD y pasa el cursor a la primera posicion

		movlw	Mensaje_Error_1
		call	Mensaje
		call	Retardo_1seg
		call	Retardo_1seg

		goto	Mensaje_Selecc_Prog


Secuencia_1

		call	Deshabilitar_Interrupciones
		movlw	b'00000001'
		call	LCD_REG		;Borra pantalla y Cursor a Home

		movlw	Mensaje_1.1	;introduzca rango
		call	Mensaje		

		movlw	b'00001111'
		call	LCD_REG		;Display ON, Cursor ON, Parpadeo ON

Exploracion_del_teclado_2

		call	Key_Scan
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z					;¿Alguna pulsada?
		goto	Exploracion_del_teclado_2	;No

		movf	Tecla,W		;si
		sublw	.9
		btfss	STATUS,C	;¿es mayor que 9 (a,b,c,d,,e,f)?
		goto	Mayor_que_9	;si

		movf	Tecla,W		;no
		addlw	0x30		;ajuste del valor de la tecla pulsada (del 0 al 9, para a-f sumar 0x37) de binario BCD a ASCII
		call	LCD_DATO
		goto	Guardar_Rango

Mayor_que_9

		movlw	b'00001100'
		call	LCD_REG		;Cursor normal, sin parpadeo
		movlw	b'00000001'
		call	LCD_REG		;Borra LCD y Cursor Home
		movlw	Mensaje_Error_1
		call	Mensaje
		call	Retardo_1seg
		call	Retardo_1seg
		goto	Secuencia_1



Guardar_Rango
		
		movf	Tecla,W	;Guarda el valor pulsado en Rango
		movwf	Rango

Reinicio_1
		
		movlw	b'00001100'
		call	LCD_REG
		movlw	b'00000001'
		call	LCD_REG		;Borra LCD y Cursor a Home
		
		movlw	Mensaje_1.2
		call	Mensaje
		movf	Rango,W
		addlw	0x30		;ajuste de nuevo a codigo ASCII
		call	LCD_DATO	
		movlw	Mensaje_1.3a
		call	Mensaje
		movlw	0xC0		;Segunda linea lcd
		call	LCD_REG
		movlw	Mensaje_1.3b
		call	Mensaje

Exploracion_del_teclado_3

		call	Key_Scan
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z					;¿alguna pulsada?
		goto	Exploracion_del_teclado_3	;No

		movf	Tecla,W		;Si, ¿cual?
		sublw	b'00001010'
		btfsc	STATUS,Z
		goto	Secuencia_1.1	;la A

		movf	Tecla,W		
		sublw	b'00001010'
		btfsc	STATUS,Z
		goto	Secuencia_1		;la B

		movf	Tecla,W		
		sublw	b'00001010'
		btfsc	STATUS,Z
		goto	Inicio			;la C

		movlw	b'00000001'	;No es A,B ni C
		call	LCD_REG		;Borra LCD y pone cursor en Home
		movlw	Mensaje_Error_1
		call	Mensaje
		call	Retardo_1seg
		call	Retardo_1seg
		goto	Reinicio_1	;Reinicia dese mensaje de rango:x Aaceptar...







Secuencia_1.1

		call	Habilitar_Interrupciones
		movlw	b'00000001'		;Borra pantalla y a Home
		call	LCD_REG
		bsf		STATUS,RP0
		bsf		ADCON1,7		;Jutificacion Right adresh solo dos bits bajos
		bcf		STATUS,RP0
		bsf		ADCON0,0		;Habilita el conversor

Reinicio_2
		call	ConversorADAmb	;
		call	ConversorADPis
	

		movlw	Mensaje_1.4a	;Imprimo: Ta:XX,X la temperatura ambiente
		call	Mensaje
		movf	decena_amb,W
		addlw	0x30
		call	LCD_DATO
		movf	unidad_amb,W
		addlw	0x30
		call	LCD_DATO
		movlw	0x2c			; es una coma,
		call	LCD_DATO
		movf	decimal_amb,W
		addlw	0x30
		call	LCD_DATO
		

		movlw	Mensaje_1.4b		;Imprimo: Tp:XX,X la temperatura de la piscina
		call	Mensaje
		movf	decena_pis,W
		addlw	0x30
		call	LCD_DATO
		movf	unidad_pis,W
		addlw	0x30
		call	LCD_DATO
		movlw	0x2c				; es una coma,
		call	LCD_DATO
		movf	decimal_pis,W
		addlw	0x30
		call	LCD_DATO

		movf	T_ambH,W
		movwf	ah
		movf	T_amb,W			;Me pregunto si T_amb>T_pis
		movwf	al
		movf	T_pisH,W
		movwf	bh
		movf	T_pis,W
		movwf	bl
		call	Comparacion

		btfss	c,0
		goto	Salto_1.1		;Si, puede calentar y voy a activar la bomba si es necesario
		
		movlw	b'00000001'
		call	LCD_REG
		movlw	Mensaje_Error_2a
		call	Mensaje
		movlw	0xc0
		call	LCD_REG
		movlw	Mensaje_Error_2b
		call	Mensaje
		call	Retardo_Transm_Temp
		
		goto	Reinicio_2

Salto_1.1

		call	Calculo_de_Temperaturas		;Calculo las T_deseada, sup e inf para ver si necesito activar o no la bomba

		movf	T_deseada_infH,W
		movwf	ah
		movf	T_deseada_inf,W
		movwf	al
		movf	T_pisH,W
		movwf	bh					
		movf	T_pis,W						;¿T_deseada_inf>T_pis?
		movwf	bl
		call	Comparacion
		btfss	c,0
		goto	Activar_Bomba	;si
		
		movlw	0xC0
		call	LCD_REG
		movlw	Mensaje_Bpar
		call	Mensaje
		goto	Reinicio_2

Activar_Bomba
		
		call	Encender_Bomba
		movlw	0xC0
		call	LCD_REG
		movlw	Mensaje_Bact
		call	Mensaje

		call	Retardo_Transm_Temp
		call	ConversorADAmb		;Ahora imprimo los nuevos valores de temperatura
		call	ConversorADPis


		movlw	Mensaje_1.4a	;Imprimo: Ta:XX,X la temperatura ambiente
		call	Mensaje
		movf	decena_amb,W
		addlw	0x30
		call	LCD_DATO
		movf	unidad_amb,W
		addlw	0x30
		call	LCD_DATO
		movlw	0x2c			; es una coma,
		call	LCD_DATO
		movf	decimal_amb,W
		addlw	0x30
		call	LCD_DATO
		

		movlw	Mensaje_1.4b		;Imprimo: Tp:XX,X la temperatura de la piscina
		call	Mensaje
		movf	decena_pis,W
		addlw	0x30
		call	LCD_DATO
		movf	unidad_pis,W
		addlw	0x30
		call	LCD_DATO
		movlw	0x2c				; es una coma,
		call	LCD_DATO
		movf	decimal_pis,W
		addlw	0x30
		call	LCD_DATO



		movf	T_ambH,W
		movwf	ah
		movf	T_amb,W			;Me pregunto si T_amb>T_pis
		movwf	al
		movf	T_pisH,W
		movwf	bh
		movf	T_pis,W
		movwf	bl
		call	Comparacion

		btfss	c,0
		goto	Salto_1.2		;Si, puede seguir calentando
		
		movlw	b'00000001'		;No puede calentar
		call	LCD_REG
		movlw	Mensaje_Error_2a	;TEMP AMBIENTE BAJA ESPERE...
		call	Mensaje
		movlw	0xc0
		call	LCD_REG
		movlw	Mensaje_Error_2b
		call	Mensaje
		call	Retardo_Transm_Temp		
		
		goto	Reinicio_2
		
Salto_1.2	

		call	Calculo_de_Temperaturas

		movf	T_pisH,W
		movwf	ah
		movf	T_pis,w
		movwf	al
		movf	T_deseada_supH,W
		movwf	bh
		movf	T_deseada_sup,W
		movwf	bl
		call	Comparacion
		btfsc	c,0
		goto	Activar_Bomba

		call	Apagar_Bomba
		movlw	0xC0
		call	LCD_REG
		movlw	Mensaje_Bpar
		call	Mensaje
		call	Retardo_Transm_Temp
		goto	Reinicio_2
		







;*****************************************************************************************
;*****************************************************************************************
;*****************************************************************************************





Secuencia_2

		call	Deshabilitar_Interrupciones
		movlw	b'00000001'	
		call	LCD_REG		;Borra LCD y pasa el cursor a la primera posicion

		movlw	Mensaje_2.1
		call	Mensaje
		
		movlw	b'00001111'
		call	LCD_REG		;Display ON, Cursor ON, Parpadeo ON


Exploracion_del_teclado_4

		call	Key_Scan
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z					;¿Alguna pulsada?
		goto	Exploracion_del_teclado_4	;No

		movf	Tecla,W		;si
		sublw	.4
		btfss	STATUS,C	;¿es mayor que 4 (5,6,7,8,9,a,b,c,d,e,f)?
		goto	Mayor_que_4	;si

		movf	Tecla,W		;no
		addlw	0x30		;ajuste del valor de la tecla pulsada (del 0 al 4, para a-f sumar 0x37) de binario BCD a ASCII
		call	LCD_DATO
		goto	Guardar_Decena

Mayor_que_4

		movlw	b'00001100'
		call	LCD_REG		;Cursor normal, sin parpadeo
		movlw	b'00000001'
		call	LCD_REG		;Borra LCD y Cursor Home
		movlw	Mensaje_Error_1
		call	Mensaje
		call	Retardo_1seg
		call	Retardo_1seg
		goto	Secuencia_2

Guardar_Decena

		movf	Tecla,W
		movwf	decena


Exploracion_del_teclado_5

		call	Key_Scan
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z					;¿Alguna pulsada?
		goto	Exploracion_del_teclado_5	;No

		movf	Tecla,W		;si
		sublw	.9
		btfss	STATUS,C	;¿es mayor que 9 (a,b,c,d,e,f)?
		goto	Mayor_9		;si

		movf	Tecla,W		;no
		addlw	0x30		;ajuste del valor de la tecla pulsada (del 0 al 9, para a-f sumar 0x37) de binario BCD a ASCII
		call	LCD_DATO
		goto	Guardar_Unidad

Mayor_9

		movlw	b'00001100'
		call	LCD_REG		;Cursor normal, sin parpadeo
		movlw	b'00000001'
		call	LCD_REG		;Borra LCD y Cursor Home
		movlw	Mensaje_Error_1
		call	Mensaje
		call	Retardo_1seg
		call	Retardo_1seg
		goto	Secuencia_2

Guardar_Unidad

		movf	Tecla,W
		movwf	unidad
		call	Retardo_1seg
Reinicio_2.1
		movlw	b'00001100'	;Elimina representacion del cursor y parpadeo
		call	LCD_REG
		movlw	b'00000001'
		call	LCD_REG		;Borra LCD y Cursor a Home

		movlw	Mensaje_2.2
		call	Mensaje
		movf	decena,W
		addlw	0x30		;ajuste de nuevo a codigo ASCII
		call	LCD_DATO	
		movf	unidad,W
		addlw	0x30		;ajuste de nuevo a codigo ASCII
		call	LCD_DATO	
		movlw	Mensaje_1.3a
		call	Mensaje	
		movlw	0xC0
		call	LCD_REG		;Coloca cursor 1er. caracter, 2ª fila
		movlw	Mensaje_1.3b
		call	Mensaje

Exploracion_del_teclado_6

		call	Key_Scan
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z					;¿alguna pulsada?
		goto	Exploracion_del_teclado_6	;No

		movf	Tecla,W		;Si, ¿cual?
		sublw	b'00001010'
		btfsc	STATUS,Z
		goto	Salto_2.1	;la A

		movf	Tecla,W		
		sublw	b'00001010'
		btfsc	STATUS,Z
		goto	Secuencia_2	;la B

		movf	Tecla,W		
		sublw	b'00001010'
		btfsc	STATUS,Z
		goto	Inicio		;la C

		movlw	b'00000001'	;No es A,B ni C
		call	LCD_REG		;Borra LCD y pone cursor en Home
		movlw	Mensaje_Error_1
		call	Mensaje
		call	Retardo_1seg
		call	Retardo_1seg
		goto	Reinicio_2.1	;Reinicia dedse mensaje de Temp:xx A_aceptar...

Salto_2.1

		call	ObtenerT_pedida
		call	ConversorADAmb
		call	ConversorADPis

		movf	T_ambH,W
		movwf	ah
		movf	T_amb,W			;Me pregunto si T_amb>T_pedida
		movwf	al
		movf	T_pedidaH,W
		movwf	bh
		movf	T_pedida,W
		movwf	bl
		call	Comparacion

		btfss	c,0
		goto	Secuencia_2.1	;si, puede calentar	
		
		movlw	b'00000001'		;No puede calentar
		call	LCD_REG
		movlw	Mensaje_Error_2a	;TEMP AMBIENTE BAJA ESPERE...
		call	Mensaje
		movlw	0xc0
		call	LCD_REG
		movlw	Mensaje_Error_2b
		call	Mensaje
		goto	Secuencia_2


;*****************************************************************************
;*****************************************************************************




Secuencia_2.1

		call	Habilitar_Interrupciones
		movlw	b'00000001'		;Borra pantalla y a Home
		call	LCD_REG
		bsf		STATUS,RP0		;Banco 1
		bsf		ADCON1,7		;Jutificacion Right adresh solo dos bits bajos, los desprecio
		bcf		STATUS,RP0		;Banco 0
		bsf		ADCON0,0		;Habilita el conversor

Reinicio_2.2
		
		call	Apagar_Bomba
		
		movlw	b'00000001'
		call	LCD_REG
		movlw	Mensaje_2.3		;Tfija
		call	Mensaje
		movf	decena,W
		addlw	0x30			;ajuste de nuevo a codigo ASCII
		call	LCD_DATO	
		movf	unidad,W
		addlw	0x30			;ajuste de nuevo a codigo ASCII
		call	LCD_DATO		
		movlw	Mensaje_1.4b	;Imprimo: Tp:XX,X la temperatura de la piscina
		call	Mensaje
		movf	decena_pis,W
		addlw	0x30
		call	LCD_DATO
		movf	unidad_pis,W
		addlw	0x30
		call	LCD_DATO
		movlw	0x2c			; es una coma,
		call	LCD_DATO
		movf	decimal_pis,W
		addlw	0x30
		call	LCD_DATO

		movlw	0xC0			;pasa a la segunde linea del LCD
		call	LCD_REG
		movlw	Mensaje_Bpar
		call	Mensaje	

Reinicio_2.3

		movf	T_pisH,W
		movwf	ah
		movf	T_pis,W			;Me pregunto si T_pis>T_pedida
		movwf	al
		movf	T_pedidaH,W
		movwf	bh
		movf	T_pedida,W
		movwf	bl
		call	Comparacion

		btfss	c,0
		goto	Salto_2.2		;si, espera a que se enfrie

Salto_2.2
		call	Retardo_Transm_Temp
		call	ConversorADAmb
		call	ConversorADPis
		
		movf	T_ambH,W
		movwf	ah
		movf	T_amb,W			;Me pregunto si T_amb>T_pedida
		movwf	al
		movf	T_pedidaH,W
		movwf	bh
		movf	T_pedida,W
		movwf	bl
		call	Comparacion

		btfss	c,0
		goto	Reinicio_2.2	;si, puede calentar

		movlw	b'00000001'		;No puede calentar
		call	LCD_REG
		movlw	Mensaje_Error_2a	;TEMP AMBIENTE BAJA ESPERE...
		call	Mensaje
		movlw	0xc0
		call	LCD_REG
		movlw	Mensaje_Error_2b
		call	Mensaje
		goto	Salto_2.2

		
		movf	T_pedidaH,W		;T_pisH - T_pedidaH
		subwf	T_pisH,W
		btfss	STATUS,Z		;Si el resultado es distinto de cero(Z=0) son distintos, sino comprobamos las partes bajas
		goto	distintos
		movf	T_pedida,W		;T_pis - T_pedida
		subwf	T_pis,W
		btfss	STATUS,Z		;Si el resultado es distinto de cero(Z=0) son distintos, sino iguales
		goto	distintos
		goto	Salto_2.2		;si son iguales no es necesario aun activar la bomba, realiza la conversion y, de ser pobible, salta al comienzo de la secuencia

distintos						;si llega hasta aqui es porque la tª de la piscina es inferior a la pedida, por lo tanto activa la bomba

		call	Encender_Bomba

		movlw	0xC0			;Segunda linea LCD
		call	LCD_REG
		movlw	Mensaje_Bact
		call	Mensaje	

Salto_2.3
		call	Retardo_Transm_Temp
		call	ConversorADAmb
		call	ConversorADPis

		movf	T_ambH,W
		movwf	ah
		movf	T_amb,W			;Me pregunto si T_amb>T_pedida
		movwf	al
		movf	T_pedidaH,W
		movwf	bh
		movf	T_pedida,W
		movwf	bl
		call	Comparacion

		btfss	c,0
		goto	Salto_2.4	;si, entences puede calentar
		
		movlw	b'00000001'		;No puede calentar
		call	LCD_REG
		movlw	Mensaje_Error_2a	;TEMP AMBIENTE BAJA ESPERE...
		call	Mensaje
		movlw	0xc0
		call	LCD_REG
		movlw	Mensaje_Error_2b
		call	Mensaje
		call	Retardo_1seg
		goto	Salto_2.3
		

Salto_2.4
		movlw	b'00000001'
		call	LCD_REG
		movlw	Mensaje_2.3		;Tfija
		call	Mensaje
		movf	decena,W
		addlw	0x30			;ajuste de nuevo a codigo ASCII
		call	LCD_DATO	
		movf	unidad,W
		addlw	0x30			;ajuste de nuevo a codigo ASCII
		call	LCD_DATO		
		movlw	Mensaje_1.4b	;Imprimo: Tp:XX,X la temperatura de la piscina
		call	Mensaje
		movf	decena_pis,W
		addlw	0x30
		call	LCD_DATO
		movf	unidad_pis,W
		addlw	0x30
		call	LCD_DATO
		movlw	0x2c			; es una coma,
		call	LCD_DATO
		movf	decimal_pis,W
		addlw	0x30
		call	LCD_DATO

		movlw	0xC0			;pasa a la segunde linea del LCD
		call	LCD_REG
		movlw	Mensaje_Bact
		call	Mensaje	

		goto	Reinicio_2.3










	
Calibracion

		call	ConversorADAmb
		call	ConversorADPis
Calib_1
		movlw	Mensaje_1.4a		;Imprimo: Ta:XX,X la temperatura ambiente
		call	Mensaje
		movf	decena_amb,W
		addlw	0x30
		call	LCD_DATO
		movf	unidad_amb,W
		addlw	0x30
		call	LCD_DATO
		movlw	0x2c				;es una coma,
		call	LCD_DATO
		movf	decimal_amb,W
		addlw	0x30
		call	LCD_DATO
		
		movlw	0xc0
		call	LCD_REG

		movlw	Mensaje_1.4b		;Imprimo: Tp:XX,X la temperatura de la piscina
		call	Mensaje
		movf	decena_pis,W
		addlw	0x30
		call	LCD_DATO
		movf	unidad_pis,W
		addlw	0x30
		call	LCD_DATO
		movlw	0x2c				; es una coma,
		call	LCD_DATO
		movf	decimal_pis,W
		addlw	0x30
		call	LCD_DATO

	
		movlw	0xC0
		call	LCD_REG
		movlw	Mensaje_Calibracion
		call	Mensaje				;Pulse A: Refresh

Exploracion_del_teclado_7
		call	Key_Scan
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z
		goto	Exploracion_del_teclado_7	;Bucle hasta que se pulse alguna

		movf	Tecla,W
		sublw	b'00001010'
		btfsc	STATUS,Z
		goto	Calibracion			;es la A

		movf	Tecla,W
		sublw	b'00001100'
		btfsc	STATUS,Z
		goto	Inicio				;es la C
	
		goto	Calib_1




	end