	#INCLUDE	<P16F877A.INC>
	__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
	;============ DEFINIENDO LOS REGISTROS AUXILIARES ============
	CONT2	EQU	0X21
	CONTA	EQU	0X22
	UNIDAD	EQU	0X23
	DECENA	EQU	0X24
	CENTENA	EQU	0X25
	MILES	EQU	0X28
	AVISA	EQU	0X26
	IMP		EQU	0X27
	ORG	0X00
	;============== CONFIGURANDO ENTRADAS/SALIDAS ================
	BSF STATUS,RP0
	MOVLW	0X00
	MOVWF	TRISB
	MOVLW	0X01
	MOVWF	TRISC
	MOVLW	0X00
	MOVWF	TRISD
	;==================== CONFIGURANDO EL TMR0====================
	MOVLW	0X00
	MOVWF	OPTION_REG
	BCF	STATUS,RP0
	;============= CONFIGURANDO EL TIMER1/CONTADOR ===============
	MOVLW	0X03
	MOVWF	T1CON
	;============== CONFIGURACION INICIAL DEL LCD ================
	CALL 	TIME2		;ESTABILIZA V EN 15 ms
	MOVLW	0X38		;TRABAJA EN MODO DE 8 BITS
	CALL	LCDI
	MOVLW	0X06		;TRABAJA EN MODO DE 2 LINEAS
	CALL 	LCDI
	MOVLW	0X0C		;ENCENDIDO DE LA PANTALLA
	CALL	LCDI
	MOVLW	0X1C		;CON DESPLAZAMIENTO DEL CURSOR
	CALL	LCDI
	;======================== PROGRAMA ===========================
	MOVLW	0X00
	MOVWF	PORTC
	MOVWF	CONTA
	MOVWF	UNIDAD
	MOVWF	DECENA
	MOVWF	CENTENA
	MOVWF	MILES
	MOVWF	AVISA
	CALL	IMP_PRODUCTO
	CALL	IMP_NUMEROS
BGI	BTFSS	PORTC,0
	GOTO	BGI
	INCF	CONTA
	CALL	TEST_UNI
	CALL	IMP_NUMEROS
FB	BTFSC	PORTC,0
	GOTO	FB
	GOTO	BGI
	;=================== SUBRUTINA LCDI(INSTRUCCION) ============
LCDI	BCF	PORTD,6		;RS(4) ---->INSTRUCCION
		BSF	PORTD,7		;E(5)  ---->ACTIVO
		MOVWF	PORTB
		BCF	PORTD,7		;E(5)  ---->INACTIVO
		CALL	TIME1	;60 us
		RETURN
	;================= SUBRUTINA LCDC(ESCRITURA) ================
LCDC	BSF	PORTD,6		;RS(4) ----->ESCRITURA
		BSF	PORTD,7		;RS(5) ----->ACTIVO
		MOVWF	PORTB
		BCF	PORTD,7		;E(5)  ---->INACTIVO
		CALL	TIME1	;60 us
		RETURN
	;==================== TIME1 60 us =========================
TIME1	MOVLW	0XE2
		MOVWF	TMR0
RETARDO	BTFSS	INTCON,2
		GOTO	RETARDO
		BCF		INTCON,2
		RETURN
	;======================== TIME2 16 ms ======================
TIME2	MOVLW	0X00
		MOVWF	TMR0
RET1	BTFSS	INTCON,2
		GOTO	RET1
		BCF		INTCON,2
		INCF	CONT2
		MOVLW	0X20
		XORWF	CONT2,0
		BTFSS	STATUS,2
		GOTO	TIME2
		CLRF	CONT2
		RETURN
	;===================== DESPLEGA PRODUCTO ===================
IMP_PRODUCTO	MOVLW	0X00
	CALL	LCDI
	MOVLW	" "
	CALL	LCDC
	MOVLW	"P"
	CALL	LCDC
	MOVLW	"R"
	CALL 	LCDC
	MOVLW	"O"
	CALL 	LCDC
	MOVLW	"D"
	CALL 	LCDC
	MOVLW	"U"
	CALL	LCDC
	MOVLW	"C"
	CALL	LCDC
	MOVLW	"T"
	CALL	LCDC
	MOVLW	"O"
	CALL	LCDC
	RETURN
	;==================== IMPRIME NUMEROS ======================
IMP_NUMEROS	MOVF	MILES,0
	MOVWF	IMP
	MOVLW	0X30
	ADDWF	IMP,1
	MOVLW	0XC3
	CALL	LCDI
	MOVF	IMP,0
	CALL	LCDC

	MOVF	MILES,0
	MOVWF	IMP
	MOVLW	0X30
	ADDWF	IMP,1
	MOVLW	0XC3
	CALL	LCDI
	MOVF	IMP,0
	CALL	LCDC	

	MOVF	CENTENA,0
	MOVWF	IMP
	MOVLW	0X30
	ADDWF	IMP,1
	MOVLW	0XC4
	CALL	LCDI
	MOVF	IMP,0
	CALL	LCDC

	MOVF	DECENA,0
	MOVWF	IMP
	MOVLW	0X30
	ADDWF	IMP,1
	MOVLW	0XC5
	CALL	LCDI
	MOVF	IMP,0
	CALL	LCDC
	
	MOVF	UNIDAD,0
	MOVWF	IMP
	MOVLW	0X30
	ADDWF	IMP,1
	MOVLW	0XC6
	CALL	LCDI
	MOVF	IMP,0
	CALL	LCDC
	BCF		STATUS,2
	RETURN
	;============ TESTEA UNIDAD PARA AUMENTAR DECENA=============
TEST_UNI	MOVF	CONTA,0
	BCF		STATUS,2
	XORLW	0X0A
	BTFSC	STATUS,2
	CALL	INC_DEC
	BTFSC	AVISA,0
	CALL	LIMPIA
	BTFSS	AVISA,3
	INCF	UNIDAD
	BCF		AVISA,3
	BCF		STATUS,2
	RETURN
	;================== INCREMENTA DECENA=======================
INC_DEC	MOVF	DECENA,0
	BCF		STATUS,2
	XORLW	0X09
	BTFSC	STATUS,2
	CALL	INC_CEN
	BTFSC	AVISA,1
	CALL	LIMPIA
	BTFSS	AVISA,3
	INCF	DECENA
	MOVLW	0X00
	MOVWF	UNIDAD
	BSF		AVISA,0
	RETURN
	;=================== LIMPIA BANDERA AVISA ==================
LIMPIA	MOVLW	0X00
	MOVWF	CONTA
	BCF		AVISA,0
	BCF		AVISA,1
	BCF		AVISA,2
	BSF		AVISA,3
	RETURN
	;================== INCREMENTA CENTENAS ====================
INC_CEN	MOVF	CENTENA,0
	BCF		STATUS,2
	XORLW	0X09
	BTFSC	STATUS,2
	CALL	INC_MIL
	BTFSC	AVISA,2
	CALL	LIMPIA
	BTFSS	AVISA,3
	INCF	CENTENA
	MOVLW	0X00
	MOVWF	DECENA
	BSF		AVISA,1
	RETURN
	;=============== INCREMENTA UNIDADES DE MILLARES =============
INC_MIL	INCF	MILES
	MOVF	MILES,0
	BCF		STATUS,2
	XORLW	0X0A
	BTFSC	STATUS,2
	CLRF	MILES
	MOVLW	0X00
	MOVWF	CENTENA
	BSF		AVISA,2
	RETURN
	;=================== FIN DEL PROGRAMA ======================

	END