codigo reloj con pic16f84a

15
; Universidad del Valle de Guatemala ; Microcontroladores Aplicados a la Industria ; Alvaro Arriola ; Carne 09245 ; Proyecto # 1 list p=16F84A #include <p16F84a.inc> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ;*********************DEFINICION DE VARIABLES************************** VAR UDATA_SHR 0x30 UN_CENT RES 1 ; 0x40 Centesimas de segundo y segundos. DEC_CENT RES 1 UN_SEG RES 1 DEC_SEG RES 1 UN_MIN RES 1 ; 0x44 Minutos y horas DEC_MIN RES 1 UN_HORA RES 1 DEC_HORA RES 1 UN_MIN_ALARMA RES 1 ; 0x48 Minutos y horas de la alarma DEC_MIN_ALARMA RES 1 UN_HORA_ALARMA RES 1 DEC_HORA_ALARMA RES 1 UN_CENT_CR RES 1 ; 0x4C Centesimas y segundos del cronometro DEC_CENT_CR RES 1 UN_SEG_CR RES 1 DEC_SEG_CR RES 1 UN_MIN_CR RES 1 ; 0x50 Minutos y horas del cronometro DEC_MIN_CR RES 1 UN_HORA_CR RES 1 DEC_HORA_CR RES 1 contador_tiempo RES 1 ; Se utiliza para desplegar una luz cada 0.5 s indicador_display RES 1 ; Indica a que display de 7 segmentos se envia datos seleccion_displays RES 1 ; Indica que se desplegara en los displays ; (horas/min, seg/cent, alarma) banderas_botones RES 1 ; Banderas de los botones en los puertos ; RB4 (bit 0), RB5 (bit 1), RB6 (bit 2 y 3) y ; RB7 (bit 4 y 5) contador_refr_displays RES 1 ; Sirven para retardar el refrescamiento contador_refr_displays2 RES 1 ; de los displays contador_estado_CR RES 1 ; Si es 0 el cronometro esta en 0, si es 1 ; esta contando y si es 2 esta pausado ;********************************************************************** MAIN_PROGRAM CODE 0x0000 GOTO INICIALIZACION

Upload: alvaro-arriola

Post on 21-Apr-2015

285 views

Category:

Documents


2 download

DESCRIPTION

Codigo Reloj con PIC16F84A

TRANSCRIPT

Page 1: Codigo Reloj con PIC16F84A

; Universidad del Valle de Guatemala ; Microcontroladores Aplicados a la Industria ; Alvaro Arriola ; Carne 09245 ; Proyecto # 1 list p=16F84A #include <p16F84a.inc> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ;*********************DEFINICION DE VARIABLES************************** VAR UDATA_SHR 0x30 UN_CENT RES 1 ; 0x40 Centesimas de segundo y segundos. DEC_CENT RES 1 UN_SEG RES 1 DEC_SEG RES 1 UN_MIN RES 1 ; 0x44 Minutos y horas DEC_MIN RES 1 UN_HORA RES 1 DEC_HORA RES 1 UN_MIN_ALARMA RES 1 ; 0x48 Minutos y horas de la alarma DEC_MIN_ALARMA RES 1 UN_HORA_ALARMA RES 1 DEC_HORA_ALARMA RES 1 UN_CENT_CR RES 1 ; 0x4C Centesimas y segundos del cronometro DEC_CENT_CR RES 1 UN_SEG_CR RES 1 DEC_SEG_CR RES 1 UN_MIN_CR RES 1 ; 0x50 Minutos y horas del cronometro DEC_MIN_CR RES 1 UN_HORA_CR RES 1 DEC_HORA_CR RES 1 contador_tiempo RES 1 ; Se utiliza para desplegar una luz cada 0.5 s indicador_display RES 1 ; Indica a que display de 7 segmentos se envia datos seleccion_displays RES 1 ; Indica que se desplegara en los displays ; (horas/min, seg/cent, alarma) banderas_botones RES 1 ; Banderas de los botones en los puertos ; RB4 (bit 0), RB5 (bit 1), RB6 (bit 2 y 3) y ; RB7 (bit 4 y 5) contador_refr_displays RES 1 ; Sirven para retardar el refrescamiento contador_refr_displays2 RES 1 ; de los displays contador_estado_CR RES 1 ; Si es 0 el cronometro esta en 0, si es 1 ; esta contando y si es 2 esta pausado ;********************************************************************** MAIN_PROGRAM CODE 0x0000 GOTO INICIALIZACION

Page 2: Codigo Reloj con PIC16F84A

;**************************INTERRUPCIONES****************************** ORG 0x0004 BTFSC INTCON, T0IF ; Revisar la bandera del TMR0 GOTO INT_TMR0 ; Si es 1 realizar la interrupcion del TMR0 BTFSC INTCON, RBIF ; Revisar la bandera de botones de PORTB GOTO BOTONES ; Si es 1 realizar interrupcion segun el boton RETFIE BOTONES: ; Se busca el boton de origen del evento BCF INTCON, RBIF ; Se regresa la bandera a 0 BTFSC PORTB, RB4 ; Si el estado del boton RB4 esta en alto CALL BOTON_RB4 ; realizar accion determinada para el boton RB4 BTFSC PORTB, RB5 ; Si el estado del boton RB5 esta en alto CALL BOTON_RB5 ; realizar accion determinada para el boton RB5 BTFSC PORTB, RB6 ; Si el estado del boton RB6 esta en alto CALL BOTON_RB6 ; realizar accion determinada para el boton RB6 BTFSC banderas_botones, 5; Se revisa si esta en bajo la bandera alarma RETFIE BTFSC PORTB, RB7 ; Si el estado del boton RB7 esta en alto CALL BOTON_RB7 ; realizar accion determinada para el boton RB7 RETFIE INT_TMR0: BCF INTCON, T0IF ; Regresar bandera de overflow a 0 MOVLW H'63' ; Poner 99d en TMR0 MOVWF TMR0 INCF contador_tiempo, 1 ; Incrementar contador para la luz intermitente CALL INCREMENTO_UN_CENT ; Incrementar una centesima de segundo BTFSC banderas_botones, 3 ; Revisa la bandera de contar del CR CALL INCREMENTO_UN_CENT_CR ; Incrementa centesima de segundo a CR RETFIE INICIALIZACION CLRW ; Reiniciar el acumulador MOVLW 0x30 ; Inicializar FSR en 0x30 MOVWF FSR CLRF PORTA ; Poner en 0 las salidas de PORTA y PORTB CLRF PORTB BSF STATUS, 5 ; Cambio a banco 1 CLRF TRISA ; PORTA completo como salida MOVLW H'F0' ; 11110000b MOVWF TRISB ; RB0 - RB03 como salidas ; RB4 - RB7 como entradas BCF OPTION_REG, T0CS ; Timer0 a modo timer BCF OPTION_REG, PSA ; Prescaler a Timer0 BSF OPTION_REG, PS2 ; Asignar escala prescaler a 1:128 BSF OPTION_REG, PS1 BCF OPTION_REG, PS0 BCF STATUS, 5 ; Cambio a banco 0

Page 3: Codigo Reloj con PIC16F84A

BSF INTCON, GIE ; Habilitar interrupciones BSF INTCON, T0IE ; Habilitar interrupcion TMR0 BSF INTCON, RBIE ; Habilita interrupt on change de PORTB MOVLW H'00' ;Inicializacion de variables MOVWF contador_tiempo MOVWF indicador_display MOVWF seleccion_displays MOVWF contador_refr_displays MOVWF contador_refr_displays2 MOVWF contador_estado_CR MOVWF banderas_botones MOVWF UN_CENT MOVWF DEC_CENT MOVWF UN_SEG MOVWF DEC_SEG MOVWF UN_MIN MOVWF DEC_MIN MOVWF UN_CENT_CR MOVWF DEC_CENT_CR MOVWF UN_SEG_CR MOVWF DEC_SEG_CR MOVWF UN_MIN_CR MOVWF DEC_MIN_CR MOVWF UN_HORA_CR MOVWF DEC_HORA_CR MOVWF UN_MIN_ALARMA MOVWF DEC_MIN_ALARMA MOVLW H'02' ; La hora inicia a las 12:00 MOVWF UN_HORA MOVWF UN_HORA_ALARMA MOVLW H'01' MOVWF DEC_HORA MOVWF DEC_HORA_ALARMA MOVLW H'63' ; 99d a TMR0 MOVWF TMR0 CICLO_PRINCIPAL: ; Ciclo infinito MOVLW H'50' ; Se revisa si contador_tiempo es 80d SUBWF contador_tiempo, 0 BTFSC STATUS, Z ; En el caso que sea 80d se debe CALL TITILANTE ; cambiar el estado del LED titilante INCF contador_refr_displays, 1 ; Se incrementa el contador 1 para MOVLW H'0F' ; refrescar los displays y se revisa SUBWF contador_refr_displays, 0 ; si es 0Fh. BTFSC STATUS, Z ; Si es 0Fh se hace GOTO a la etiqueta GOTO REFR_DISPLAYS_FF ; REFR_DISPLAYS_FF REGRESO_PRINCIPAL:

Page 4: Codigo Reloj con PIC16F84A

MOVLW H'30' ; Se revisa si el contador 2 para SUBWF contador_refr_displays2, 0 ; refrescar displays es 30h. BTFSC STATUS, Z ; Si su valor es 30h es momento de CALL DESPLEGAR ; refrescar los displays con DESPLEGAR GOTO CICLO_PRINCIPAL ; Regreso al inicio del ciclo principal REFR_DISPLAYS_FF: INCF contador_refr_displays2, 1 ; Se aumenta el segundo contador para MOVLW H'00' ; refrescar los displays y se reinicia MOVWF contador_refr_displays ; el contador 1 a 0. GOTO REGRESO_PRINCIPAL ; Se regresa a donde se dejo el ciclo ; principal ;****************************************************************************** ; Enciende el led si esta apagado, lo apaga si esta encendido. ; Esto se realiza cada medio segundo. TITILANTE MOVLW H'00' ; Regresar contador_tiempo a 0 MOVWF contador_tiempo BTFSC PORTA, RA4 ; Revisa si RA4 esta en alto GOTO Esta_ON ; Si esta en alto hace GOTO a Esta_ON BSF PORTA, RA4 ; Si RA4 esta en bajo lo pone en alto RETURN Esta_ON: ; Si RA4 esta en alto lo pone en bajo BCF PORTA, RA4 RETURN ;****************************************************************************** ; Cambia los valores que se visualizan en los displays (segundos/centesimas, ; horas/minutos, alarma) BOTON_RB4 BTFSC banderas_botones, 0 ; Si la bandera esta en alto no se realiza GOTO FLANCO_NEG_RB4 ; cambio. Y se debe regresar a 0. BSF banderas_botones, 0 ; Cambia la bandera a 1 INCF seleccion_displays, 1 ; Incrementa el contador de los displays MOVLW H'05' ; Revisa si el contador paso a ser 5 SUBWF seleccion_displays, 0 ; para regresarlo a 0. BTFSC STATUS, Z GOTO SEL_DISP_3 MOVLW H'04' ; Si no ha pasado a ser 3 se le suma 04h ADDWF FSR, 1 ; al FSR para pasar a desplegar las RETURN ; siguientes 4 variables SEL_DISP_3: ; Si el contador es 3 MOVLW H'00' ; Se reinicia a 0 MOVWF seleccion_displays MOVLW 0x30 ; Y se regresa FSR a direccion 0x30 MOVWF FSR RETURN FLANCO_NEG_RB4: ; Si la bandera era 1 se pasa a 0 para poder

Page 5: Codigo Reloj con PIC16F84A

BCF banderas_botones, 0 ; ejecutar la rutina a la siguiente vez. RETURN ;****************************************************************************** ; Incrementa los valores que se visualizan en los displays. ; Si se visualizan segundos/centesimas se reinician a 0. ; Si son las horas/minutos o la alarma se incrementa 1 minuto. BOTON_RB5 BTFSC banderas_botones, 1 ; Si la bandera esta en alto no se realiza GOTO FLANCO_NEG_RB5 ; ningun incremento. Y se reinicia a 0. BSF banderas_botones, 1 ; Se pone en alto la bandera si estaba en 0. MOVF seleccion_displays, 1 ; Se revisa que se esta visualizando BTFSC STATUS, Z ; en el momento. CALL RESET_SEG ; Si son segundos se reinician a 0. MOVLW H'01' ; Si son horas/minutos. SUBWF seleccion_displays, 0 BTFSC STATUS, Z CALL INCREMENTO_UN_MIN ; Se incrementa un minuto. MOVLW H'02' ; Si es la alarma. SUBWF seleccion_displays, 0 BTFSC STATUS, Z CALL INCREMENTO_UN_MIN_ALARMA ; Se le incrementa un minuto a la alarma. RETURN FLANCO_NEG_RB5: ; Si la bandera era 1 al inicio. BCF banderas_botones, 1 ; Se pone en 0. RETURN ;****************************************************************************** ; Reinicia los segundos y la centesimas de segundo a 0. RESET_SEG CLRF UN_CENT ; Reinicia centesimas de segundo. CLRF DEC_CENT CLRF UN_SEG ; Reinicia segundos. CLRF DEC_SEG RETURN ;****************************************************************************** ; BOTON_RB6 BTFSC banderas_botones, 2 ; Si la bandera esta en alto no se realiza GOTO FLANCO_NEG_RB6 ; ningun incremento. Y se reinicia a 0. BSF banderas_botones, 2 ; Se pone en alto la bandera si estaba en 0. INCF contador_estado_CR, 1 ; Se incrementa para el siguiente estado MOVLW H'03' ; Se revisa si es 3 SUBWF contador_estado_CR, 0 BTFSC STATUS, Z CLRF contador_estado_CR ; Si es 3 se reinicia a 0 MOVF contador_estado_CR, 1 ; Se revisa si es 0

Page 6: Codigo Reloj con PIC16F84A

BTFSC STATUS, Z GOTO REINICIAR_CR ; Si es 0 ir a REINICIAR_CR MOVLW H'01' ; Se revisa si es 1 SUBWF contador_estado_CR, 0 BTFSC STATUS, Z ; Si es 1 BSF banderas_botones, 3 ; Pone bandera de contar en alto MOVLW H'02' ; Se revisa si es 2 SUBWF contador_estado_CR, 0 BTFSC STATUS, Z ; Si es 2 BCF banderas_botones, 3 ; Pone bandera de contar en bajo RETURN FLANCO_NEG_RB6: ; Si la bandera era 1 al inicio. BCF banderas_botones, 2 ; Se pone en 0. RETURN REINICIAR_CR: ; Reinicia valores a 0 CLRF UN_CENT_CR CLRF DEC_CENT_CR CLRF UN_SEG_CR CLRF DEC_SEG_CR CLRF UN_MIN_CR CLRF DEC_MIN_CR CLRF UN_HORA_CR CLRF DEC_HORA_CR RETURN ;****************************************************************************** ; Se encarga de activar la alarma poniendo la bandera en alto y cambiando a ; salida RB7. BOTON_RB7 BTFSC banderas_botones, 4 ; Si la bandera esta en alto no se realiza GOTO FLANCO_NEG_RB7 ; nada y se reinicia a 0. BSF banderas_botones, 4 ; Se pone en alto la bandera si estaba en 0. BSF banderas_botones, 5 ; Se pone en alto la bandera de la alarma BSF STATUS, 5 ; Cambio a banco 1 BCF TRISB, 7 ; Se pone como salida RB7 BCF STATUS, 5 ; Cambio a banco 0 RETURN FLANCO_NEG_RB7: ; Si la bandera era 1 al inicio. BCF banderas_botones, 4 ; Se pone en 0. RETURN ;****************************************************************************** ; Se encarga de desplegar valores en los displays uno por uno, mandandole su ; respectivo valor actual a cada uno. DESPLEGAR MOVLW H'00' ; Reiniciar el contador 2 de refrescamiento MOVWF contador_refr_displays2 ; de los displays. MOVF indicador_display, 1 ; Se revisa si es el display 0

Page 7: Codigo Reloj con PIC16F84A

BTFSC STATUS, Z GOTO DISPLAY_0 MOVLW H'01' ; Se revisa si es el display 1 SUBWF indicador_display, 0 BTFSC STATUS, Z GOTO DISPLAY_1 MOVLW H'02' ; Se revisa si es el display 2 SUBWF indicador_display, 0 BTFSC STATUS, Z GOTO DISPLAY_2 MOVLW H'03' ; Se revisa si es el display 3 SUBWF indicador_display, 0 BTFSC STATUS, Z GOTO DISPLAY_3 DISPLAY_0: ; Si es turno del display 0 BSF PORTA, 0 ; Habilita el display 0 poniendo en alto BCF PORTA, 1 ; RA0 y RA1, RA2 y RA3 en bajo. BCF PORTA, 2 BCF PORTA, 3 BCF FSR, 0 ; Direccionamiento indirecto de la primera BCF FSR, 1 ; variable .ubicada iniciando en FSR MOVLW H'01' ; Mueve un 1 a indicador_display MOVWF indicador_display GOTO DESPLIEGUE ; Ir a desplegar. DISPLAY_1: ; Si es turno del display 1 BCF PORTA, 0 ; Habilita el display 1 poniendo en alto BSF PORTA, 1 ; RA1 y RA0, RA2 y RA3 en bajo. BCF PORTA, 2 BCF PORTA, 3 BSF FSR, 0 ; Direccionamiento indirecto de la segunda BCF FSR, 1 ; variable ubicada iniciando en FSR. INCF indicador_display, 1 ; Incrementa para el siguiente display. GOTO DESPLIEGUE ; Ir a desplegar. DISPLAY_2: ; Si es turno del display 2. BCF PORTA, 0 ; Habilita el display 2 poniendo en alto BCF PORTA, 1 ; RA2 y RA0, RA1 y RA3 en bajo. BSF PORTA, 2 BCF PORTA, 3 BCF FSR, 0 ; Direccionamiento indirecto de la tercera BSF FSR, 1 ; variable ubicada iniciando en FSR. INCF indicador_display, 1 ; Incrementa para el siguiente display. GOTO DESPLIEGUE ; Ir a desplegar. DISPLAY_3: ; Si es turno del display 3 BCF PORTA, 0 ; Habilita el display 2 poniendo en alto BCF PORTA, 1 ; RA2 y RA0, RA1 y RA3 en bajo. BCF PORTA, 2 BSF PORTA, 3 BSF FSR, 0 ; Direccionamiento indirecto de la tercera

Page 8: Codigo Reloj con PIC16F84A

BSF FSR, 1 ; variable ubicada iniciando en FSR. CLRF indicador_display ; Reinicia para que a la proxima sea el ; display 0 de nuevo. DESPLIEGUE: BCF PORTB, 0 ; Pone RB0 a RB3 en 0 BCF PORTB, 1 BCF PORTB, 2 BCF PORTB, 3 BTFSC INDF, 0 ; Mueve los primeros 4 bits de INDF BSF PORTB, 0 ; a los primeros 4 bits de PORTB. BTFSC INDF, 1 ; INDF direcciona dependiendo de la direccion BSF PORTB, 1 ; en FSR que se coloco anteriormente. BTFSC INDF, 2 BSF PORTB, 2 BTFSC INDF, 3 BSF PORTB, 3 RETURN ;****************************************************************************** ; Compara las 4 variables que muestran horas y minutos con las 4 variables ; de horas y minutos de la alarma. REVISAR_ALARMA BTFSS banderas_botones, 5 RETURN BTFSC PORTB, RB7 ; Si RB7 estaba en alto indica hay que GOTO ESTA_SONANDO ; ponerla de nuevo en bajo y volverla entrada MOVF UN_MIN_ALARMA, 0 ; Se compara la primera variable SUBWF UN_MIN, 0 ; Si no son iguales se retorna. BTFSS STATUS, Z RETURN MOVF DEC_MIN_ALARMA, 0 ; Se compara la segunda variable SUBWF DEC_MIN, 0 ; Si no son iguales se retorna. BTFSS STATUS, Z RETURN MOVF UN_HORA_ALARMA, 0 ; Se compara la tercera variable SUBWF UN_HORA, 0 ; Si no son iguales se retorna. BTFSS STATUS, Z RETURN MOVF DEC_HORA_ALARMA, 0 ; Se compara la cuarta vriable SUBWF DEC_HORA, 0 ; Si no son iguales se retorna BTFSS STATUS, Z RETURN BSF PORTB, RB7 ; Si todas eran iguales se pone en alto RB7 ; para indicar la alarma. RETURN ESTA_SONANDO: BCF PORTB, RB7 ; Poner en bajo la salida RB7 BSF STATUS, 5 ; Cambio a banco 1

Page 9: Codigo Reloj con PIC16F84A

BSF TRISB, 7 ; Poner RB7 como entrada BCF STATUS, 5 ; Cambio a banco 0 BCF banderas_botones, 5 ; Se pone en bajo la bandera de la alarma RETURN ; ****************************MANEJO DE TIEMPO******************************** ;****************************************************************************** ; Incrementa una centesima de segundo, revisa si UN_CENT es 10 para regresarlo ; a 0 e incrementar DEC_CENT, revisa si esta ultima es 10 para reiniciarla e ; incrementar un segundo, y revisa de la misma manera UN_SEG y DEC_CENT. INCREMENTO_UN_CENT INCF UN_CENT, 1 ; Incrementar UN_CENT MOVLW H'0A' ; Revisar si es 10 SUBWF UN_CENT, 0 BTFSC STATUS, Z GOTO UN_CENT_10 ; Si es ir a UN_CENT_10 RETURN UN_CENT_10: MOVLW H'0' ; Reinicia UN_CENT MOVWF UN_CENT INCF DEC_CENT, 1 ; Incrementa DEC_CENT MOVLW H'0A' ; Revisa si es 10 SUBWF DEC_CENT, 0 BTFSC STATUS, Z GOTO DEC_CENT_10 ; Si es 10 ir a DEC_CENT_10 RETURN DEC_CENT_10: MOVLW H'0' ; Reinicia DEC_CENT MOVWF DEC_CENT GOTO INCREMENTO_UN_SEG ; Ir a INCREMENTO_UN_SEG RETURN INCREMENTO_UN_SEG: INCF UN_SEG, 1 ; Incrementa UN_SEG MOVLW H'0A' ; Revisa si es 10 SUBWF UN_SEG, 0 BTFSC STATUS, Z GOTO UN_SEG_10 ; Si es 10 ir a UN_SEG_10 RETURN UN_SEG_10: MOVLW H'0' ; Reinicia UN_SEG MOVWF UN_SEG INCF DEC_SEG, 1 ; Incrementa DEC_SEG MOVLW H'06' ; Revisa si es 6 SUBWF DEC_SEG, 0 BTFSC STATUS, Z GOTO DEC_SEG_6 ; Si es 6 ir a DEC_SEG_6 RETURN

Page 10: Codigo Reloj con PIC16F84A

DEC_SEG_6: MOVLW H'0' ; Reinicia DEC_SEG MOVWF DEC_SEG CALL INCREMENTO_UN_MIN ; Llamar a INCREMENTO_UN_MIN RETURN ;****************************************************************************** ; Incrementa UN_MIN y revisa si es 10 para reiniciarla e incrementar DEC_MIN ; tambien revisa si esta ultima es 6 para reiniciarla y llamar a la funcion ; que incrementa la hora. INCREMENTO_UN_MIN INCF UN_MIN, 1 ; Incrementar UN_MIN CALL REVISAR_ALARMA ; Llama para revisar si es la hora de la alarma MOVLW H'0A' ; Revisa si es 10 SUBWF UN_MIN, 0 BTFSC STATUS, Z GOTO UN_MIN_10 ; Si es 10 ir a UN_MIN_10 RETURN UN_MIN_10: MOVLW H'0' ; Reiniciar UN_MIN MOVWF UN_MIN INCF DEC_MIN, 1 ; Incrementar DEC_MIN CALL REVISAR_ALARMA ; Llama para revisar si es la hora de la alarma MOVLW H'06' ; Revisa si es 6 SUBWF DEC_MIN, 0 BTFSC STATUS, Z GOTO DEC_MIN_6 ; Si es 6 ir a DEC_MIN_6 RETURN DEC_MIN_6: MOVLW H'0' ; Reinicia DEC_MIN MOVWF DEC_MIN CALL INCREMENTO_UN_HORA ; Llamar a incrementar la hora RETURN ;****************************************************************************** ; Incrementa UN_HORA y se encarga de revisar dependiendo del valor de DEC_HORA ; si es 0, 1 o 2 si ha llegado a 10 o a 5 para mantener un formato de 24 horas. INCREMENTO_UN_HORA INCF UN_HORA, 1 CALL REVISAR_ALARMA ; Llama para revisar si es la hora de la alarma MOVF DEC_HORA, 1 ; Revisar si DEC_HORA ES 0 BTFSC STATUS, Z GOTO REVISAR_UN_HORA_10 ; Si es 0 ir a REVISAR_UN_HORA_10 MOVLW H'01' ; Revisar si DEC_HORA ES 1 SUBWF DEC_HORA, 0 BTFSC STATUS, Z GOTO REVISAR_UN_HORA_10 ; Si es 1 ir a REVISAR_UN_HORA_10 MOVLW H'02' ; Revisar si DEC_HORA ES 2

Page 11: Codigo Reloj con PIC16F84A

SUBWF DEC_HORA, 0 BTFSC STATUS, Z GOTO REVISAR_UN_HORA_5 ; Si es 2 ir a REVISAR_UN_HORA_5 RETURN REVISAR_UN_HORA_10: MOVLW H'0A' ; Revisa si UN_HORA es 10 SUBWF UN_HORA, 0 BTFSC STATUS, Z GOTO UN_HORA_10 ; Si es 10 ir a UN_HORA_10 RETURN UN_HORA_10: INCF DEC_HORA, 1 ; Incrementa DEC_HORA MOVLW H'0' ; Reinicia UN_HORA MOVWF UN_HORA CALL REVISAR_ALARMA ; Llama para revisar si es la hora de la alarma RETURN REVISAR_UN_HORA_5: MOVLW H'05' ; Revisa si UN_HORA es 5 SUBWF UN_HORA, 0 BTFSC STATUS, Z GOTO RESET_DEC_HORA ; Si es 5 ir a RESET_DEC_HORA RETURN RESET_DEC_HORA: MOVLW H'00' ; Reinicia DEC_HORA MOVWF DEC_HORA MOVLW H'01' ; Mueve 1 a UN_HORA MOVWF UN_HORA CALL REVISAR_ALARMA ; Llama para revisar si es la hora de la alarma RETURN ;****************************************************************************** ; Incrementa UN_MIN y revisa si es 10 para reiniciarla e incrementar DEC_MIN ; tambien revisa si esta ultima es 6 para reiniciarla y llamar a la funcion ; que incrementa la hora. Es el mismo procedimiento que INCREMENTO_UN_MIN. INCREMENTO_UN_MIN_ALARMA INCF UN_MIN_ALARMA, 1 ; Incrementa UN_MIN_ALARMA MOVLW H'0A' ; Revisa si es 10 SUBWF UN_MIN_ALARMA, 0 BTFSC STATUS, Z GOTO UN_MIN_ALARMA_10 ; Si es 10 ir a UN_MIN_ALARMA_10 RETURN UN_MIN_ALARMA_10: MOVLW H'0' ; Reinicia UN_MIN_ALARMA MOVWF UN_MIN_ALARMA INCF DEC_MIN_ALARMA, 1 ; Incrementa DEC_MIN_ALARMA MOVLW H'06' ; Revisa si es 6 SUBWF DEC_MIN_ALARMA, 0 BTFSC STATUS, Z

Page 12: Codigo Reloj con PIC16F84A

GOTO DEC_MIN_ALARMA_6 ; Si es 6 ir a DEC_MIN_ALARMA_6 RETURN DEC_MIN_ALARMA_6: MOVLW H'0' ; Reinicia DEC_MIN_ALARMA MOVWF DEC_MIN_ALARMA CALL INCREMENTO_UN_HORA_ALARMA ; Llama a INCREMENTO_UN_HORA_ALARMA RETURN ;****************************************************************************** ; Incrementa UN_HORA_ALARMA y revisa dependiendo del valor de DEC_HORA ; si es 0, 1 o 2 si ha llegado a 10 o a 5 para mantener un formato de 24 horas. ; Es el mismo procedimiento que INCREMENTO_UN_HORA. INCREMENTO_UN_HORA_ALARMA INCF UN_HORA_ALARMA, 1 ; Incrementa UN_HORA_ALARMA MOVF DEC_HORA_ALARMA, 1 ; Revisar si DEC_HORA ES 0 BTFSC STATUS, Z GOTO REVISAR_UN_HORA_ALARMA_10 ; Si es 0 ir a REVISAR_UN_HORA_ALARMA_10 MOVLW H'01' ; Revisar si DEC_HORA ES 1 SUBWF DEC_HORA_ALARMA, 0 BTFSC STATUS, Z GOTO REVISAR_UN_HORA_ALARMA_10 ; Si es 1 ir a REVISAR_UN_HORA_ALARMA_10 MOVLW H'02' ; Revisar si DEC_HORA ES 2 SUBWF DEC_HORA_ALARMA, 0 BTFSC STATUS, Z GOTO REVISAR_UN_HORA_ALARMA_5 ; Si es 2 ir a REVISAR_UN_HORA_ALARMA_5 RETURN REVISAR_UN_HORA_ALARMA_10: MOVLW H'0A' ; Revisa si UN_HORA_ALARMA es 10 SUBWF UN_HORA_ALARMA, 0 BTFSC STATUS, Z GOTO UN_HORA_ALARMA_10 ; Si es 10 ir a UN_HORA_ALARMA_10 RETURN UN_HORA_ALARMA_10: INCF DEC_HORA_ALARMA, 1 ; Incrementar DEC_HORA_ALARMA MOVLW H'0' ; Reinicia UN_HORA_ALARMA MOVWF UN_HORA_ALARMA RETURN REVISAR_UN_HORA_ALARMA_5: MOVLW H'05' ; Revisa si UN_HORA_ALARMA es 5 SUBWF UN_HORA_ALARMA, 0 BTFSC STATUS, Z GOTO RESET_DEC_HORA_ALARMA ; Si es 5 ir a RESET_DEC_HORA_ALARMA RETURN RESET_DEC_HORA_ALARMA: MOVLW H'00' ; Reinicia DEC_HORA_ALARMA MOVWF DEC_HORA_ALARMA MOVLW H'01' ; Mueve el valor 1 a UN_HORA_ALARMA MOVWF UN_HORA_ALARMA

Page 13: Codigo Reloj con PIC16F84A

RETURN ;------------------------------------------------------------------------------ ;****************************************************************************** ; Incrementa una centesima de segundo a CR, revisa si UN_CENT_CR es 10 para ; regresarlo a 0 e incrementar DEC_CENT_CR, revisa si esta ultima es 10 para ; reiniciarla e incrementar un segundo, y revisa de la misma manera UN_SEG_CR y ; DEC_CENT_CR. Incrementa UN_MIN_CR y revisa si es 10 para reiniciarla e ; incrementar DEC_MIN_CR tambien revisa si esta ultima es 6 para reiniciarla e ; incrementa UN_HORA_CR y se encarga de revisar dependiendo del valor de ; DEC_HORA_CR si es 0, 1 o 2 si ha llegado a 10 o a 5 para mantener un formato ; de 24 horas para el cronometro, es el mismo procedimiento con la cuenta de ; la hora. INCREMENTO_UN_CENT_CR INCF UN_CENT_CR, 1 ; Incrementar UN_CENT_CR MOVLW H'0A' ; Revisar si es 10 SUBWF UN_CENT_CR, 0 BTFSC STATUS, Z GOTO UN_CENT_10_CR ; Si es ir a UN_CENT_10_CR RETURN UN_CENT_10_CR: MOVLW H'0' ; Reinicia UN_CENT_CR MOVWF UN_CENT_CR INCF DEC_CENT_CR, 1 ; Incrementa DEC_CENT_CR MOVLW H'0A' ; Revisa si es 10 SUBWF DEC_CENT_CR, 0 BTFSC STATUS, Z GOTO DEC_CENT_10_CR ; Si es 10 ir a DEC_CENT_10_CR RETURN DEC_CENT_10_CR: MOVLW H'0' ; Reinicia DEC_CENT_CR MOVWF DEC_CENT_CR GOTO INCREMENTO_UN_SEG_CR ; Ir a INCREMENTO_UN_SEG_CR RETURN INCREMENTO_UN_SEG_CR: INCF UN_SEG_CR, 1 ; Incrementa UN_SEG_CR MOVLW H'0A' ; Revisa si es 10 SUBWF UN_SEG_CR, 0 BTFSC STATUS, Z GOTO UN_SEG_10_CR ; Si es 10 ir a UN_SEG_10_CR RETURN UN_SEG_10_CR: MOVLW H'0' ; Reinicia UN_SEG_CR MOVWF UN_SEG_CR INCF DEC_SEG_CR, 1 ; Incrementa DEC_SEG_CR MOVLW H'06' ; Revisa si es 6 SUBWF DEC_SEG_CR, 0

Page 14: Codigo Reloj con PIC16F84A

BTFSC STATUS, Z GOTO DEC_SEG_6_CR ; Si es 6 ir a DEC_SEG_6_CR RETURN DEC_SEG_6_CR: MOVLW H'0' ; Reinicia DEC_SEG_CR MOVWF DEC_SEG_CR GOTO INCREMENTO_UN_MIN_CR ; Ir a INCREMENTO_UN_MIN_CR RETURN INCREMENTO_UN_MIN_CR: INCF UN_MIN_CR, 1 ; Incrementar UN_MIN_CR MOVLW H'0A' ; Revisa si es 10 SUBWF UN_MIN_CR, 0 BTFSC STATUS, Z GOTO UN_MIN_10_CR ; Si es 10 ir a UN_MIN_10_CR RETURN UN_MIN_10_CR: MOVLW H'0' ; Reiniciar UN_MIN_CR MOVWF UN_MIN_CR INCF DEC_MIN_CR, 1 ; Incrementar DEC_MIN_CR MOVLW H'06' ; Revisa si es 6 SUBWF DEC_MIN_CR, 0 BTFSC STATUS, Z GOTO DEC_MIN_6_CR ; Si es 6 ir a DEC_MIN_6_CR RETURN DEC_MIN_6_CR: MOVLW H'0' ; Reinicia DEC_MIN_CR MOVWF DEC_MIN_CR GOTO INCREMENTO_UN_HORA_CR ; Llamar a incrementar la hora RETURN INCREMENTO_UN_HORA_CR: INCF UN_HORA_CR, 1 MOVF DEC_HORA_CR, 1 ; Revisar si DEC_HORA_CR ES 0 BTFSC STATUS, Z GOTO REVISAR_UN_HORA_10_CR ; Si es 0 ir a REVISAR_UN_HORA_10_CR MOVLW H'01' ; Revisar si DEC_HORA_CR ES 1 SUBWF DEC_HORA_CR, 0 BTFSC STATUS, Z GOTO REVISAR_UN_HORA_10_CR ; Si es 1 ir a REVISAR_UN_HORA_10_CR MOVLW H'02' ; Revisar si DEC_HORA_CR ES 2 SUBWF DEC_HORA_CR, 0 BTFSC STATUS, Z GOTO REVISAR_UN_HORA_5_CR ; Si es 2 ir a REVISAR_UN_HORA_5_CR RETURN REVISAR_UN_HORA_10_CR: MOVLW H'0A' ; Revisa si UN_HORA_CR es 10 SUBWF UN_HORA_CR, 0 BTFSC STATUS, Z GOTO UN_HORA_10_CR ; Si es 10 ir a UN_HORA_10_CR

Page 15: Codigo Reloj con PIC16F84A

RETURN UN_HORA_10_CR: INCF DEC_HORA_CR, 1 ; Incrementa DEC_HORA_CR MOVLW H'0' ; Reinicia UN_HORA_CR MOVWF UN_HORA_CR RETURN REVISAR_UN_HORA_5_CR: MOVLW H'05' ; Revisa si UN_HORA_CR es 5 SUBWF UN_HORA_CR, 0 BTFSC STATUS, Z GOTO RESET_DEC_HORA_CR ; Si es 5 ir a RESET_DEC_HORA_CR RETURN RESET_DEC_HORA_CR: MOVLW H'00' ; Reinicia DEC_HORA_CR MOVWF DEC_HORA_CR MOVLW H'01' ; Mueve 1 a UN_HORA_CR MOVWF UN_HORA_CR RETURN END