TMR0	equ	0x01		;Timer 0 RTC
PCL	equ	0x02		;Parte baja del contador de programa
ESTADO	equ	0x03		;Direccion del registro de estado del micro
PORTA	equ	0x05		;Direccion del puerto A
PORTB	equ	0x06		;Direccion del puerto B
TIEMPO1	equ	0x0C		;Usados para temporizar
TIEMPO2	equ	0x0D
UNI	equ	0x0E		;Conteo de unidades
DEC	equ	0x0F		;Conteo de decenas
CEN	equ	0x10		;Conteo de centenas
VECES	equ	0x11		;Conteo de veces que entra a un ciclo controlado

#define	CARRY	ESTADO, 0	;Bit de acarreo
#define	CERO	ESTADO, 2	;Bit indicador de resultado cero
#define	RP0	ESTADO, 5	;Bit bajo de selección de página de memoria
#define	DUNI	PORTA, 0	;Control del display de unidades
#define	DDEC	PORTA, 1	;Control del display de decenas
#define	DCEN	PORTA, 2	;Control del display de centenas

	bsf	DUNI		;Se aegura de arrancar con todo apagado
	bsf	DDEC
	bsf	DCEN
	clrf	PORTB

	bsf	RP0		;Configuracion de pines de E/S
	movlw	b'00010000'
	movwf	PORTA
	clrf	PORTB
	bcf	RP0

CICLO	movf	TMR0, 0		;Lee el valor presente en el RTC
	call	DECIMAL		;Lo divide en unidades, decenas y centenas
	clrf	TMR0		;Arranca el conteo de ciclos nuevamente
	movlw	d'111'		;Muestra el display 111 veces (Cada entrada al display insume 9mSeg)
	movwf	VECES
	call	DISPLAY
	decfsz	VECES, 1
	goto	$ -2
	call	MILISEG		;Demora 1 milisegundo extra imperceptible al display 	
	goto	CICLO

DECIMAL	movwf	UNI		;Convierte el dato presente en W en UNI, DEC y CEN
	clrf	DEC
	clrf	CEN
	movlw	d'100'		;Determina la cant. de centenas
	subwf	UNI, 1
	btfss	CARRY
	goto	$ +3
	incf	CEN, 1
	goto	$ -4
	addwf	UNI, 1
	movlw	d'10'		;Determina la cant. de decenas
	subwf	UNI, 1
	btfss	CARRY
	goto	$ +3
	incf	DEC, 1
	goto	$ -4
	addwf	UNI, 1		;Uni queda con la cant. de unidades (sin decenas ni centenas)

	movf	CEN, 0		;Si centenas esta en 0 reemplaza el dato por dígito todo apagado
	btfss	CERO
	return			;Habiendo centenas no chequea mas nada, deja todo como esta
	movlw	0x0A		;Guarda en centenas el valor requerido para mostrar todo apagado
	movwf	CEN
	movf	DEC, 0		;Sólo si NO había centenas habilita el chequeo de ver si hay decenas
	btfss	CERO
	return			;Si hay decenas no hace nada, deja todo como esta
	movlw	0x0A		;Si no las hay elimina el dato
	movwf	DEC
	return

DISPLAY	movf	CEN, 0		;Si las hay muestra centenas
	call	TABLA		;Pasadita por la tabla para obtener los 0s u 1s que forman el dígito
	movwf	PORTB		;Salida al puerto B
	bcf	DCEN		;Enciende el dígito de centenas por 3mSeg
	call	DEMORA		;La demora la hace de todas formas incluso si no hay centenas
	bsf	DCEN
	movf	DEC, 0		;Vamos ahora con el muestreo de decenas
	call	TABLA		;Pasa por la tabla de conversion a 7 segmentos
	movwf	PORTB		;Lo manda al puerto B
	bcf	DDEC		;Enciende el dígito por 2mS
	call	DEMORA		;Espera 3 milisegundos
	bsf	DDEC
	movf	UNI, 0		;Las unidades se muestran haiga o no haiga
	call	TABLA		;Convierte a 0 y 1 de dígito
	movwf	PORTB		;Derechito al puerto B
	bcf	DUNI		;Enciende por 3MS
	call	DEMORA
	bsf	DUNI
	return

MILISEG	movlw	d'1'		;De mora de 1 milisegundos para compensar tiempos
	goto	$ +2
DEMORA	movlw	d'3'		;Demora de 3 milisegundos
	movwf	TIEMPO2
	movlw	d'110'
	movwf	TIEMPO1
	goto	$ +1
	nop
	clrwdt
	goto	$ +1
	decfsz	TIEMPO1, 1
	goto	$ -5
	decfsz	TIEMPO2, 1
	goto	$ -9
	return

TABLA	addwf	PCL, 1		;Tabla de generación de dígitos
	retlw	b'11101110'	;0
	retlw	b'00101000'	;1
	retlw	b'10110110'	;2
	retlw	b'10111010'	;3
	retlw	b'01111000'	;4
	retlw	b'11011010'	;5
	retlw	b'11011110'	;6
	retlw	b'10101000'	;7
	retlw	b'11111110'	;8
	retlw	b'11111010'	;9
	retlw	b'00000000'	;A = Dígito completamente apagado

	org	0x2007
	data	0x3FF5

	end



