PCL	equ	0x02			;Parte baja del contador de programa, usado en la tabla de caracteres
ESTADO	equ	0x03			;Registro de estados del microcontrolador
PORTA	equ	0x05			;Puerto A de E/S
PORTB	equ	0x06			;Puerto B de E/S
PORTC	equ	0x07			;Puerto C de E/S
ADRES	equ	0x1E			;Resultado de la conversión AD
ADCON	equ	0x1F			;Control del cnvertidor AD
TIEMPO1	equ	0x20			;Usados para temporizar
TIEMPO2	equ	0x21
VECES	equ	0x23			;Conteo de veces que se ejecuta algo
UNI	equ	0x24			;Usados en la división decimal
DEC	equ	0x25
CEN	equ	0x26
VALOR1	equ	0x27			;Almacena los valores medidos en el AD
VALOR2	equ	0x28

#define	CARRY	ESTADO, 0		;Bit de acarreo
#define	CERO	ESTADO, 2		;Flag de resultado cero
#define	RP0	ESTADO, 5		;Bit bajo para selección de página de memoria
#define	ADGO	ADCON, 2		;Bit de inicio de conversión AD
#define	PUNTO	PORTB, 7		;Donde está cableado el puntito del display
#define	DIG1	PORTC, 7		;Salidas que comandan el encendido de los dígitos
#define	DIG2	PORTC, 6
#define	DIG3	PORTC, 5
#define	DIG4	PORTC, 3
#define	DIG5	PORTC, 2
#define	DIG6	PORTC, 4

	clrf	PORTA			;Arranca con todo apagado
	clrf	PORTB
	movlw	0xFF
	movwf	PORTC
	bsf	RP0
	movlw	b'00000100'		;Configura el convertidor AD
	movwf	ADCON
	movlw	b'00000011'		;Configura el sentido de los pines de E/S
	movwf	PORTA
	clrf	PORTB
	clrf	PORTC
	bcf	RP0

CICLO	movlw	D'20'			;Muestra cien veces las mismas lecturas en pantalla
	movwf	VECES
	call	MIDE_C1			;Toma la lectura del canal AD #0
	movwf	VALOR1
	call	MIDE_C2			;Toma la lectura del canal AD #1
	movwf	VALOR2
MUESTRA	movf	VALOR1, 0		;Muestra el primer voltímetro
	call	DECIMAL
	call	PINTA1
	movf	VALOR2, 0		;Muestra el segundo voltímetro
	call	DECIMAL
	call	PINTA2
	decfsz	VECES, 1		;Repite la visualización durante n veces
	goto	MUESTRA
	goto	CICLO

DECIMAL	movwf	UNI			;Mete en unidades todo el valor
	clrf	DEC			;Decenas y centenas queda en cero
	clrf	CEN
	clrwdt				;Determina cuantas centenas tiene
	movlw	d'100'
	subwf	UNI, 0
	btfss	CARRY
	goto	$ +4
    	movwf	UNI
    	incf	CEN, 1
    	goto	$ -7
	clrwdt				;Determina cuantas decenas tiene
    	movlw	d'10'
	subwf	UNI, 0
	btfss	CARRY
	goto	$ +4
	movwf	UNI
	incf	DEC, 1
	goto	$ -7
	clrwdt
	movf	CEN, 0			;Si centenas está en cero apaga el dígito
	btfss	CERO
	return
	movlw	0x0A
	movwf	CEN
	return

PINTA1	movf	CEN, 0			;Muestra las centenas del votímetro 1
	call	TABLA
	movwf	PORTB
	bcf	DIG1
	call	DEMORA
	bsf	DIG1
	movf	DEC, 0			;Muestra las decenas del voltímetro 1
	call	TABLA
	movwf	PORTB
	bsf	PUNTO
	bcf	DIG2
	call	DEMORA
	bsf	DIG2
	movf	UNI, 0			;Muestra las unidades del voltímetro 1
	call	TABLA
	movwf	PORTB
	bcf	DIG3
	call	DEMORA
	bsf	DIG3
	return

PINTA2	movf	CEN, 0			;Muestra las centenas del votímetro 2
	call	TABLA
	movwf	PORTB
	bcf	DIG4
	call	DEMORA
	bsf	DIG4
	movf	DEC, 0			;Muestra las decenas del voltímetro 2
	call	TABLA
	movwf	PORTB
	bsf	PUNTO
	bcf	DIG5
	call	DEMORA
	bsf	DIG5
	movf	UNI, 0			;Muestra las unidades del voltímetro 2
	call	TABLA
	movwf	PORTB
	bcf	DIG6
	call	DEMORA
	bsf	DIG6
	return

MIDE_C1	movlw	b'01000001'		;Selecciona el canal 0 del AD (voltímetro 1)
	goto	$ +2
MIDE_C2	movlw	b'01001001'		;Selecciona el canal 1 del AD (voltímetro 2)
    	movwf	ADCON
	call	DEMORA			;Espera para el cambio de canal seguro
	bsf     ADGO			;Inicia la conversión AD
	clrwdt
	btfsc   ADGO			;Espera que termine la conversión
	goto    $ -2
	movf    ADRES, 0		;Vuelve con el valor medido en W
	return

DEMORA	movlw	d'2'			;Demora de 2 milisegundos
	movwf	TIEMPO2
	movlw	d'110'
	movwf	TIEMPO1
	goto	$ +1
	clrwdt
	nop
	goto	$ +1
	decfsz	TIEMPO1, 1
	goto	$ -5
	decfsz	TIEMPO2, 1
	goto	$ -9
	return

TABLA	addwf	PCL, 1			;Le suma al contador de programa el contenido de W (goto forzado)
	retlw	b'00111111'		;0
	retlw	b'00100001'		;1
	retlw	b'01011101'		;2
	retlw	b'01110101'		;3
	retlw	b'01100011'		;4
    	retlw	b'01110110'		;5
    	retlw	b'01111110'		;6
	retlw	b'00100101'		;7
	retlw	b'01111111'		;8
	retlw	b'01110111'		;9
	retlw	b'00000000'		;Display apagado

	org	0x2007
	data	0x3F37			;Para RC

	end
