List p=16f887
	#include <p16f887.inc>
	__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOREN_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _FOSC_INTRC_NOCLKOUT
__CONFIG    _CONFIG2, _WRT_OFF;
   cblock 0x80
    vardel1 
    vardel2 
    endc
RES_VECT  CODE    0x0000  
;===============================================================================
;Definicion de las macros para cambiar de bancos
BANK0	MACRO
	BCF STATUS,5
	BCF STATUS,6
	ENDM
BANK1	MACRO
	BSF STATUS,5
	BCF STATUS,6
	ENDM
BANK2	MACRO
	BCF STATUS,5
	BSF STATUS,6
	ENDM
BANK3	MACRO
	BSF STATUS,5
	BSF STATUS,6
	ENDM
;===============================================================================
RESULTH	 EQU 0x20
RESULTL	 EQU 0x21
CONTN	 EQU 0x22
RESOL	 EQU 0x48
RESOL2	 EQU 0x25
MULT	 EQU 0x23
CARRY	 EQU 0x24
CONT	 EQU 0x25
CantRest EQU 0x26  
CantRest2 EQU 0x29
COMPARADOR EQU 0x27 
AJUSTE60 EQU 0x28
CIEN	EQU 0x30
MIL	EQU 0x31
TABLA	EQU 0x33
;VARIABLES PARA LA PANTALLA=====================================================
N	EQU 0x34
M	EQU 0x35
VARP	EQU 0x36
Mx	EQU 0x37
Nx	EQU 0x38

 
	ORG 0x00
	GOTO INICIO
	
;This code block configures the ADC
;for polling, Vdd and Vss as reference, Frc 
;	clock and AN0 input.
;
;Conversion start & polling for completion
; are included.
;


SampleTime
	MOVLW H'7'
	MOVWF CONTN
	DECFSZ CONTN,F
	GOTO $-1
	RETURN

ENTRADAS
	ADDWF	PCL,F
	RETLW	B'11000001' 
	RETLW	B'11000101' 
	RETLW	B'11001001'
	RETLW	B'11001101' 
	RETLW	B'11010001'
	RETURN
INICIO
	MOVLW H'5'
	SUBWF TABLA,W
	BTFSS STATUS,Z
	GOTO CONTINUE3
	CLRF TABLA
CONTINUE3
	BANK0
	CLRF RESULTH 
	CLRF CARRY
	CLRF RESULTL
	CLRF CantRest
	CLRF CantRest2
	CLRF CIEN
	CLRF MIL
	
	CLRF TABLA
	CLRF PORTB
	CLRF PORTE
	BANK1
	CLRF TRISD ;Salida
	CLRF TRISC ;Salida
	MOVLW B'11111111'
	MOVWF TRISB
	MOVWF TRISA
;================CONFIGURACION DEL CONVERSOR A/D================================
 
	CONVERSION
	MOVLW B'10000000'
	MOVWF ADCON1 ;Justificacion a la derecha  ADRESL
	BANK3
	MOVLW B'11111111'
	MOVWF ANSEL ;Bit0 Analogico
	CLRF ANSELH
	BANK0
	MOVF TABLA,W
	CALL ENTRADAS
	MOVWF ADCON0
	CALL SampleTime 
	BSF ADCON0,GO ;Conversion en progreso
	BTFSC ADCON0,GO
	GOTO $-1
	BANK0
	MOVF ADRESH,W 
	MOVWF RESULTH
	MOVWF PORTD
	BANK1
	MOVF ADRESL,W
	BANK0
	MOVWF RESULTL
	MOVWF PORTC
	;BLOQUE DE MULTIPLICACION POR 30H
	MOVLW .47
	MOVWF MULT
	MOVF RESULTL,W
	MOVWF RESOL
	MOVF RESULTH,W
	MOVWF RESOL2
	MOVF RESOL,W
	ADDWF RESULTL,F
	MOVF RESULTL,W
	BTFSC STATUS,C
	INCF RESULTH
	MOVF RESOL2,W
	ADDWF RESULTH,F
	MOVF RESULTH,W
	DECFSZ MULT
	GOTO $-9
FIN_M	;FIN DEL BLOQUE DE MULTIPLICACION
	MOVF RESULTL,W
	MOVF RESULTH,W
	MOVLW H'A'
	MOVWF COMPARADOR
	MOVLW H'A0'
	MOVWF AJUSTE60
	
	;RESTO 1
RESTA	

	MOVLW H'1'
	SUBWF RESULTL,F
	BTFSS STATUS,C
	SUBWF RESULTH,F
	MOVF RESULTH,W
	MOVF RESULTL,W
	MOVLW .0
	SUBWF RESULTH,W
	BTFSS STATUS,Z
	GOTO CONTINUE
	MOVLW .0
	SUBWF RESULTL,W
	BTFSS STATUS,Z
	GOTO CONTINUE
	GOTO FIN
CONTINUE
	
	INCF CantRest
	MOVF CantRest,w	
	GOTO AJUSTE

AJUSTE
	MOVF COMPARADOR,W
	SUBWF CantRest,W
	BTFSS STATUS,Z
	GOTO RESTA
	MOVLW H'6'
	ADDWF CantRest,F
	MOVF CantRest,w
	MOVLW H'F'
	ADDWF COMPARADOR,F
	INCF COMPARADOR,F
	MOVLW H'A0'
	SUBWF CantRest,W
	BTFSS STATUS,Z
	GOTO RESTA
	MOVLW H'60'
	ADDWF CantRest,F
	MOVF CantRest,W
	INCF CIEN
	MOVLW H'A'
	SUBWF CIEN,W
	BTFSS STATUS,Z
	GOTO CONTINUE2
	INCF MIL
	CLRF CIEN
	MOVLW H'A'
	SUBWF MIL,W
	BTFSS STATUS,Z
	GOTO CONTINUE2
	CLRF MIL
CONTINUE2
	MOVF CIEN,W
	MOVF MIL,W
	GOTO FIN_M
	
FIN
	
	
	MOVF MIL,W
	MOVF CIEN,W
	MOVF CantRest,w
	MOVLW H'30'
	
	ADDWF MIL,F
	ADDWF CIEN,F
	ADDWF CantRest,F
	
	
	MOVF MIL,W
	MOVF CIEN,W
	MOVF CantRest,W
	CLRF ADCON0
	
	

;===============PROGRAMACION DE LA PANTALLA=====================================
	LCD_INICIAR
	CALL LCD_IN
	CALL I
	CALL NEXT
	CALL I2
	BSF STATUS,RP0
	BTFSS PORTB,1
	GOTO $-1
	INCF TABLA
	GOTO INICIO

;TEXTO 1
I
	MOVLW 'T'
	MOVWF PORTD
	CALL MANDAR
	MOVLW 'E'
	MOVWF PORTD
	CALL MANDAR
	MOVLW 'M'
	MOVWF PORTD
	CALL MANDAR
	MOVLW 'P'
	MOVWF PORTD
	CALL MANDAR
	MOVLW ' '
	MOVWF PORTD
	CALL MANDAR
	MOVLW 'C'
	MOVWF PORTD
	CALL MANDAR
	MOVLW '='
	MOVWF PORTD
	CALL MANDAR
       RETURN
; TEXTO 2

I2
	MOVF MIL,W
	MOVWF PORTD
	CALL MANDAR
	MOVF CIEN,W
	MOVWF PORTD
	CALL MANDAR
	CALL PAUSA
	RETURN

;=====LCD
LCD_IN
	BCF PORTC,0 ;RS = 0
	MOVLW 0x01 ;lIMPIAR PANTALLA
	MOVWF PORTD
	CALL EJECUTA
	MOVLW 0x0C ;1ERA LINEA
	MOVWF PORTD
	CALL EJECUTA
	MOVLW 0x3C ;CONF CURSOR
	MOVWF PORTD
	CALL EJECUTA
	BSF PORTC,0 ; RS = 1
	MOVLW ' '
	MOVWF PORTD
	CALL MANDAR
	CALL MANDAR
	CALL MANDAR
	
	RETURN
	
EJECUTA
	BSF PORTC,1 ; ENABLE = 1
	CALL DELAY ; TIEMPO DE ESPERA
	CALL DELAY
	BCF PORTC,1 ;ENABLE = 0
	CALL DELAY
	RETURN

MANDAR
	BSF PORTC,0 ; RS = 1 MODO DATO
	CALL EJECUTA
	RETURN

NEXT
	BCF PORTC,0 ; RS = 0 MODO INST
	MOVLW 0x0C ;2DA LINEA
	MOVWF PORTD
	CALL EJECUTA
	RETURN
	
DELAY
	MOVLW D'48'
	MOVWF M
DOS
	MOVLW D'255'
	MOVWF N
UNO
	DECFSZ N,1
	GOTO UNO
	DECFSZ M,1
	GOTO DOS
	RETURN
	
PAUSA
	MOVLW D'5'
	MOVWF VARP
TRESx
	MOVLW D'8'
	MOVWF Mx
DOSx
	MOVLW D'250'
	MOVWF Nx
UNOx
	NOP
	NOP
	DECFSZ Nx,1
	GOTO UNOx
	DECFSZ M,1
	GOTO DOSx
	DECFSZ VARP,1
	GOTO TRESx
	RETURN
	
	
            cicloext 
	    decfsz vardel1,1
	    goto ciclo1int
	    goto findelay
	    
	    ciclo1int 
		movlw 0x19
		movwf vardel2
		goto ciclo1
	
	
	ciclo1 nop
	       nop
	       nop
	       nop
	       nop
	       nop
	       nop
	       nop
	       nop
	       nop
	       nop
	       nop
	       nop
	       nop
	    decfsz vardel2,1
	    goto ciclo1
	    goto cicloext
	findelay return    
	
    GOTO $  
	

	END
	
	
	
	
	
	
	
