Está en la página 1de 5

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

LIST P=16F84A
INCLUDE <P16F84A.INC>

M_UNI equ H'1D' ; Registro para las unidades de los minutos.


M_DEC equ H'1C' ; Registro para las decenas de los minutos.

H_UNI equ H'1F' ; Registro para las unidades de las horas.


H_DEC equ H'1E' ; Registro para las decenas de las horas.

S_UNI equ H'20' ; Registro para las unidades de los segundos.


S_DEC equ H'21' ; Registro para las decenas de los segundos.

BARR equ H'1B' ; Registro para almacenar el número de barridos.


PAUSE equ H'1A' ; Registro para almacenar el tiempo de barrido.

;Algunas definiciones de registros y pines


;-----------------------------------------
#DEFINE REINICIO PORTA,0 ; Pulsador conectado a RA0.
#DEFINE MINUTO PORTA,1 ; Pulsador conectado a RA1.
#DEFINE HORA PORTA,2 ; Pulsador conectado a RA2.
#DEFINE DISPLAY PORTB ; El display está conectado al Puerto B.

ORG 0

Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf DISPLAY ; Línea del LED configurada como salida.
movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf PORTA
bcf STATUS,RP0 ; Acceso al Banco 0.
;Inicialización de Registros
;---------------------------
clrf S_UNI
clrf S_DEC
clrf M_UNI
clrf M_DEC
clrf H_UNI
clrf H_DEC
clrf BARR
;---------------------------

Principal
clrf BARR ; Limpiamos el registro de barridos
;Para el botón de reinicio no importa los rebotes
;------------------------------------------------
VerificarPulsadorReset
btfss REINICIO ; ¿Pulsador reposo?, ¿Pulsador=1?
call InicializarRegistros
;------------------------------------------------------------------------------

;Para el botón de incremento de minutos si importan los rebotes


;--------------------------------------------------------------
VerificarPulsadorMinutos
btfsc MINUTO ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto VerificarPulsadorHoras ; No vuelve a leerlo
call Temporizador ; Espera a que se estabilicen los niveles de tensión.
btfsc MINUTO ; Comprueba si es un rebote.
goto VerificarPulsadorHoras ; Era un rebote y sale.
goto SoloMinutosEnUno ; Salta a la subrutina para incrementar los minutos en 1
;------------------------------------------------------------------------------

;Para el botón de incremento de horas también importan los rebotes


;-----------------------------------------------------------------
VerificarPulsadorHoras
;------------------------------------------------------------------------------
btfsc HORA ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto SoloSegundosEnUno ; No vuelve a leerlo
call Temporizador ; Espera a que se estabilicen los niveles de tensión.
btfsc HORA ; Comprueba si es un rebote.
goto SoloSegundosEnUno ; Era un rebote y sale fuera.
call SoloHorasEnUno
;------------------------------------------------------------------------------

SoloSegundosEnUno
call IncrementarSegundosEnUno

Mostrar
call ValidarTiempo
call Barrido
;------------------------------------------------------------------------------

Fin
goto Principal
;------------------------------------------------------------------------------

SoloMinutosEnUno
call IncrementarMinutosEnUno
goto Mostrar

SoloHorasEnUno
call IncrementarHorasEnUno
goto Mostrar

;*************************************
; Subrutina de Incremento de Registros
;*************************************

;------------------------------------------------------------------------------
IncrementarSegundosEnUno
incf S_UNI,f ; Incrementa el valor de S_UNI
movfw S_UNI ; Carga W con el valor del regustro S_UNI
sublw D'10' ; Resta 10 para verificar si S_UNI=10?
btfsc STATUS, Z ; Verifica si el resultado fué cero
call IncrementarSegundosEnDiez ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

IncrementarSegundosEnDiez
clrf S_UNI ; El acarreo implica limpiar el registro anterior
incf S_DEC,f ; Incrementa el valor de S_DEC
movfw S_DEC ; Carga W con el valor del regustro S_DEC
sublw D'6' ; Resta 6 para verificar si S_UNI=6?
btfsc STATUS, Z ; Verifica si el resultado fué cero
call IncrementarMinutosEnUno ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------
IncrementarMinutosEnUno
clrf S_DEC ; El acarreo implica limpiar el registro anterior
incf M_UNI,f ; Incrementa el valor de M_UNI
movfw M_UNI ; Carga W con el valor del regustro M_UNI
sublw D'10' ; Resta 10 para verificar si S_UNI=10?
btfsc STATUS, Z ; Verifica si el resultado fué cero
call IncrementarMinutosEnDiez ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

IncrementarMinutosEnDiez
clrf M_UNI ; El acarreo implica limpiar el registro anterior
incf M_DEC,f ; Incrementa el valor de M_DEC
movfw M_DEC ; Carga W con el valor del regustro M_DEC
sublw D'6' ; Resta 6 para verificar si S_UNI=6?
btfsc STATUS, Z ; Verifica si el resultado fué cero
call IncrementarHorasEnUno ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

IncrementarHorasEnUno
clrf M_DEC ; El acarreo implica limpiar el registro anterior
incf H_UNI,f ; Incrementa el valor de H_UNI
movfw H_UNI ; Carga W con el valor del regustro H_UNI
sublw D'10' ; Resta 6 para verificar si S_UNI=10?
btfsc STATUS, Z ; Verifica si el resultado fué cero
call IncrementarHorasEnDiez ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

IncrementarHorasEnDiez
clrf H_UNI ; El acarreo implica limpiar el registro anterior
incf H_DEC,f ; Incrementa el valor de H_DEC
movfw H_DEC ; Carga W con el valor del regustro H_DEC
sublw D'10' ; Resta 6 para verificar si S_UNI=10?
btfsc STATUS, Z ; Verifica si el resultado fué cero
clrf H_DEC ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

;*********************************
; Subrutina de Barrido de Displays
;*********************************

;------------------------------------------------------------------------------

Barrido
btfss REINICIO ; ¿Pulsador reposo?, ¿Pulsador=1?
call InicializarRegistros
incf BARR, f ; Incrementa en 1 el registro de barridos
;Unidades de segundos
;--------------------
movlw b'00001111' ; Activamos el primer display
movwf DISPLAY ; Movemos el dato al puerto B
movf S_UNI,0 ; Mueve M_UNI al registro W
iorlw b'00000000' ; Aplicamos la máscara
movwf DISPLAY ; Mostramos en el puerto B
call Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'00001111' ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Decenas de segundos
movlw b'00011111' ; Activamos el segundo display
movwf DISPLAY ; Movemos el dato al puerto B
movf S_DEC,0 ; Mueve S_DEC al registro W
iorlw b'00010000' ; Aplicamos la máscara
movwf DISPLAY ; Mostramos en el puerto B
call Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'00011111' ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Unidades de minutos
movlw b'00101111' ; Activamos el tercer display
movwf DISPLAY ; Movemos el dato al puerto B
movf M_UNI,0 ; Mueve M_UNI al registro W
iorlw b'00100000' ; Aplicamos la máscara
movwf DISPLAY ; Mostramos en el puerto B
call Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'00101111' ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Decenas de minutos
movlw b'00111111' ; Activamos el cuarto display
movwf DISPLAY ; Movemos el dato al puerto B
movf M_DEC,0 ; Mueve M_UNI al registro W
iorlw b'00110000' ; Aplicamos la máscara
movwf DISPLAY ; Mostramos en el puerto B
call Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'00111111' ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Unidades de horas
movlw b'01001111' ; Activamos el quinto display
movwf DISPLAY ; Movemos el dato al puerto B
movf H_UNI,0 ; Mueve M_UNI al registro W
iorlw b'01000000' ; Aplicamos la máscara
movwf DISPLAY ; Mostramos en el puerto B
call Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'01001111' ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Decenas de horas
movlw b'01011111' ; Activamos el sexto display
movwf DISPLAY ; Movemos el dato al puerto B
movf H_DEC,0 ; Mueve M_UNI al registro W
iorlw b'01010000' ; Aplicamos la máscara
movwf DISPLAY ; Mostramos en el puerto B
call Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'01011111' ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Verificar barrido
movfw BARR ; carga W con el número de barridos
sublw D'50' ; Resta 50 para comparar si es igual a 50
btfsc STATUS, Z ; Verifica si el resultado fué 0, o sea si BARR=50?
return ; Se completó el número de barridos
goto Barrido
;------------------------------------------------------------------------------
ValidarTiempo
movfw H_UNI ; Carga el registro W con el valor del registro H_UNI
sublw D'4' ; Resta 4 para verificar si es que el valor de W=4?
btfsc STATUS, Z ; Verifica si el resultado fué cero
goto ValidarHora ; Ahora llamamos al subrutina para verificar el siguiente dígito
d
e la hora
return
;------------------------------------------------------------------------------

ValidarHora
movfw H_DEC ; Carga el registro W con el valor del registro H_DEC
sublw D'2' ; Resta 2 para verificar si es que el valor de W=2?
btfsc STATUS, Z ; Verifica si el resultado fué cero
goto InicializarRegistros ; Al llamar a esta subrutina quiere decir que la
hora=24, lo
cuál implica un reinicio
return
;------------------------------------------------------------------------------

InicializarRegistros
clrf S_UNI
clrf S_DEC
clrf M_UNI
clrf M_DEC
clrf H_UNI
clrf H_DEC
return
;------------------------------------------------------------------------------

Temporizador
movlw D'255' ; w = 50 decimal
movwf PAUSE ; K = w

Kloop
decfsz PAUSE,f ; K = K - 1 , salta a la siguiente instrucción si es cero.
goto Kloop
return
;------------------------------------------------------------------------------

END ; Fin del programa.

También podría gustarte