Está en la página 1de 4

;lab 7, parte 2 ;******Jos Eduardo Santillana Abarca.

;En esta parte se ha modificado el procedimiento BOTONAZO para registrar el esta do previo ;del pin y de esta forma identificar los flancos positivos de RA1. Solo cuando e l estado del pin ;pase de 0 a 1, se incrementar la variable UN_MIN. list p=16F84A #include <p16F84a.inc> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ;******DEFINICION DE VARIABLES VAR UDATA_SHR 0X40 UN_SEG RES 1 ;X40 DEC_SEG RES 1 ;X41 UN_MIN RES 1 ;X42 DEC_MIN RES 1 ;X43 contador1 RES 1 BANDERAS RES 1 ;Bandera de ususario para ver "poleo" en RA1 ACUMULADOR RES 1 ; variable Para guardar el valor de W al momento de la int errupcion ESTADO_T RES 1 ; variable Para guardar el valor de STATUS al momento de la interrupcion PC_TEMP RES 1 ;********************************************************************** RESET_VECTOR CODE 0x0000 ; processor reset vector GOTO INICIO ; Salto al inicio del programa INT_VECTOR INTERRUPCION MOVWF MOVF MOVWF MOVF MOVWF ACUMULADOR STATUS,w ESTADO_T PCLATH,w PC_TEMP ; Guardar W ; ; Guardar STATUS ; ; Borrar bit que produjo la interrupcion (T0IF). ; Incrementar var CONTADOR ; darle valor inicial de 99 al TMR0. CODE 0x0004

BCF INTCON,T0IF INCF contador1 MOVLW d'99' MOVWF TMR0

BTFSS contador1, 0 ;Si el contador es imparpar. GOTO ES_PAR BSF FSR, 0 ; Si CONTADOR es impar, prendemos el primer bit del registro FSR (Seleccionamos DEC_SEG) ES_PAR: ; cuyo valor se encontrar en el registro INTF. BTFSC contador1, 0 ;Si CONTADOR es par GOTO ES_IMPAR BCF FSR, 0 ; Si CONTADOR es impar, prendemos el primer bit del registro FSR (Seleccionamos DEC_SEG) ES_IMPAR: MOVLW b'00000111' ANDWF contador1,W BTFSC STATUS, Z BSF BANDERAS,0 ; cuyo valor se encontrar en el registro INTF. MOVF PC_TEMP,w

MOVWF PCLATH ; Regresar el valor original de PCLATH MOVF ESTADO_T,w MOVWF STATUS ; Regresar el valor original de STATUS SWAPF ACUMULADOR,f SWAPF ACUMULADOR,w ; Regresar el valor original de W RETFIE ; Salir de interrupcion ;------------------------------------------------------------------------MAIN_PROGRAM CODE INICIO CLRW ;Se limpia el registro W (Acumulador) CLRF UN_SEG CLRF DEC_SEG CLRF UN_MIN CLRF DEC_MIN CLRF contador1 CLRF FSR CLRF TMR0 ;Limpio el registro TIMER0 CLRF PORTA ; Se limpia el contenido del registro PORTA y PORTB CLRF PORTB MOVLW h'42' ;Se emplea direccionamiento indirecto MOVWF FSR ;El apuntador FSR empezar a puntar desde la direccin 40h (UN_SEG) ; Cuando contador sea par FSR puntar a 40H (UN_SEG), Cuando contador sea impar FS R apuntar a 41h (DEC_SEG) BSF STATUS,5 ;Se coloca el bit 5 del registro STATUS (RP0) en uno. Estamos e n Banco 1. ;************************************* MOVLW b'11000010' ;Creo un vector binario con los primeros 5 pines en 0 (salid as) y los ultimos tres pines en 1(entradas), para el puerto B MOVWF TRISA ;Se colocan los pines de TRISA en cero (0). Salidas. MOVLW b'11000000' ;Creo un vector binario con los primeros 5 pines en 0 (salid as) y los ultimos tres pines en 1(entradas), para el puerto B MOVWF TRISB ;************************************* CLRF OPTION_REG ;Limpio el registro OPTION_REG para poder utilizar los bits del timer y el prescaler BCF OPTION_REG,T0CS ;Colocamos el TIMER0 en modo timer, bit 5 de Option Register BCF OPTION_REG,PSA ;Asiganmos prescaler al Timer0 BCF OPTION_REG,PS0 ;0, Los bit del PSO al PS2, Son para configurar el Prescaler con respecto al osilador a utilizar BCF OPTION_REG,PS1 ;0, BSF OPTION_REG,PS2 ;1. Coloco 011, para seleccionar la relacion 1:32 de TMR0, e n mi caso utilizo un oscilador de 4MHz. BCF STATUS,5 ;El bit 5 del registro STATUS, es colocado en 0. Estamos en banco 0. MOVLW d'99' ; asignarlr 99 a TMR0, El inmediato se mueve al acumulador MOVWF TMR0 ;Lo que est en el acomulador, se mueve al timer cero BSF INTCON,GIE ;Habilito ambos bits (GIE y T0IE) para abilitar la interrupcin de l TIMER0 BSF INTCON,T0IE ;***************************************************************************** Principal: CLRW VERIFCA_SI_count__ES_25: ;En caso de que T0IF sea cero. MOVLW D'100' ;se le asigna 25 al acumulador SUBWF contador1,0; se le resta contador1 al acumulador BTFSC STATUS,Z ;Si el resultado de la resta anterior da cero, entonces Z val dr 1.

CALL SI_IGUAL_A_25 ;Si Z=1 se ejecuta sta instruccin BTFSC BANDERAS,0 CALL BOTONAZO CALL DESPLEGAR ;Si Z=0 se ejecuta sta instruccin, pero no la anterior. GOTO Principal ;Parte del ciclo principal ;**************************SECCIN PARA PROCEDIMIENTOS********************* SI_IGUAL_A_25: CLRF contador1 ;Algorito del toggle BTFSC PORTA,2 GOTO Esta_ON BSF PORTA,2 RETURN Esta_ON: BCF PORTA,2 RETURN ;------------------------------------------BOTONAZO: BTFSC PORTA,1 ;Se evalua el estado de RA1. BTFSC BANDERAS,1 GOTO ENVES_DE_RETURN ;Si RB1 = 1, regresamos a Principal. BSF BANDERAS,1 INCF UN_MIN ;Si RB1 = 0, continuamos... MOVLW d'10' XORWF UN_MIN, W ;Vemos que valor hay en UN_SEG. BTFSS STATUS, Z ;Si llegamos a 10, Z=1 GOTO ENVES_DE_RETURN ;Si Z=0, regresamos a Principal. INCF DEC_MIN ;Si Z=1, incrementamos las decenas de segundo. CLRF UN_MIN ;Comenzamos de 0 las unidaes de segundo. MOVLW d'6' XORWF DEC_MIN, W ;Vemos el valor que hay en DEC_SEG. BTFSS STATUS, Z ;Si llegamos a 6, Z=1. GOTO ENVES_DE_RETURN ;Si Z=0 regresamos a Principal. CLRF DEC_MIN ;Si Z=1 Comenzamos de 0 las unidaes de segundo. ENVES_DE_RETURN: BTFSC PORTA,1 GOTO BIT_RA1_SI_CERO BCF BANDERAS,1 BIT_RA1_SI_CERO: BCF BANDERAS,0 RETURN ;Regresamos a Principal ;-------------------------------------------------------------------DESPLEGAR: MOVF INDF, W ;Valor de la variable a la que apunta fsr MOVWF PORTB ;Si el bit -sig. de fsr=0 despliega UN_SEG BTFSS contador1, 0 GOTO COUN_ES_PAR BCF PORTB, RB4 BSF PORTB, RB5 COUN_ES_PAR: ;Si el bit -sig. de fsr=1 despliega DEC_SEG BTFSC contador1, 0 GOTO COUN_ES_IMPAR BCF PORTB, RB5 BSF PORTB, RB4 COUN_ES_IMPAR: ;Si el bit -sig. de fsr=1 despliega DEC_SEG RETURN

END

;Fin del programa.

También podría gustarte