LIST P=16F84
	INCLUDE <P16F84A.INC>

	CBLOCK	0x0C
	ENDC

#DEFINE LogingitudNumero1	(Numero1-FinNumero1)
#DEFINE LogingitudNumero2	(Numero2-FinNumero2)
#DEFINE LogingitudNumero3	(Numero3-FinNumero3)
#DEFINE Salida1			PORTA,1		
#DEFINE Salida2			PORTA,3
#DEFINE	Salida3			PORTA,4

ZONA*********************************************************************

	ORG	0
	GOTO	INICIO
	ORG	4
	GOTO	INTER

Mensajes
	ADDWF	PCL,F
Mensaje0
	DT "Teclee Numero",0x00
Mensaje1
	DT "Numero Correcto",0x00

Mensaje2
	DT "Activao Salida1",0x00

Mensaje3
	DT "Activao salida2",0x00

Mensaje4
	DT "Activao salida3",0x00

Mensaje5
	DT "Numero Incorrecto",0x00




LeeNumeros
	ADDWF PCL,F
Numero1
	DT 2h,3h
FinNumero1

Numero2
	DT 5h,6h
FinNumero2

Numero3
	DT 8h,9h
FinNumero3

FinNumeros

INICIO		CALL	LCD_Inicializa
		bsf	STATUS,RP0
		bcf	PORTA,1			;Define como salida
		bcf	PORTA,3
		bcf	PORTA,4
		bcf	STATUS,RP0
		CALL	Teclado_Inicializa	;Configura Teclado
		CALL	InicializaTodo		;Inicializa los registros
		movlw	b'10001000'		;Habilita la Interrupcion RBI 
		movwf	INTCON

bucle
		sleep
		goto 	bucle



;Subrutina Inter*********************************************************

	CBLOCK
	CONT1
	CONT2
	CONT3
	GuardoTecla
	ENDC

INTER	CALL	Teclado_LeeHex
	movwf	INDF			;Almacena el digito en la Ram
	incf	FSR,f			;Apunta hacia la siguiente direccion de ñla Ram
	incf	CONT1,f
	movlw	LongitudNumero1
	subwf	CONT1,W

	incf	FSR,f
	incf	CONT2,f
	movlw	LongitudNumero2
	subwf	CONT2,W

	incf	FSR,f
	incf	CONT3,f
	movlw	LongitudNumero3
	subwf	CONT3,W

	btfss	STATUS,C
	GOTO	INTER1


	CALL	LCD_Borra
	clrf	CONT1
	clrf	CONT2
	clrf	CONT3
	movlw	Tecla
	movwf	FSR


ComparaNumero1
		movf	INDF,W		;Lee el numero y lo guarda en la ram
		movwf	Tecla
		movwf	CONT1,w		;Apunta ala Rom
		call	Numero1
		subwf	GuardoTecla,w
		btfss 	STATUS,Z
		goto 	NumeroIncorrecto
		incf	FSR,f
		incf	CONT1,f
		movlw	LongitudNumero1
		subwf	CONT1,f
		btfss 	STATUS,C
		goto	ComparaNumero1
		movlw	Mensaje1
		CALL	LCD_Mensaje
		CALL	LCD_Linea2
		movlw	Mensaje2
		CALL	LCD_Mensaje
		bsf	Salida1
		goto 	Retardos

ComparaNumero2	movf	INDF,W		;Lee el numero y lo guarda en la ram
		movwf	Tecla
		movwf	CONT2,w		;Apunta ala Rom
		call	Numero2
		subwf	GuardoTecla,w
		btfss 	STATUS,Z
		goto 	NumeroIncorrecto
		incf	FSR,f
		incf	CONT1,f
		movlw	LongitudNumero2
		subwf	CONT1,f
		btfss 	STATUS,C
		goto	ComparaNumero2
		movlw	Mensaje1
		CALL	LCD_Mensaje
		CALL	LCD_Linea2
		movlw	Mensaje3
		CALL	LCD_Mensaje
		bsf	salida2
		goto 	Retardos

ComparaNumero3	movf	INDF,W		;Lee el numero y lo guarda en la ram
		movwf	Tecla
		movwf	CONT3,w		;Apunta ala Rom
		call	Numero3
		subwf	GuardoTecla,w
		btfss 	STATUS,Z
		goto 	NumeroIncorrecto
		incf	FSR,f
		incf	CONT1,f
		movlw	LongitudNumero3
		subwf	CONT1,f
		btfss 	STATUS,C
		goto	ComparaNumero3
		movlw	Mensaje1
		CALL	LCD_Mensaje
		CALL	LCD_Linea2
		movlw	Mensaje4
		CALL	LCD_Mensaje
		bsf	Salida3
		goto 	Retardos
		
		

NumeroIncorrecto	movlw	Mensaje5
			CALL	LCD_Mensaje
			
Retardo
		call	Retardo_4s
		call	Retardo_2s


InicializaTodo
		bcf	PORTA,1			;Desactiva las salidas
		bcf	PORTA,3
		bcf	PORTA,4
		crlf	CONT1			;Inicializa Contadores
		crlf	CONT2
		crlf	CONT3
		movlw	Tecla
		movwf	FSR
		CALL	LCD_Borra
		movlw	Mensaje0
		CALL	LCD_Mensaje
		
INTER1		CALL	Teclado_EsperaDejePulsar
		bcf	INTCON,RBIF
		retfie


;Subrutina "Teclado Inicializa"****************************************************

Teclado Inicializa
	BSF	STATUS,RP0
	MOVLW	B'11110000'
	MOVWF   PORTB
	BCF	OPTION_REG,NOT_RPBU
	BCF	STATUS,RP0
	CALL	Teclado_EsperaDejePulsar



;*********************Subrutina Teclado_EsperaDejePulsar***************************************

Teclado_Comprobacion	EQU	b'11110000'

Teclado_EsperaDejePulsar
	movlw	Teclado_comprobacion
	movwf	PORTB



;*******************Subrutina "Teclado_LeeHex"***********************************************

Teclado_LeeHex
		CALL	teclado_LeeOrdenTecla
		BTFSS	STATUS,C
		GOTO 	Tecl_FinLeeHex
		CALL	teclado_ConvierteOrdenEnHex
		BSF	STATUS,C


;********************Subrrutina Teclado Lee Orden Tecla***************************************

Teclado_LeeOrdenTecla

	clrf Tecl_TeclaOrden
	movlw	b'11111110'


Tecl_FinLeeHex
		RETURN

Teclado_ConvierteOrdenEnHex
		ADDWF	PCL,F
		DT	1h,2h,3h,0Fh
		DT	4h,5h,6h,0Eh
		DT	7h,8h,9h,0Dh
		DT	0Ah,0h,0Bh,0Ch



	INCLUDE <TECLADO.INC>
	INCLUDE <LCD_4BIT.INC>
	INCLUDE <LCD_MENS.INC>
	INCLUDE <RETARDOS.INC>


	CBLOCK
	Num_Tecleado
	ENDC

END



