Anda di halaman 1dari 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 DEC_CENT UN_SEG DEC_SEG UN_MIN DEC_MIN UN_HORA DEC_HORA UN_MIN_ALARMA DEC_MIN_ALARMA UN_HORA_ALARMA DEC_HORA_ALARMA UN_CENT_CR DEC_CENT_CR UN_SEG_CR DEC_SEG_CR UN_MIN_CR DEC_MIN_CR UN_HORA_CR DEC_HORA_CR contador_tiempo indicador_display seleccion_displays RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 RES 1 ; 0x40 Centesimas de segundo y segundos.

; 0x44

Minutos y horas

; 0x48

Minutos y horas de la alarma

; 0x4C

Centesimas y segundos del cronometro

; 0x50

Minutos y horas del cronometro

; Se utiliza para desplegar una luz cada 0.5 s ; Indica a que display de 7 segmentos se envia datos ; 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

;**************************INTERRUPCIONES****************************** ORG 0x0004 BTFSC GOTO BTFSC GOTO RETFIE BOTONES: BCF BTFSC CALL BTFSC CALL BTFSC CALL BTFSC RETFIE BTFSC CALL RETFIE INT_TMR0: BCF MOVLW MOVWF INCF CALL BTFSC CALL RETFIE INTCON, T0IF INT_TMR0 INTCON, RBIF BOTONES ; Revisar la bandera del TMR0 ; Si es 1 realizar la interrupcion del TMR0 ; Revisar la bandera de botones de PORTB ; Si es 1 realizar interrupcion segun el boton

; Se busca el boton de origen del evento INTCON, RBIF ; Se regresa la bandera a 0 PORTB, RB4 ; Si el estado del boton RB4 esta en alto BOTON_RB4 ; realizar accion determinada para el boton RB4 PORTB, RB5 ; Si el estado del boton RB5 esta en alto BOTON_RB5 ; realizar accion determinada para el boton RB5 PORTB, RB6 ; Si el estado del boton RB6 esta en alto BOTON_RB6 ; realizar accion determinada para el boton RB6 banderas_botones, 5; Se revisa si esta en bajo la bandera alarma PORTB, RB7 BOTON_RB7 ; Si el estado del boton RB7 esta en alto ; realizar accion determinada para el boton RB7

INTCON, T0IF ; Regresar bandera de overflow a 0 H'63' ; Poner 99d en TMR0 TMR0 contador_tiempo, 1 ; Incrementar contador para la luz intermitente INCREMENTO_UN_CENT ; Incrementar una centesima de segundo banderas_botones, 3 ; Revisa la bandera de contar del CR INCREMENTO_UN_CENT_CR ; Incrementa centesima de segundo a CR

INICIALIZACION CLRW MOVLW 0x30 MOVWF FSR CLRF PORTA CLRF PORTB BSF STATUS, 5 CLRF TRISA MOVLW H'F0' MOVWF TRISB BCF BCF BSF BSF BCF BCF

; Reiniciar el acumulador ; Inicializar FSR en 0x30 ; Poner en 0 las salidas de PORTA y PORTB

; Cambio a banco 1 ; PORTA completo como salida ; 11110000b ; RB0 - RB03 como salidas ; RB4 - RB7 como entradas OPTION_REG, T0CS ; Timer0 a modo timer OPTION_REG, PSA ; Prescaler a Timer0 OPTION_REG, PS2 ; Asignar escala prescaler a 1:128 OPTION_REG, PS1 OPTION_REG, PS0 STATUS, 5 ; Cambio a banco 0

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' MOVWF TMR0 ; 99d a TMR0

CICLO_PRINCIPAL: MOVLW H'50' SUBWF contador_tiempo, 0 BTFSC STATUS, Z CALL TITILANTE INCF contador_refr_displays, 1 MOVLW H'0F' SUBWF contador_refr_displays, 0 BTFSC STATUS, Z GOTO REFR_DISPLAYS_FF REGRESO_PRINCIPAL:

; Ciclo infinito ; Se revisa si contador_tiempo es 80d ; En el caso que sea 80d se debe ; cambiar el estado del LED titilante ; Se incrementa el contador 1 para ; refrescar los displays y se revisa ; si es 0Fh. ; Si es 0Fh se hace GOTO a la etiqueta ; REFR_DISPLAYS_FF

MOVLW H'30' SUBWF contador_refr_displays2, 0 BTFSC STATUS, Z CALL DESPLEGAR GOTO CICLO_PRINCIPAL REFR_DISPLAYS_FF: INCF contador_refr_displays2, 1 MOVLW H'00' MOVWF contador_refr_displays GOTO REGRESO_PRINCIPAL

; Se revisa si el contador 2 para ; refrescar displays es 30h. ; Si su valor es 30h es momento de ; refrescar los displays con DESPLEGAR ; Regreso al inicio del ciclo principal ; Se aumenta el segundo contador para ; refrescar los displays y se reinicia ; el contador 1 a 0. ; 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

BCF RETURN

banderas_botones, 0 ; ejecutar la rutina a la siguiente vez.

;****************************************************************************** ; 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

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

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

BSF CLRF DESPLIEGUE: BCF BCF BCF BCF BTFSC BSF BTFSC BSF BTFSC BSF BTFSC BSF RETURN

FSR, 1 indicador_display

; variable ubicada iniciando en FSR. ; Reinicia para que a la proxima sea el ; display 0 de nuevo.

PORTB, 0 PORTB, 1 PORTB, 2 PORTB, 3 INDF, 0 PORTB, 0 INDF, 1 PORTB, 1 INDF, 2 PORTB, 2 INDF, 3 PORTB, 3

; Pone RB0 a RB3 en 0

; Mueve los primeros 4 bits de INDF ; a los primeros 4 bits de PORTB. ; INDF direcciona dependiendo de la direccion ; en FSR que se coloco anteriormente.

;****************************************************************************** ; 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

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

DEC_SEG_6: MOVLW MOVWF CALL RETURN

H'0' DEC_SEG INCREMENTO_UN_MIN

; Reinicia DEC_SEG ; Llamar a INCREMENTO_UN_MIN

;****************************************************************************** ; 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

SUBWF DEC_HORA, 0 BTFSC STATUS, Z GOTO REVISAR_UN_HORA_5 RETURN REVISAR_UN_HORA_10: MOVLW H'0A' SUBWF UN_HORA, 0 BTFSC STATUS, Z GOTO UN_HORA_10 RETURN UN_HORA_10: INCF DEC_HORA, 1 MOVLW H'0' MOVWF UN_HORA CALL REVISAR_ALARMA RETURN REVISAR_UN_HORA_5: MOVLW H'05' SUBWF UN_HORA, 0 BTFSC STATUS, Z GOTO RESET_DEC_HORA RETURN RESET_DEC_HORA: MOVLW H'00' MOVWF DEC_HORA MOVLW H'01' MOVWF UN_HORA CALL REVISAR_ALARMA RETURN

; Si es 2 ir a REVISAR_UN_HORA_5

; Revisa si UN_HORA es 10

; Si es 10 ir a UN_HORA_10

; Incrementa DEC_HORA ; Reinicia UN_HORA ; Llama para revisar si es la hora de la alarma

; Revisa si UN_HORA es 5

; Si es 5 ir a RESET_DEC_HORA

; Reinicia DEC_HORA ; Mueve 1 a UN_HORA ; Llama para revisar si es la hora de la alarma

;****************************************************************************** ; 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

GOTO DEC_MIN_ALARMA_6 RETURN DEC_MIN_ALARMA_6: MOVLW H'0' MOVWF DEC_MIN_ALARMA CALL INCREMENTO_UN_HORA_ALARMA RETURN

; Si es 6 ir a DEC_MIN_ALARMA_6

; Reinicia DEC_MIN_ALARMA ; Llama a INCREMENTO_UN_HORA_ALARMA

;****************************************************************************** ; 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

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 MOVLW H'0A' SUBWF UN_CENT_CR, 0 BTFSC STATUS, Z GOTO UN_CENT_10_CR RETURN UN_CENT_10_CR: MOVLW H'0' MOVWF UN_CENT_CR INCF DEC_CENT_CR, 1 MOVLW H'0A' SUBWF DEC_CENT_CR, 0 BTFSC STATUS, Z GOTO DEC_CENT_10_CR RETURN DEC_CENT_10_CR: MOVLW H'0' MOVWF DEC_CENT_CR GOTO INCREMENTO_UN_SEG_CR RETURN INCREMENTO_UN_SEG_CR: INCF UN_SEG_CR, 1 MOVLW H'0A' SUBWF UN_SEG_CR, 0 BTFSC STATUS, Z GOTO UN_SEG_10_CR RETURN UN_SEG_10_CR: MOVLW H'0' MOVWF UN_SEG_CR INCF DEC_SEG_CR, 1 MOVLW H'06' SUBWF DEC_SEG_CR, 0

; Incrementar UN_CENT_CR ; Revisar si es 10

; Si es ir a UN_CENT_10_CR

; Reinicia UN_CENT_CR ; Incrementa DEC_CENT_CR ; Revisa si es 10

; Si es 10 ir a DEC_CENT_10_CR

; Reinicia DEC_CENT_CR ; Ir a INCREMENTO_UN_SEG_CR

; Incrementa UN_SEG_CR ; Revisa si es 10

; Si es 10 ir a UN_SEG_10_CR

; Reinicia UN_SEG_CR ; Incrementa DEC_SEG_CR ; Revisa si es 6

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

RETURN UN_HORA_10_CR: INCF DEC_HORA_CR, 1 MOVLW H'0' MOVWF UN_HORA_CR RETURN REVISAR_UN_HORA_5_CR: MOVLW H'05' SUBWF UN_HORA_CR, 0 BTFSC STATUS, Z GOTO RESET_DEC_HORA_CR RETURN RESET_DEC_HORA_CR: MOVLW H'00' MOVWF DEC_HORA_CR MOVLW H'01' MOVWF UN_HORA_CR RETURN END

; Incrementa DEC_HORA_CR ; Reinicia UN_HORA_CR

; Revisa si UN_HORA_CR es 5

; Si es 5 ir a RESET_DEC_HORA_CR

; Reinicia DEC_HORA_CR ; Mueve 1 a UN_HORA_CR

Anda mungkin juga menyukai