

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos
                    		
Lcd_var		equ	0x0c		;Variables (2) de las rutinas de manejo del LCD
T_MIN		EQU	0X25		;TEMP MINIMA
T_MAX		EQU	0X35		;Temp maxima
DUTY_H		EQU	0X22		;Anchura de pulso
DUTY_L		EQU	0X23		;
DATOA_H		EQU	0X24		;MULTIPLICANDO 16 BITS
DATOA_L		EQU	0X25
DATOB_H		EQU	0X26		;MULTIPLICANDO 16 BITS
DATOB_L		EQU	0X27
DATOD_H		EQU	0X28
DATOD_L		EQU	0X29		;RESULTADO 32 BITS
DATOC_H		EQU	0X2A
DATOC_L		EQU	0X2B
CONTADOR	EQU	0X2C
BCD_2		EQU	0X2D		;VARIABLES BCD
BCD_1		EQU	0X2E
BCD_0		EQU	0X2F
TEMPORAL	EQU	0X30
DELAY		EQU	0X31		;VARIABLE DE TEMPORIZACION

		org	0x00		;Vector de Reset
		goto	INICIO
		org	0x05		;Salva vector de interrupción

		include	"LCD_Cxx.inc"	;Incluye las rutinas de manejo del LCD

MUL16X16	MOVLW	.16		;INICIALIZACION DEL CONTADOR
		MOVWF	CONTADOR
		CLRF	DATOD_H		;BORRA PARTE ALTA DEL RESULTADO
		CLRF	DATOD_L
MUL_LOOP	RRF	DATOB_H,F
		RRF	DATOB_L,F
		BTFSS	STATUS,C
		GOTO	NO_SUMA
		MOVF	DATOA_L,W
		ADDWF	DATOD_L,F
		BTFSC	STATUS,C
		INCF	DATOD_H,F
		MOVF	DATOA_H,W
		ADDWF	DATOD_H,F
NO_SUMA		RRF	DATOD_H,F
		RRF	DATOD_L,F
		RRF	DATOC_H,F
		RRF	DATOC_L,F
		DECFSZ	CONTADOR,F
		GOTO	MUL_LOOP
		RETURN

;Rutina de conversion de un numero binario de 16 bits a 5 digitos bcd para sacar por lcd

BITS16_BCD	BCF	STATUS,C
		CLRF	CONTADOR
		BSF	CONTADOR,4
		CLRF	BCD_0
		CLRF	BCD_1
		CLRF	BCD_2
LOOP_16		RLF	DATOC_L,F
		RLF	DATOC_H,F
		RLF	BCD_2,F
		RLF	BCD_1,F
		RLF	BCD_0,F
		DECFSZ	CONTADOR,F
		GOTO	AJUSTE
		RETURN
AJUSTE		MOVLW	BCD_2
		MOVWF	FSR
		CALL	AJUSTE_BCD
		MOVLW	BCD_1
		MOVWF	FSR
		;INCF	FSR,F
		CALL	AJUSTE_BCD
		MOVLW	BCD_0
		MOVWF	FSR
		;INCF	FSR,F
		CALL	AJUSTE_BCD
		GOTO	LOOP_16
;AJUSTE_BCD	MOVF	INDF,W
		ADDLW	0X03
		MOVWF	TEMPORAL
		BTFSC	TEMPORAL,3
		MOVWF	INDF
		MOVF	INDF,W
		ADDLW	0X30
		MOVWF	TEMPORAL
		BTFSC	TEMPORAL,7
		MOVWF	INDF
		RETURN

AJUSTE_BCD	MOVLW	3
		ADDWF	0,W
		MOVWF	TEMPORAL
		BTFSC	TEMPORAL,3
		MOVWF	0
		MOVLW	30
		ADDWF	0,W
		MOVWF	TEMPORAL
		BTFSC	TEMPORAL,7
		MOVWF	0
		RETLW	0
	
;COMIENZO DEL PROGRAMA PRINCIPAL
INICIO		CLRF	PORTB		;LIMPIA SALIDAS
		CLRF	PORTA
		CLRF	PORTC
		BSF	STATUS,RP0	;CAMBIA AL BANCO 1
		BCF	STATUS,RP1
		MOVLW	B'00000110'	;PORTA, PORTB, PORTC SON DIGITALES, JUSTIFICACION IZQUIERDA, Vref=5V, -Vref=0V
		MOVWF	ADCON1		;    	    
		CLRF	TRISB		;PORTA PORTB Y PORTC SON SALIDAS
		CLRF	TRISA
		CLRF	TRISC
		MOVLW	B'11000111'	;CONFIGURACION DEL TMRO
		MOVWF	OPTION_REG	;CON PREDIVISOR 256
		BCF	STATUS,RP0	;CAMBIO A BANCO 0
		CALL	UP_LCD		;CONFIGURACION DE LINEAS PARA LCD
		CALL	LCD_INI		;INICIALIZACION LCD
		MOVLW	B'00001111'	;LCD ON CURSOR Y BLINK... VER ORIGINALMENTE B'00001100'
		CALL	LCD_REG		;OFF


		
BUCLE		BSF	STATUS,RP0	;BANCO 1	
		BCF	STATUS,RP1
		MOVLW	B'00101000'	;RA3 Y RA5 ENTRADAS
		MOVWF	TRISA
		movlw	B'10000010'	;JUSTIFICACION DERECHA  ......MOVLW	B'100000001'	ERAN ESTOS*******	;
		MOVWF	ADCON1		;RA3 Y RA5 ENTRADAS ANALOGICAS
		BCF	STATUS,RP0	; BANCO 0
		movlw	B'01100001'     ;CONFIGURACION Y ACTIVACION CONVERSOR  ...MOVLW	B'10100001'	ERAN ESTOS**************
		MOVWF	ADCON0
		

		movlw	B'00001111'     ; TMR0 prescaler, 1:256
		movwf	OPTION_REG	; preescaler asignado al wdg
		bcf	STATUS, RP0	; BANK0 00
Main		btfss	INTCON, T0IF	; Wait for Timer0 to timeout
		goto	Main            ; <bit 2> espera interrupcion
		bcf	INTCON,T0IF     ; pone en cero el bit2 de interrupcion
	                       		 ; <1> timer interrumpido 
                                	; <0> timer no interrumpido
		bsf	ADCON0,GO	; Start A/D conversion 
	                        	; Pone el bit Go en <1>
ADC_WAIT	BTFSS	PIR1,ADIF	;TERMINO?
		GOTO	ADC_WAIT	;NO, ESPERAR
		
;Se pasa el valor binario obtenido a un valor en grados que pasa a BCD

		BSF	STATUS,RP0	;BANCO 1		
		BCF	STATUS,RP1				
		MOVF	ADRESL,W
		BCF	STATUS,RP0	;BANCO 0
		MOVWF	DATOB_L
		MOVF	ADRESH,W
		MOVWF	DATOB_H
		MOVLW	.243		;243
		MOVWF	DATOA_L
		CLRF	DATOA_H
		CALL	MUL16X16
		CALL	BITS16_BCD
		
;Visualiza el resultado en la pantalla LCD

		BSF	STATUS,RP0		;BANCO 1
		BCF	STATUS,RP1		;
		MOVLW	B'00000110'		;
		MOVWF	ADCON1			;
		BCF	STATUS,RP0		;
		CALL	UP_LCD
		MOVLW	0X80
		CALL	LCD_REG
		MOVLW	'T'
		CALL	LCD_DATO
		MOVLW	'e'
		CALL	LCD_DATO
		MOVLW	'm'
		CALL	LCD_DATO
		MOVLW	'p'
		CALL	LCD_DATO
		MOVLW	':'
		CALL	LCD_DATO
		MOVLW	' '
		CALL	LCD_DATO
		MOVLW	' '
		CALL	LCD_DATO
		MOVLW	' '
		CALL	LCD_DATO
		MOVF	BCD_0,W
		ANDLW	0X0F
		IORLW	0X30
		CALL	LCD_DATO
		SWAPF	BCD_1,W
		ANDLW	0X0F
		IORLW	0X30
		CALL	LCD_DATO
		MOVLW	'.'
		CALL	LCD_DATO
		MOVF	BCD_2,W
		ANDLW	0X0F
		IORLW	0X30
		CALL	LCD_DATO
		MOVLW	' '
		CALL	LCD_DATO
		MOVLW	0XDF
		CALL	LCD_DATO
		MOVLW	'C'
		CALL	LCD_DATO
		MOVLW	0XC0
		CALL	LCD_REG
		MOVLW	'E'
		CALL	LCD_DATO
		MOVLW	'L'
		CALL	LCD_DATO
		MOVLW	'E'
		CALL	LCD_DATO
		MOVLW	'C'
		CALL	LCD_DATO
		MOVLW	'T'
		CALL	LCD_DATO
		MOVLW	'R'
		CALL	LCD_DATO
		MOVLW	'O'
		CALL	LCD_DATO
		MOVLW	'M'
		CALL	LCD_DATO
		MOVLW	'E'
		CALL	LCD_DATO
		MOVLW	'D'
		CALL	LCD_DATO
		MOVLW	'I'
		CALL	LCD_DATO
		MOVLW	'C'
		CALL	LCD_DATO
		MOVLW	'I'
		CALL	LCD_DATO
		MOVLW	'N'
		CALL	LCD_DATO
		MOVLW	'A'
		CALL	LCD_DATO
		MOVLW	0C
		CALL	LCD_REG
;Se junta en un solo byte la temperatura para hacer comparaciones

		SWAPf	BCD_0,W
		ANDLW	0XF0
		MOVWF	TEMPORAL
		SWAPF	BCD_1,W
		ANDLW	0X0F
		IORWF	TEMPORAL,F
;Se compara la temp con los max y min p'activar motor y rele

		MOVLW	T_MAX
		SUBWF	TEMPORAL,W
		BTFSC	STATUS,C	;MAYOR QUE LA MAXIMA?
		GOTO	SUP_MAX		;SI
		BCF	PORTC,2		;NO, DESCONECTAR MOTOR (VENTILADOR)
		MOVLW	T_MIN
		SUBWF	TEMPORAL,W
		BTFSS	STATUS,C	;INFERIOR QUE LA MINIMA?
		GOTO	INF_MIN		;SI
		BCF	PORTC,0		;NO. DESCONECTAR RELE (CALEFACTOR)
		GOTO	BUCLE
SUP_MAX		BSF	PORTC,2		;ENCENDER MOTOR (VENTLADOR)
		GOTO	BUCLE
INF_MIN		BSF	PORTC,0		;ACTIVAR RELE (CALEFACTOR)
		GOTO	BUCLE
		
		end			;Fin del programa fuente

