;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			Programa para la placa del Volt-Amperímetro
;			Cristal de 20 MHz
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	LIST		P = 16F628A
	INCLUDE		<P16F628A.INC>
	ERRORLEVEL	-302

	__CONFIG	_HS_OSC&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_BODEN_ON&_LVP_OFF&DATA_CP_OFF&_CP_OFF

;----------------------------------------------------------------------------------------------------

#DEFINE			PULSADOR_1		PORTA,0			; Activo en BAJO
#DEFINE			PULSADOR_2		PORTA,1			; Activo en BAJO
#DEFINE			ALERTA			PORTA,2			;
#DEFINE			SCL				PORTA,3			; I2C
#DEFINE			SDA				PORTA,4			; I2C

#DEFINE			LCD_D7			PORTB,0			;Configuración de pines a usar con el LCD
#DEFINE			LCD_D6			PORTB,1
#DEFINE			LCD_D5			PORTB,2
#DEFINE			LCD_D4			PORTB,3
#DEFINE			LCD_RS			PORTB,4
#DEFINE			LCD_RW			PORTB,5
#DEFINE			LCD_E			PORTB,6
;#DEFINE						PORTB,7			; ICSP

#DEFINE			SIGNO			FLAG,0

	cblock	.32
		DIR_ESCLAVO			; RAM para el INA
		REGISTRO
		INA_H
		INA_L
		TEMPORAL
		CONTADOR_1
		CONTADOR_INA
;---------------------------
		LCD_TEMP_1			; RAM para el display
		LCD_CONTA_1
		LCD_CONTA_2
;---------------------------
		DIG1				; más significativo
		DIG2
		DIG3
		DIG4
		DIG5
		DIG6
		DIG7
		DIG8				; menos significativo
		CARRY
		DATO1
		DATO2
		DATO3
		FUNC1
		FUNC2
		FUNC3
		RES1				; más significativo
		RES2
		RES3				; menos significativo
		MULTIPLICANDO1
		MULTIPLICANDO2		; aca se coloca el multiplicando
		MULTIPLICANDO3		; aca se coloca el multiplicando
		MULTIPLICADOR1		; aca se coloca el multiplicador
		CONTADOR
		TEMP1
		TEMP2
		FLAG
;---------------------------
		TENSION_H
		TENSION_L
		CORRIENTE_H
		CORRIENTE_L
		POTENCIA_H
		POTENCIA_L
		CORRIENTE_PICO_H
		CORRIENTE_PICO_L
	endc



;..................................................................................................
;							Definición de las macros

START		MACRO
			SALIDA
			bcf		SCL
			ENDM

STOP		MACRO
			nop
			nop
			nop
			nop
			nop
			nop
			bsf		SCL
			nop
			bsf		SDA
			ENTRADA
			ENDM

PULSO		MACRO
			bsf		SCL
			nop
			nop
			nop
			bcf		SCL
			ENDM

READ		MACRO
			bsf		SDA
			PULSO
			bcf		SDA
			nop
			nop
			nop
			ENDM

WRITE		MACRO
			bcf		SDA
			PULSO
			nop
			nop
			nop
			nop
			ENDM

ENTRADA 	MACRO
			bsf		STATUS,RP0
			bsf		SDA
			bcf		STATUS,RP0
			ENDM

SALIDA		MACRO
			bcf		SDA
			bsf		STATUS,RP0
			bcf		SDA
			bcf		STATUS,RP0
			ENDM

ACK_LEER	MACRO
			ENTRADA
			PULSO
			SALIDA
			ENDM

ACK_DAR		MACRO
			bcf		SDA
			PULSO
			ENDM

ACK_NO		MACRO
			bsf		SDA
			PULSO
			bcf		SDA
			ENDM

;----------------------------------------------------------------------------------------------------
	ORG		.0
	bcf		STATUS,RP0
	bcf		STATUS,RP1
	goto	INICIO
	
	ORG		.4
	bcf		INTCON,GIE
	retfie

;----------------------------------------------------------------------------------------------------
INICIO
	clrwdt
	movlw	.7
	movwf	CMCON
	clrf	PORTA
	clrf	PORTB

	bsf		STATUS,RP0			; Configuro los reguistros necesarios
	clrf	VRCON
	movlw	B'11110111'
	movwf	TRISA
	movlw	B'10000000'
	movwf	TRISB
	movlw	B'10101111'
	movwf	OPTION_REG
	bcf		STATUS,RP0
	clrf	INTCON				; Borro todas las interrupciones

	bsf		SCL
	bsf		SDA
	call	LCD_INICIALIZAR

	clrf	TENSION_H
	clrf	TENSION_L
	clrf	CORRIENTE_H
	clrf	CORRIENTE_L
	clrf	POTENCIA_H
	clrf	POTENCIA_L
	clrf	CORRIENTE_PICO_H
	clrf	CORRIENTE_PICO_L

	movlw	.27
	movwf	TEMP1
ERT
	call	RUTINA_15ms
	decfsz	TEMP1,F
	goto	ERT

	movlw	B'01000000'		; Configuración del INA "DIRECCIÖN 05H"
	movwf	DIR_ESCLAVO
	movlw	H'00'			; Dirección del registro de Configuración
	movwf	REGISTRO
	movlw	H'44'			; Valor de configuración H'0A00' = 2560
	movwf	INA_H
	movlw	H'1F'
	movwf	INA_L
	call	ESCRIBIR_WORD_INA

	movlw	B'01000000'		; Calibración del INA "DIRECCIÖN 05H"
	movwf	DIR_ESCLAVO
	movlw	H'05'			; Dirección del registro de Calibración
	movwf	REGISTRO
	movlw	H'09'			; Valor de configuración H'0A00' = 2560
	movwf	INA_H
	movlw	H'90'
	movwf	INA_L
	call	ESCRIBIR_WORD_INA

	movlw	B'01000000'		; Configuración del mask/enable del INA "DIRECCIÖN 06H"
	movwf	DIR_ESCLAVO
	movlw	H'06'			; Dirección del registro mask/enable
	movwf	REGISTRO
	movlw	H'00'			; Valor de configuración H'0001' = 1
	movwf	INA_H
	movlw	H'00'
	movwf	INA_L
	call	ESCRIBIR_WORD_INA

	movlw	B'01000000'		; Configuración de limites de alertas del INA "DIRECCIÖN 07H"
	movwf	DIR_ESCLAVO
	movlw	H'07'			; Dirección del registro de alertas
	movwf	REGISTRO
	movlw	H'00'			; Valor de configuración H'0000' = 0
	movwf	INA_H
	movlw	H'00'
	movwf	INA_L
	call	ESCRIBIR_WORD_INA
;-----------------------------
RE_INI
	movlw	B'01000000'		; Apunto al registro de TENSIÓN
	movwf	DIR_ESCLAVO
	movlw	H'02'
	movwf	REGISTRO
	call	APUNTAR_REGUISTRO_INA
	movlw	B'01000000'		; Leo el registro de TENSIÓN
	movwf	DIR_ESCLAVO
	clrf	INA_H
	clrf	INA_L
	call	LEER_WORD_INA
	movf	INA_H,W
	movwf	TENSION_H
	movf	INA_L,W
	movwf	TENSION_L

	movlw	B'01000000'		; Apunto al registro de CORRIENTE
	movwf	DIR_ESCLAVO
	movlw	H'04'
	movwf	REGISTRO
	call	APUNTAR_REGUISTRO_INA
	movlw	B'01000000'		; Leo el registro de CORRIENTE
	movwf	DIR_ESCLAVO
	clrf	INA_H
	clrf	INA_L
	call	LEER_WORD_INA
	movf	INA_H,W
	movwf	CORRIENTE_H
	movf	INA_L,W
	movwf	CORRIENTE_L

	movlw	B'01000000'		; Apunto al registro de POTENCIA
	movwf	DIR_ESCLAVO
	movlw	H'03'
	movwf	REGISTRO
	call	APUNTAR_REGUISTRO_INA
	movlw	B'01000000'		; Leo el registro de POTENCIA
	movwf	DIR_ESCLAVO
	clrf	INA_H
	clrf	INA_L
	call	LEER_WORD_INA
	movf	INA_H,W
	movwf	POTENCIA_H
	movf	INA_L,W
	movwf	POTENCIA_L

;Presento TENSION
	movf	TENSION_H,W			; Multiplico por 125
	movwf	MULTIPLICANDO2
	movf	TENSION_L,W
	movwf	MULTIPLICANDO3
	movlw	.125
	movwf	MULTIPLICADOR1
	call	MULTIPLICA
	call	BCD

	movlw	H'80'
	call	LCD_INST
	movlw	A' '
	call	LCD_DATO
	movf	DIG2,F				; Compruebo si es cero
	btfss	STATUS,Z
	goto	TE_1
	movlw	A' '
	call	LCD_DATO
	goto	TE_2
TE_1
	movlw	.48
	addwf	DIG2,W
	call	LCD_DATO
TE_2
	movlw	.48
	addwf	DIG3,W
	call	LCD_DATO
	movlw	A'.'
	call	LCD_DATO
	movlw	.48
	addwf	DIG4,W
	call	LCD_DATO
	movlw	.48
	addwf	DIG5,W
	call	LCD_DATO
	movlw	.48
	addwf	DIG6,W
	call	LCD_DATO
	movlw	A'V'
	call	LCD_DATO

;Presento CORRIENTE
	clrf	DATO1				; Corección del pequeño error
	movf	CORRIENTE_H,W
	movwf	DATO2
	movf	CORRIENTE_L,W
	movwf	DATO3
	clrf	FUNC1
	clrf	FUNC2
	movlw	.5
	movwf	FUNC3
	call	SUMA
	movf	RES2,W
	movwf	CORRIENTE_H
	movf	RES3,W
	movwf	CORRIENTE_L

	movf	CORRIENTE_H,F
	btfss	STATUS,Z
	goto	CONT_0
	movf	CORRIENTE_L,F
	btfsc	STATUS,Z
	goto	CONT_1
CONT_0
	btfss	CORRIENTE_H,7
	goto	CONT_1
	comf	CORRIENTE_H,F
	comf	CORRIENTE_L,F
	bsf		SIGNO
	goto	CONT_2
CONT_1
	bcf		SIGNO
CONT_2

	clrf	RES1
	movf	CORRIENTE_H,W
	movwf	RES2
	movf	CORRIENTE_L,W
	movwf	RES3
	call	BCD

	movf	DIG4,F				; Compruebo si es cero
	btfss	STATUS,Z
	goto	CO_1
	btfss	SIGNO
	goto	CO_0
	movlw	A' '
	call	LCD_DATO
	movlw	A'-'
	call	LCD_DATO
	goto	CO_2
CO_0
	movlw	A' '
	call	LCD_DATO
	movlw	A' '
	call	LCD_DATO
	goto	CO_2
CO_1
	btfss	SIGNO
	goto	CO_3
	movlw	A'-'
	call	LCD_DATO
	movlw	.48
	addwf	DIG4,W
	call	LCD_DATO
	goto	CO_2
CO_3
	movlw	A' '
	call	LCD_DATO
	movlw	.48
	addwf	DIG4,W
	call	LCD_DATO
CO_2
	movlw	.48
	addwf	DIG5,W
	call	LCD_DATO
	movlw	A'.'
	call	LCD_DATO
	movlw	.48
	addwf	DIG6,W
	call	LCD_DATO
	movlw	.48
	addwf	DIG7,W
	call	LCD_DATO
	movlw	.48
	addwf	DIG8,W
	call	LCD_DATO
	movlw	A'A'
	call	LCD_DATO

;Presento POTENCIA
	movf	POTENCIA_H,W			; Multiplico por 25
	movwf	MULTIPLICANDO2
	movf	POTENCIA_L,W
	movwf	MULTIPLICANDO3
	movlw	.25
	movwf	MULTIPLICADOR1
	call	MULTIPLICA
	call	BCD

	movlw	H'C0'
	call	LCD_INST
	movf	DIG3,F				; Compruebo si es cero
	btfss	STATUS,Z
	goto	PO_1
	movlw	A' '
	call	LCD_DATO
	goto	PO_2
PO_1
	movlw	.48
	addwf	DIG3,W
	call	LCD_DATO
	movlw	.48
	addwf	DIG4,W
	call	LCD_DATO
	goto	PO_4
PO_2
	movf	DIG4,F				; Compruebo si es cero
	btfss	STATUS,Z
	goto	PO_3
	movlw	A' '
	call	LCD_DATO
	goto	PO_4
PO_3
	movlw	.48
	addwf	DIG4,W
	call	LCD_DATO
PO_4
	movlw	.48
	addwf	DIG5,W
	call	LCD_DATO
	movlw	A'.'
	call	LCD_DATO
	movlw	.48
	addwf	DIG6,W
	call	LCD_DATO
	movlw	.48
	addwf	DIG7,W
	call	LCD_DATO
	movlw	.48
	addwf	DIG8,W
	call	LCD_DATO
	movlw	A'W'
	call	LCD_DATO

;Presento CORRINETE PICO
	clrf	DATO1				; Corección del pequeño error
	movf	CORRIENTE_PICO_H,W
	movwf	DATO2
	movf	CORRIENTE_PICO_L,W
	movwf	DATO3
	clrf	FUNC1
	clrf	FUNC2
	movlw	.5
	movwf	FUNC3
	call	SUMA
	clrf	RES1
	call	BCD

	movlw	A' '
	call	LCD_DATO
	movf	DIG4,F				; Compruebo si es cero
	btfss	STATUS,Z
	goto	PI_1
	movlw	A' '
	call	LCD_DATO
	goto	PI_2
PI_1
	movlw	.48
	addwf	DIG4,W
	call	LCD_DATO
PI_2
	movlw	.48
	addwf	DIG5,W
	call	LCD_DATO
	movlw	A'.'
	call	LCD_DATO
	movlw	.48
	addwf	DIG6,W
	call	LCD_DATO
	movlw	.48
	addwf	DIG7,W
	call	LCD_DATO
	movlw	.48
	addwf	DIG8,W
	call	LCD_DATO
	movlw	A'A'
	call	LCD_DATO

	movlw	B'01000000'		; Apunto al registro de CORRIENTE
	movwf	DIR_ESCLAVO
	movlw	H'04'
	movwf	REGISTRO
	call	APUNTAR_REGUISTRO_INA

	movlw	.30				; 10ms por unidad seteada
	movwf	TEMP1
ERT1
	movlw	.115
	movwf	TEMP2
ERT2
	movlw	B'01000000'		; Leo el registro de CORRIENTE
	movwf	DIR_ESCLAVO
	clrf	INA_H
	clrf	INA_L
	call	LEER_WORD_INA

	btfsc	INA_H,7
	goto	CON_W

	movf	CORRIENTE_PICO_H,W
	movwf	DATO2
	movf	CORRIENTE_PICO_L,W
	movwf	DATO3
	movf	INA_H,W
	movwf	FUNC2
	movf	INA_L,W
	movwf	FUNC3
	call	RESTA_16
	btfsc	STATUS,C
	goto	CON_W
	movf	INA_H,W
	movwf	CORRIENTE_PICO_H
	movf	INA_L,W
	movwf	CORRIENTE_PICO_L
CON_W
	btfsc	PULSADOR_2
	goto	CON_Q
	clrf	CORRIENTE_PICO_H
	clrf	CORRIENTE_PICO_L
CON_Q
	decfsz	TEMP2,F
	goto	ERT2
	decfsz	TEMP1,F
	goto	ERT1

	goto	RE_INI



;----------------------------------------------------------------------------------------------------
APUNTAR_REGUISTRO_INA
	START					; Pulso de start
	call	ESCLAVO			; START, y dirección del esclavo
	WRITE					; Instrucción de escritura
	ACK_LEER				; Leo el ACK
	movf	REGISTRO,W		; Escribo la dirección del reguistro
	call	ESCRIBIR_DATO
	ACK_LEER				; Leo el ACK
	STOP					; Pulso de stop
	return

;............................
ESCRIBIR_WORD_INA			; Write Word Format
	START					; Pulso de start
	call	ESCLAVO			; START, y dirección del esclavo
	WRITE					; Instrucción de escritura
	ACK_LEER				; Leo el ACK
	movf	REGISTRO,W		; Escribo la dirección del reguistro
	call	ESCRIBIR_DATO
	ACK_LEER				; Leo el ACK
	movf	INA_H,W		; Escribo el primer BYTE (MSB)
	call	ESCRIBIR_DATO
	ACK_LEER				; Leo el ACK
	movf	INA_L,W		; Escribo el segundo BYTE (LSB)
	call	ESCRIBIR_DATO
	ACK_LEER				; Leo el ACK
	STOP					; Pulso de stop
	return

;............................
LEER_WORD_INA				; Read Word Format
	START					; Pulso de start
	call	ESCLAVO			; START, y dirección del esclavo
	READ					; Instrucción de lectura
	ACK_LEER				; Leo el ACK
	call	LEER_DATO		; Leo el primer BYTE "MSB"
	movwf	INA_H			;
	ACK_DAR					; Genero el ACK
	call	LEER_DATO		; Leo el segundo BYTE "LSB"
	movwf	INA_L			;
	ACK_NO					; Genero el NO_ACK
	STOP					; Pulso de stop
	return

;...................................................................................................
ESCLAVO						; INA
	movlw	.7
	movwf	CONTADOR_INA
ESC_2
	btfss	DIR_ESCLAVO,6
	bcf		SDA
	btfsc	DIR_ESCLAVO,6
	bsf		SDA
	PULSO
	rlf		DIR_ESCLAVO,F
	decfsz	CONTADOR_INA,F
	goto	ESC_2
	nop
	return

;...................................................................................................
ESCRIBIR_DATO				; INA
	movwf	TEMPORAL
	movlw	.8
	movwf	CONTADOR_INA
ESC_1
	btfss	TEMPORAL,7
	bcf		SDA
	btfsc	TEMPORAL,7
	bsf		SDA
	PULSO
	rlf		TEMPORAL,F
	decfsz	CONTADOR_INA,F
	goto	ESC_1
	return

;...................................................................................................
LEER_DATO					; INA
	ENTRADA
	clrf	TEMPORAL
	movlw	.8
	movwf	CONTADOR_INA
LEE_1
	rlf		TEMPORAL,F
	nop
	nop
	nop
	bsf		SCL
	bcf		TEMPORAL,0
	btfsc	SDA
	bsf		TEMPORAL,0
	bcf		SCL
	decfsz	CONTADOR_INA,F
	goto	LEE_1
	movf	TEMPORAL,W
	SALIDA
	return

;----------------------------------------------------------------------------------------------------
MULTIPLICA						;16 X 8
	clrf	RES1
	clrf	RES2
	clrf	RES3
	clrf	MULTIPLICANDO1

  	movlw	.8
	movwf	CONTADOR
MUL1
	btfsc	MULTIPLICADOR1,0
	call	MUL2

	bcf		STATUS,C
	rlf		MULTIPLICANDO3,F
	rlf		MULTIPLICANDO2,F
	rlf		MULTIPLICANDO1,F
	bcf		STATUS,C
	rrf		MULTIPLICADOR1,F

	decfsz	CONTADOR,F
	goto	MUL1
	return
MUL2
	movf	RES1,W
	movwf	DATO1
	movf	RES2,W
	movwf	DATO2
	movf	RES3,W
	movwf	DATO3
	movf	MULTIPLICANDO1,W
	movwf	FUNC1
	movf	MULTIPLICANDO2,W
	movwf	FUNC2
	movf	MULTIPLICANDO3,W
	movwf	FUNC3

	call	SUMA
	return

;----------------------------------------------------------------------------------------------------
SUMA				;24 + 24
	clrf	CARRY

	movf	DATO3,W
	addwf	FUNC3,W
	movwf	RES3
	btfsc	STATUS,C
	incfsz	DATO2,F
	goto	BNM1
	incfsz	DATO1,F
	goto	BNM1
	bsf		CARRY,0
BNM1
	movf	DATO2,W
	addwf	FUNC2,W
	movwf	RES2
	btfsc	STATUS,C
	incfsz	DATO1,F
	goto	BNM2
	bsf		CARRY,0
BNM2
	movf	DATO1,W
	addwf	FUNC1,W
	movwf	RES1
	btfsc	STATUS,C
	bsf		CARRY,0

	bcf		STATUS,C
	btfsc	CARRY,0
	bsf		STATUS,C	
	return

;----------------------------------------------------------------------------------------------------
RESTA				;24 - 24
	clrf	CARRY

	comf	DATO3,W
	addwf	FUNC3,W
	movwf	RES3
	btfsc	STATUS,C
	incfsz	FUNC2,F
	goto	IOP1
	incfsz	FUNC1,F
	goto	IOP1
	bsf		CARRY,0
IOP1
	comf	DATO2,W
	addwf	FUNC2,W
	movwf	RES2
	btfsc	STATUS,C
	incfsz	FUNC1,F
	goto	IOP2
	bsf		CARRY,0
IOP2
	comf	DATO1,W
	addwf	FUNC1,W
	movwf	RES1
	btfsc	STATUS,C
	bsf		CARRY,0

	bcf		STATUS,C
	btfss	CARRY,0
	bsf		STATUS,C	
	comf	RES3,F
	comf	RES2,F
	comf	RES1,F
	return

;-----------------------
RESTA_16				;16 - 16
	clrf	CARRY

	comf	DATO3,W
	addwf	FUNC3,W
	movwf	RES3
	btfsc	STATUS,C
	incfsz	FUNC2,F
	goto	IOP10
	bsf		CARRY,0
IOP10
	comf	DATO2,W
	addwf	FUNC2,W
	movwf	RES2
	btfsc	STATUS,C
	bsf		CARRY,0

	bcf		STATUS,C
	btfss	CARRY,0
	bsf		STATUS,C	
	comf	RES3,F
	comf	RES2,F
	return

;----------------------------------------------------------------------------------------------------
BCD						; 24 a 8
	clrf	DIG1
	clrf	DIG2
	clrf	DIG3				; LOS DATOS DE ENTRADA SE DEBEN COLOCAR EN
	clrf	DIG4				; LAS POSICIONES RES1, RES2 Y RES3
	clrf	DIG5				; Y SALDRAN EN CODIGO BCD POR DIG1, DIG2,
	clrf	DIG6				; DIG3, DIG4, DIG5, DIG6, DIG7 Y DIG8
	clrf	DIG7
	clrf	DIG8
FGH1
	call	CARGA_10M
	call	CAR_MAYOR
	incf	DIG1,F
	call	RESTA
	btfsc	STATUS,C
	goto	FGH1
	decf	DIG1,F
	call	CARGA_10M
	call	CAR_MAYOR
	call	SUMA
FGH2
	call	CARGA_1M
	call	CAR_MAYOR
	incf	DIG2,F
	call	RESTA
	btfsc	STATUS,C
	goto	FGH2
	decf	DIG2,F
	call	CARGA_1M
	call	CAR_MAYOR
	call	SUMA
FGH3
	call	CARGA_100K
	call	CAR_MAYOR
	incf	DIG3,F
	call	RESTA
	btfsc	STATUS,C
	goto	FGH3
	decf	DIG3,F
	call	CARGA_100K
	call	CAR_MAYOR
	call	SUMA
FGH4
	call	CARGA_10K
	call	CAR_MAYOR
	incf	DIG4,F
	call	RESTA
	btfsc	STATUS,C
	goto	FGH4
	decf	DIG4,F
	call	CARGA_10K
	call	CAR_MAYOR
	call	SUMA
FGH5
	call	CARGA_1K
	call	CAR_MAYOR
	incf	DIG5,F
	call	RESTA
	btfsc	STATUS,C
	goto	FGH5
	decf	DIG5,F
	call	CARGA_1K
	call	CAR_MAYOR
	call	SUMA
FGH6
	call	CARGA_100
	call	CAR_MAYOR
	incf	DIG6,F
	call	RESTA
	btfsc	STATUS,C
	goto	FGH6
	decf	DIG6,F
	call	CARGA_100
	call	CAR_MAYOR
	call	SUMA
FGH7
	call	CARGA_10
	call	CAR_MAYOR
	incf	DIG7,F
	call	RESTA
	btfsc	STATUS,C
	goto	FGH7
	decf	DIG7,F
	call	CARGA_10
	call	CAR_MAYOR
	call	SUMA

	movf	RES3,W
	movwf	DIG8
	return

CAR_MAYOR
	movf	RES1,W
	movwf	DATO1
	movf	RES2,W
	movwf	DATO2
	movf	RES3,W
	movwf	DATO3
	return
CARGA_10M
	movlw	H'98'
	movwf	FUNC1
	movlw	H'96'
	movwf	FUNC2
	movlw	H'80'
	movwf	FUNC3
	return
CARGA_1M
	movlw	H'0F'
	movwf	FUNC1
	movlw	H'42'
	movwf	FUNC2
	movlw	H'40'
	movwf	FUNC3
	return
CARGA_100K
	movlw	H'01'
	movwf	FUNC1
	movlw	H'86'
	movwf	FUNC2
	movlw	H'A0'
	movwf	FUNC3
	return
CARGA_10K
	movlw	H'00'
	movwf	FUNC1
	movlw	H'27'
	movwf	FUNC2
	movlw	H'10'
	movwf	FUNC3
	return
CARGA_1K
	movlw	H'00'
	movwf	FUNC1
	movlw	H'03'
	movwf	FUNC2
	movlw	H'E8'
	movwf	FUNC3
	return
CARGA_100
	movlw	H'00'
	movwf	FUNC1
	movlw	H'00'
	movwf	FUNC2
	movlw	H'64'
	movwf	FUNC3
	return
CARGA_10
	movlw	H'00'
	movwf	FUNC1
	movlw	H'00'
	movwf	FUNC2
	movlw	H'0A'
	movwf	FUNC3
	return

;----------------------------------------------------------------------------------------------------
LCD_INICIALIZAR
	bcf		LCD_E
	bcf		LCD_RS
	call	RUTINA_15ms			;demora para que el display se resetee correctamente
	movlw	B'00110010'			;Setea 4 BITS
	call	LCD_IN
	movlw	B'00101000'			;Setea 2 lineas, matris de 5x7
	call	LCD_IN
	movlw	B'00000110'			;Activa el display, desactiva el cursor y desactiva el destello del cursor
	call	LCD_INST
	movlw	B'00001100'
	call	LCD_INST
	movlw	B'00000001'			;BORRA DISPLAY
	call	LCD_INST
	return

;.....................
LCD_IN
	movwf	LCD_TEMP_1
	call	SACAR
	bsf		LCD_E
	call	RUTINA_1ms
	call	RUTINA_1ms
	call	RUTINA_1ms
	call	RUTINA_1ms
	bcf		LCD_E
	swapf	LCD_TEMP_1,F
	call	SACAR
	bsf		LCD_E
	call	RUTINA_1ms
	call	RUTINA_1ms
	call	RUTINA_1ms
	call	RUTINA_1ms
	bcf		LCD_E
	return

;.....................
LCD_INST
	movwf	LCD_TEMP_1
	call	SACAR
	bsf		LCD_E
	call	RUTINA_1ms
	call	RUTINA_1ms
	bcf		LCD_E
	swapf	LCD_TEMP_1,F
	call	SACAR
	bsf		LCD_E
	call	RUTINA_1ms
	call	RUTINA_1ms
	bcf		LCD_E
	return

;.....................
LCD_DATO
	movwf	LCD_TEMP_1
	call	SACAR
	bsf		LCD_RS
	bsf		LCD_E
	movlw	.133
	movwf	LCD_CONTA_1
	decfsz	LCD_CONTA_1,F
	goto	$-1
	bcf		LCD_E
	bcf		LCD_RS
	swapf	LCD_TEMP_1,F
	call	SACAR
	bsf		LCD_RS
	bsf		LCD_E
	movlw	.133
	movwf	LCD_CONTA_1
	decfsz	LCD_CONTA_1,F
	goto	$-1
	bcf		LCD_E
	bcf		LCD_RS
	return

;.....................
SACAR
	bcf		LCD_D4
	btfsc	LCD_TEMP_1,4
	bsf		LCD_D4
	bcf		LCD_D5
	btfsc	LCD_TEMP_1,5
	bsf		LCD_D5
	bcf		LCD_D6
	btfsc	LCD_TEMP_1,6
	bsf		LCD_D6
	bcf		LCD_D7
	btfsc	LCD_TEMP_1,7
	bsf		LCD_D7
	return

;----------------------------------------------------------------------------------------------------
RUTINA_15ms						;RUTINA DE DEMORA DE 15ms
	movlw	.75
	movwf	LCD_CONTA_2
	goto	QWE1
RUTINA_1ms						;RUTINA DE DEMORA DE 1ms
	movlw	.5
	movwf	LCD_CONTA_2
QWE1
	movlw	.249
	movwf	LCD_CONTA_1
QWE2
	nop
	decfsz	LCD_CONTA_1,F
	goto	QWE2
	decfsz	LCD_CONTA_2,F
	goto	QWE1
	return

;----------------------------------------------------------------------------------------------------
	ORG		.2047
	goto	INICIO

;----------------------------------------------------------------------------------------------------
	ORG		0x2100

	Data	.0			;0x20	;			20
	Data	.0			;0x21	;			20
	Data	.6			;0x22	;			20

;----------------------------------------------------------------------------------------------------

	END