;Reloj con interrupciones y 4 displays con multiplexado
;-------------------------------------Zona de datos--------------------------------------
	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC	;Config

	LIST	P=16F84A	;Procesador
	INCLUDE	<P16F84A.INC>	;Fichero con las etiquetas
	
CBLOCK 0x0C			;Bloque de variables asignadas a partir de 0x0C
Segundos			;Variable de segundos
Minutos			;de minutos
Horas			;y de horas
ENDC			;aca termina el bloque de variables





;--------------------------------------Zona de codigos----------------------------------------

	ORG	0

Inicio
	movlw	0x00	;Carga 0 en W
	bsf	STATUS,RP0	;Acceso al banco 1
	bcf	OPTION_REG,T0CS	;Pone a 0, timer0 como temporizador
	bcf	STATUS,RP0	;Vuelve al banco 0
	
Reloj	call	Timer0_Un_Segundo	;Llama a la rutina "Timer0_Un_Segundo"
	call	Cambio_Segundos
	goto	Reloj
	
	
	
	
	
	
	
;-------------------------Contador de segundos----------------------------
	
Timer0_Un_Segundo
	movlw	0x00	;Carga 0 en W
	movwf	TMR0	;Carga el TMR0 con 0x00
	bcf	INTCON,T0IF	;Resetea el flag de desbordamiento del TMR0
	
Timer0_Desborde
	btfss	INTCON,T0IF	;Salta si se desborda el TMR0
	goto	Timer0_Desborde	;Repite la subrutina porque no hubo overflow
	return		;Return para volver
	
	
	
	
	
	
	
	
;------------------------Actualizador de segundos--------------------------
	
Cambio_Segundos
	incf	Segundos	;Incrementa en 1 el contador de segundos
	movlw	d'60'	;Pone d60 en W
	subwf	Segundos,W	;Resta Segundos - W y lo guarda en W
	btfsc	STATUS,Z	;Salta si Z=0, porque el segundero no llego a 60
	call	Cambio_Minutos	;Llamaa a la subrutina Cambio_minutos
	return		;Vuelve
	
	
	
	
	
	
	
	
	

;------------------------Actualizador de minutos---------------------------
	
Cambio_Minutos
	movlw	0x00	;Pone 0 en W
	movwf	Segundos	;Pone W en Segundos
	incf	Minutos	;Incrementa en 1 minutos
	movlw	d'60'	;Pone 60 en W
	subwf	Minutos,W	;Resta Minutos - W, y lo guarda en W
	btfsc	STATUS,Z	;Salta si Z=0, o sea que Minutos es menor a 60
	call	Cambio_Horas	;Llama a la subrutina de cambio de horas
	return		;Termina la subrutina y vuelve
	
	
	


;------------------------Actualizador de horas-------------------------------
	
Cambio_Horas
	movlw	0x00	;Pone 0 en W
	movwf	Minutos	;Pone W en Minutos
	incf	Horas	;Incrementa 1 hora
	movlw	d'25'	;Pone 60 en W	
	subwf	Horas,W	;Resta Horas - W y lo guarda en W
	btfss	STATUS,Z	;Salta si Z=1, o sea que Horas es 25
	return		;Termina la subrutina siendo Z=0
	movlw	0x00	;Pone 0 en W
	movwf	Horas	;Pone W en Horas
	return		;Termina la subrutina



	END		;Fin del programa