;Listado del programa.

;*********************************************************
; Programa que controla la humedad que tiene una planta y activa el 
; sistema de riego cuando detecta que este es inferior a lo recomendado.
;*********************************************************

; ZONA DE DATOS***************************************************

LIST		P=16F84A			; Procesador utilizado.
INCLUDE	<P16F84A.INC>		; Definición de algunos operandos utilizados.

__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
	
RADIX 	DEC					; Define el rango decimal para las expresiones 
							; de los datos.
CBLOCK 0x0C
	EstadoHumedad
	ASCII_Centenas
	ASCII_Decenas
	ASCII_Unidades
	Hexadecimal
ENDC

; ZONA DE CÓDIGOS*************************************************

	ORG	0

Inicio								; Inicializar variables
	clrf	RXmsb					
	clrf	RXlsb
	call 	Sht11Inicializa			; Inicializamos el SHT11
	call 	Sht118bitPrecission		; Configuramos para precisión de 8 bits	
	call	LCD_Inicializa			; Inicializamos el LCD				
	bsf		STATUS, RP0				; Configuración delLED de alarma	
	bcf		LED_PORT, LED_ALARMA		
	bcf		STATUS, RP0	
	bcf		LED_PORT, LED_ALARMA
	clrf	EstadoHumedad			; Configuramos el nivel deHumedad

Monitorizar
	call 	Sht11GetHumedad			; Lee la humedad y la deja en HUMEDAD1 y HUMEDAD2
	movfw	HUMEDAD1				; Mover el valor leído del sensor a RXlsb
	movwf  	RXlsb					; para ajustarlo a %.
	call 	CalcRH					; El resultado se deja en RH
	call 	ActualizaEstadoHumedad	; Actualizamos el mensaje de la humedad.
	movfw	RH						; Convertir el valor de humedad acaracteres
	call 	Hex_Ascii				; ASCII para mostrarlos por el LCD.
	call 	Visualiza				; Visualiza la humedad en el LCD
	call 	Retardo_500ms
	call 	Retardo_500ms	
	goto    Monitorizar

; Subrutina "Visualiza" -----------------------------------------------------------------
Visualiza
	call	LCD_Borra				; Borra la pantalla y se sitúa en la línea 1.
	movlw	 MensajeHumedad			; Apunta a este mensaje.
	call	LCD_Mensaje				; Lo visualiza.
	movfw	 ASCII_Centenas
	call	LCD_Caracter
	movfw	 ASCII_Decenas
	call 	LCD_Caracter
	movfw	ASCII_Unidades
	call	LCD_Caracter
	call	LCD_Linea2				; Al principio de la segunda líneadel LCD.
	movf	EstadoHumedad,W			; Mueve EstadoHumedad a W.
	call	ApuntaMensaje			; Apunta al mensaje que se va avisualizar.
	call	LCD_Mensaje				; Lo visualiza.
	return


; Subrutina "Mensajes" -----------------------------------------------------------------

ApuntaMensaje
	addwf	PCL,F
	retlw	MensajeEnRango
	retlw	MensajeEstadoFueraRangoSuperior
	retlw	MensajeFueraRangoInferior

Mensajes
	addwf	PCL,F
MensajeEnRango
	DT "Estoy bien", 0x00
MensajeEstadoFueraRangoSuperior
	DT "Mucha humedad!", 0x00
MensajeFueraRangoInferior
	DT "Necesito agua", 0x00
MensajeHumedad
	DT "Humedad(%): ", 0x00

; Subrutina que actualiza el estado de la humedad------------------------------------------

ActualizaEstadoHumedad				; Actualizar Estado Humedad – Calcula el	
	movfw	RH						; número de mensaje a mostrar
	sublw	SEQUIA					; y enciende o apaga el led
	btfsc	STATUS,C				; en función del valor de la humedad.
	goto	Sequia
	movfw	RH	
	sublw	HUMEDAD
	btfss	STATUS,C
	goto 	Humedad
	movlw	0x00					; Valor del mensaje
	bcf		LED_PORT,LED_ALARMA
	movwf   EstadoHumedad
	return 

Humedad
	movlw	0x01
	movwf  	EstadoHumedad
	bsf		LED_PORT,LED_ALARMA
	return

Sequia
	movlw  	0x02
	movwf	EstadoHumedad
	bsf		LED_PORT,LED_ALARMA
	return

; ------------------------------------------
Hex_Ascii								
	movwf 	Hexadecimal				; Carga en W el dato hex.
	clrf    ASCII_Centenas       	; Para BCD D'0'
	clrf    ASCII_Decenas    		; Para BCD D'0'
	clrf    ASCII_Unidades     		; Para BCD D'0'

Centenas
	movlw  	D'100'          		; D'100' --> W
	subwf   Hexadecimal,W   		; HEXADECIMAL - D'100' --> W
	btfss	STATUS,C        		; ¿HEXADECIMAL es menor que D'100' ?
	goto   	Decenas	         		; Si
	movwf   Hexadecimal     		; Salva el resto
	incf  	ASCII_Centenas,F     	; Incrementa el contador de centenasBCD
	goto    Centenas	        	; Vuelve por otros D'100'

Decenas
	movlw   D'10'          			; D'10' --> W
	subwf   Hexadecimal,W   		; HEXADECIMAL - D'10' --> W
 	btfss	STATUS,C        		; ¿HEXADECIMAL es menor que D'10'?
	goto    Unidades        		; Si
 	movwf   Hexadecimal     		; Salva el resto
 	incf    ASCII_Decenas,F       	; Incrementa el contador de decenasBCD
 	goto    Decenas	         		; Vuelve por otros D'10'

Unidades
	movf    Hexadecimal,W   		; El resto pertenece
 	movwf   ASCII_Unidades         	; a las unidades BCD
 	clrf    Hexadecimal     		; Pone a cero el registro HEXADECIMAL
Bcd_A_Ascii
	 movlw 	H'30'           		; H'30' --> W
 	 iorwf   ASCII_Unidades,F       ; Convierte de BCD a ASCII
	 iorwf   ASCII_Decenas,F       	; Convierte de BCD a ASCII
	 movf    ASCII_Centenas,F     	; ASCII_H --> F
	 btfsc   STATUS,Z              	; ¿ASCII_H es D'00' ?
	 goto    Espacio         		; Si
	 movlw   H'30'           		; H'30' --> W
	 iorwf   ASCII_Centenas,F      	; Convierte de BCD a ASCII
	 return                  		

Espacio
  	movlw   ' '         			; A' ' --> W
 	movwf   ASCII_Centenas  		; A' ' --> ASCII_H
  	return                  		

INCLUDE  <CONTROLADOR_HUMEDAD.INC>
INCLUDE  <SHT11.INC>
INCLUDE  <AJUSTE_HUMEDAD.INC>
INCLUDE  <LCD_MENS.INC>
INCLUDE  <LCD_4BIT.INC>				
INCLUDE  <RETARDOS.INC>				
	END					; Fin del programa.principal

