list	p=16f877
			include <P16F877.inc>
	__CONFIG  0X3F79
;RS CONECTADO A RD0   E CONECTADO A RD1  Y LOS PINES D0-D7 DE LA LCD VAN CONECTADOS AL PUERTO B

W				EQU	0X00
TMR0_OPT		EQU	0X01
INTCON			EQU	0X0B
ADCON			EQU	0X1F
PIR1			EQU	0X0C
ADRESH_L		EQU	0X1E
PC				EQU		0x02

cblock 0X20
REGA0				;lsb
REGA1
REGA2
REGA3				;msb

REGB0				;lsb
REGB1
REGB2
REGB3				;msb

REGC0				;lsb
REGC1
REGC2
REGC3				;msb

MTEMP
MCOUNT
DCOUNT

BIN_ALTO,BIN_BAJO 	;Definición posiciones del dato
BCD2, BCD1,BCD0		;Posiciones del resultado final
CONTADOR     		;Contador de desplazamientos
TEMPORAL			;Posición temporal auxiliar
DIG1,DIG2,DIG3,DIG4
SUMA_30

CONTA1					;PARTE BAJA DE INCREMENTOS EN MICROSEGUNDOS
CONTA2					;PARTE ALTA DE INCREMENTOS EN MICROSEGUNDOS	
DEL					
ASCII
DIEZ
REGISTRO
AUX
ENDC
	ORG 0X04
		goto INICIO
		ORG 16

TABLA2	ADDWF PC,1
	RETLW "0"
	RETLW "1"
	RETLW "2"
	RETLW "3"
	RETLW "4"
	RETLW "5"
	RETLW "6"
	RETLW "7"
	RETLW "8"
	RETLW "9"
	RETLW 0x00

;**************** - TABLA DE VALORES A VISUALIZAR EN LA LCD - **************
TABLA 		    ADDWF	PCL,F			
				RETLW 	" "
				RETLW 	"T"
				RETLW 	"E"
				RETLW 	"M"
				RETLW 	"P"
				RETLW 	"E"
				RETLW 	"R"
				RETLW 	"A"
				RETLW 	"T"
				RETLW 	"U"
				RETLW 	"R"
				RETLW 	"A"
				RETLW 	" "
				RETLW 	" "
				RETLW 	" "
				RETLW 	" "
				RETLW 	" "
				RETLW 	" "
				RETLW 	" "
				RETLW 	" "
				RETLW 	" "
				RETLW 	" "
				RETLW 	" "
				RETLW	" "
				RETLW 	" "
				RETLW	" "
				RETLW	" "
				RETLW 	" "
				RETLW	"C"
				RETLW	" "
				RETLW 	" "

;_______________________________________________________________________________
;-------------- CONFIGURACIÓN BÁSICA -----------
INICIO			BSF 	STATUS,RP0		;BANCO 1	
				BCF		STATUS,RP1
				MOVLW	B'00001100'		;  RA0 como entrada analoga,RA1 como entrada analoga,RA2  como Vref- y  RA3 como Vref+ 
				MOVWF	ADCON1
				MOVLW 	B'10000111'			
				MOVWF 	OPTION_REG		;PREDIVISOR 256, ASIGNADO AL TMR0
				CLRF 	TRISB
				CLRF	TRISD
				BCF		STATUS,RP0
			
;-------------- FIN CONFIGURACIÓN BÁSICA -----------
;___________________________________________________________________________
;........... - RETARDO DE 20mS DE INICIALIZACIÓN DE LA LCD - ...............
				BCF		INTCON,T0IF
				MOVLW	0XB2
				MOVWF	TMR0
SEGUIR			BTFSS	INTCON,T0IF
				GOTO	SEGUIR
;............. - FIN RETARDO DE 20mS DE INICIALIZACIÓN DE LA LCD - ...........
;_______________________________________________________________________________

;***************** - VISUALIZACIÓN  EN LA LCD - ********
CONF_WORD       MOVLW	0X38			;BUS DE 8 BITS, PRESENTACIÓN EN DOS LÍNES
				MOVWF	PORTB
				CALL	CONTROL
				CALL	CONTROL
				CALL	CONTROL
				MOVLW	0X01			;BORRA PANTALLA
				MOVWF	PORTB
				CALL	CONTROL
				MOVLW	0X0C			;PANTALLA ACTIVADA, DESACTIVADO CURSOR
				MOVWF	PORTB
				CALL	CONTROL

LINEA1		    MOVLW	0X81			;POSICIÓN 01 DE LA PRIMERA LINEA 1 DE LA LCD
				MOVWF	PORTB
				CALL 	CONTROL
                CLRF	DIEZ

LINE			INCF	DIEZ,F
				MOVF	DIEZ,W
				CALL	TABLA
				MOVWF	PORTB
				CALL 	DATO
				MOVF	DIEZ,W
				XORLW	0X0E
				BTFSS 	STATUS,Z
				GOTO	LINE

				MOVLW	0XC0			;P0SICIÓN 40 DE LA SEGUNDA LINEA DE LA LCD
				MOVWF	PORTB
				CALL 	CONTROL

LINE2			INCF	DIEZ,F		
				MOVF	DIEZ,W
				CALL	TABLA
				MOVWF	PORTB
				CALL 	DATO
				MOVF	DIEZ,W
				XORLW	0X1E
				BTFSS 	STATUS,Z
				GOTO	LINE2



		

;_________________________________________________________________
;RUTINAS PRINCIPALES DEL PROGRAMA
			
INICIAR		CALL		CONVER1
			MOVF		ADRESH_L,0
			MOVWF		BIN_BAJO
			CLRF		BIN_ALTO
			CALL		BINBCD
			CALL		ACOPLE
			CALL		MOSTRAR
			GOTO		INICIAR
			

CONVER1		MOVLW		0X81 ;FOSC/32, CANAL RA0,
			MOVWF		ADCON
			CALL		ESPERA
			BCF			PIR1,6
			BSF			ADCON,2 	;	INICIO DE LA CONVERSION	
RETADC		BTFSS		PIR1,6		;PREGUNTO POR FIN DE LA CONVERSION
			GOTO		RETADC
			MOVF		ADRESH_L,W
			CALL		ESPERA
			RETURN

CONVER2		MOVLW		0X89
			MOVWF		ADCON
			CALL		ESPERA
			BCF			PIR1,6
			BSF			ADCON,2
RETADC2		BTFSS		PIR1,6
			GOTO		RETADC2
			MOVF		ADRESH_L,W
			CALL		ESPERA
			RETURN


ESPERA		CLRF		TMR0_OPT
			BCF			INTCON,2
RETARDO		CLRWDT
			BTFSS		INTCON,2
			GOTO		RETARDO
			RETURN
;_____________________________________________________________
;RUTINA USADA PARA VISUALIZAR LOS DATOS EN LA LCD
MOSTRAR		
			MOVLW	0xC7
			MOVWF	PORTB
			CALL    CONTROL
			MOVLW	0xC7
			MOVWF	PORTB
			CALL    CONTROL
			MOVF 	DIG4,0
			CALL 	TABLA2
			MOVWF	PORTB
			CALL	DATO
			MOVF 	DIG3,0
			CALL 	TABLA2
			MOVWF	PORTB
			CALL 	DATO
			MOVF 	DIG2,0
			CALL 	TABLA2
			MOVWF	PORTB
			CALL 	DATO
			MOVF 	DIG1,0
			CALL 	TABLA2
			MOVWF	PORTB
			CALL 	DATO
			CLRF	BIN_BAJO
			CLRF	BIN_ALTO
			CLRF	DIG1
			CLRF	DIG2
			CLRF	DIG3
			CLRF	DIG4
			CLRW
			RETURN
;_______________________________________________________________________________________
;*************** - CONTROL DE COMANDO Y ESCRITURA DE LA LCD - **************
CONTROL			BCF		PORTD,0
				GOTO	PULSO
DATO			BSF		PORTD,0
PULSO			BSF		PORTD,1
				CALL	RETA20MS
				BCF		PORTD,1
				CALL	RETA20MS
				RETURN

;........... - RETARDO DE 20mS - ................
RETA20MS		BCF		INTCON,T0IF
				MOVLW	0XB2
				MOVWF	TMR0
AGAIN			BTFSS	INTCON,T0IF
				GOTO	AGAIN
				RETURN
;............. - FIN RETARDO DE 20mS - ...........
;*************** - FIN CONTROL DE COMANDO Y ESCRITURA EN LA LCD - ***********
;________________________________________________________________________
;programa que convierte un numero hexa en bcd

BINBCD 		MOVLW   d'16'           ;Cargamos 16 en el contador
       		MOVWF   CONTADOR
       		CLRF    BCD2            ;Puesta a cero
       		CLRF    BCD1            ;inicial de las posiciones
       		CLRF    BCD0            ;finales

DESPLAZ 	BCF	STATUS,C 	;Ponemos a cero el carry antes de rotar
 			RLF     BIN_BAJO       	;Rotación total
        	RLF     BIN_ALTO       	;desde el byte bajo
        	RLF     BCD0           	;hasta el byte más alto
        	RLF     BCD1           	;de los datos finales
        	RLF     BCD2           	;en BCD

        	DECFSZ  CONTADOR       ;Si el contador es cero
        	GOTO    AJUSTE         ;ya van 16 desplazamientos
        	RETURN                 ;y retornamos

AJUSTE  	MOVLW   BCD0           ;Empleamos direccionamiento indirecto
        	MOVWF   FSR            ;para llamar al subprograma de ajuste
        	CALL    AJUSTEBCD          ;decimal de cada byte, primero con BCD0

        	MOVLW   BCD1           ;Lo mismo con BCD1
        	MOVWF   FSR
        	CALL    AJUSTEBCD

        	MOVLW   BCD2           ;Y lo mismo con BCD2
        	MOVWF   FSR
        	CALL    AJUSTEBCD

        	GOTO    DESPLAZ        ;Volvemos a las rotaciones

; Subprograma para ajuste BCD de cada byte
;__________________________________________________________________________________
AJUSTEBCD   MOVLW   3               
        	ADDWF   INDF,W         
        	MOVWF   TEMPORAL             
        	BTFSC   TEMPORAL,3          
       		MOVWF   INDF          

        	MOVLW   30              
        	ADDWF   INDF,W         

        	MOVWF   TEMPORAL             
        	BTFSC   TEMPORAL,7           
        	MOVWF   INDF           	
        	RETURN  

ACOPLE		MOVLW	0X30
			MOVWF	SUMA_30

			MOVF 	BCD0,W
			ANDLW 	0X0F
			MOVWF	DIG1

			MOVF 	BCD0,W
			ANDLW 	0XF0
			MOVWF	DIG2		
			SWAPF	DIG2,F
			MOVF	DIG2,W
			ADDWF	SUMA_30,W
			ANDLW 	0X0F
			MOVWF	DIG2

			MOVF 	BCD1,W
			ANDLW 	0X0F
			ADDWF	SUMA_30,W
			ANDLW	0X0F
			MOVWF	DIG3

			MOVF 	BCD1,W
			ANDLW 	0XF0
			MOVWF	DIG4		
			SWAPF	DIG4,F
			MOVF	DIG4,W
			ADDWF	SUMA_30,W
			ANDLW 	0X0F
			MOVWF	DIG4
			CLRF	BCD0
			CLRF	BCD1
			RETURN
;________________________________________________________________________________________
			END
