;DIRECTIVAS LIST p=16F887 ;Tipo de microcontrolador INCLUDE P16F887.INC ;Define los SFRs y bits del ;P16F887 __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __CONFIG _CONFIG2, _WRT_OFF & _BOR21V ;Setea parámetros de ;configuración errorlevel -302 ;Deshabilita mensajes de ;advertencia por cambio ;bancos cblock 0x20 contador ;Cuenta 10 interrupciones suma minutos ENDC ;********************************************************************* ;PROGRAMA ORG 0x00 ;Vector de RESET GOTO MAIN ORG 0x04 ;Vector de interrupción GOTO Interrupcion ;DURANTE LA INTERRUPCION SE CUENTAN 10 INTERRUPCIONES ;PARA COMPLETAR 10x100=1000ms. ; MANEJO DE LA INTERRUPCION Interrupcion decfsz contador,f ;Cuenta espacios de 10ms goto Seguir ;Aún, no son 100 interrupciones nop ; YA EL TIMER SE HA DESBORDADO 100 VECES (HAN PASDO 1 SEGUNDO) ;++++++============================================================================================================================================= INCF suma,f ;Ahora sí 10x10=100ms=0.1seg ; COMPARO SI ES IGUAL A 10 EL NUMERO INGRESADO POR SWITCH (SI ES IGUAL A 10 ME LLAMA A IGUAL10 CASO CONTRARIO A OTRO) movlw d'10' subwf suma,0 btfss STATUS,Z goto otro goto igual10 ;ME IMPRIME 10 SI EL NUMERO ES IGUAL A 10 igual10 movlw d'1' call tabla movwf PORTB movlw d'0' call tabla movwf PORTD goto conta ; COMPARO SI ES MENOR O MAYOR A 10 ;(SI ES MAYOR A 10 ME LLAMA A MAYOR10 CASO CONTRARIO A MENOR10) otro movlw d'10' subwf suma,0 btfss STATUS,C goto menor10 goto mayor10 ;COMO EL VALOR ES MENOR A 10 , IMPRIMO EN PORTA EL VALOR 0 Y EN PORTC IMPRIMO EL VALOR menor10 movlw d'0' call tabla movwf PORTB movfw suma call tabla movwf PORTD goto conta ; COMPARO SI ES IGUAL A 20 ;(SI ES IGUAL A 20 ME LLAMA A IGUAL20 CASO CONTRARIO A OTRO2) mayor10 movlw d'20' subwf suma,0 btfss STATUS,Z goto otro2 goto igual20 ; COMPARO SI ES MENOR O MAYOR A 20 ;(SI ES MAYOR A 20 ME LLAMA A MAYOR20 CASO CONTRARIO A MENOR20) otro2 movlw d'20' subwf suma,0 btfss STATUS,C goto menor20 goto mayor20 ;COMO EL VALOR ES MENOR A 20 , IMPRIMO EN PORTA EL VALOR 1 ;Y EN PORTC IMPRIMO VALOR-10(PARA SACAR LA UNIDAD) menor20 movlw d'1' call tabla movwf PORTB movlw d'10' subwf suma,0 call tabla movwf PORTD goto conta ; COMPARO SI ES IGUAL A 30 ;(SI ES IGUAL A 30 ME LLAMA A IGUAL30 CASO CONTRARIO A OTRO3) mayor20 movlw d'30' subwf suma,0 btfss STATUS,Z goto otro3 goto igual30 ; COMPARO SI ES MENOR O MAYOR A 30 ;(SI ES MAYOR A 30 ME LLAMA A MAYOR30 CASO CONTRARIO A MENOR30) otro3 movlw d'30' subwf suma,0 btfss STATUS,C goto menor30 goto mayor30 ;COMO EL VALOR ES MENOR A 30 , IMPRIMO EN PORTA EL VALOR 2 ;Y EN PORTC IMPRIMO VALOR-20(PARA SACAR LA UNIDAD) menor30 movlw d'2' call tabla movwf PORTB movlw d'20' subwf suma,0 call tabla movwf PORTD goto conta ;COMO EL NUMERO ES IGUAL A 20 EN PORTA IMPRIMO EL 2 Y EN PORTC EL 0 igual20 movlw d'2' call tabla movwf PORTB movlw d'0' call tabla movwf PORTD goto conta ;COMO EL NUMERO ES IGUAL A 20 EN PORTA IMPRIMO EL 3 Y EN PORTC EL 0 igual30 movlw d'3' call tabla movwf PORTB movlw d'0' call tabla movwf PORTD goto conta ;COMO ES MAYOR A 30 IMPRIMO EN PORTA EL VALOR 3 ;Y EN PORTC EL VALOR DE LA DIFERENCIA VALOR -30 (UNIDADES) mayor30 movlw d'40' subwf suma,0 btfss STATUS,C goto menor40 goto mayor40 menor40 movlw d'3' call tabla movwf PORTB movlw d'30' subwf suma,0 call tabla movwf PORTD goto conta mayor40 movlw d'40' subwf suma,0 btfss STATUS,Z goto otro40 goto igual40 igual40 movlw d'4' call tabla movwf PORTB movlw d'0' call tabla movwf PORTD goto conta otro40 movlw d'50' subwf suma,0 btfss STATUS,C goto menorA goto mayorB menorA movlw d'4' call tabla movwf PORTB movlw d'40' subwf suma,0 call tabla movwf PORTD goto conta mayorB movlw d'50' subwf suma,0 btfss STATUS,Z goto K goto igual50 igual50 movlw d'5' call tabla movwf PORTB movlw d'0' call tabla movwf PORTD goto conta K movlw d'60' subwf suma,0 btfss STATUS,C goto MEN GOTO MAY MEN movlw d'5' call tabla movwf PORTB movlw d'50' subwf suma,0 call tabla movwf PORTD goto conta MAY movlw d'6' call tabla movwf PORTB movlw d'0' call tabla movwf PORTD clrf suma ; CADA VEZ QUE HAYAN PASADO 60 SEGUNDOS SE ENCERA SUMA (SEGUNDOS) incf minutos ;CADA VES QUE HAYAN PASADO 60 SEGUNDOS SE INCREMENTAN LOS MINUTOS movfw minutos movwf PORTC goto conta ;==================================================================================================================================== goto conta ; SE REINICIA EL CONTADOR PARA QUE SE DESBORDE CADA 100 VECES conta movlw .100 movwf contador ;Precarga contador con 10 ; ACTVAMOS DE NUEVO LAS INTERRUPCIONES POR TIMER 0 Y EL VALOR DE LA CARGA Seguir bcf INTCON,T0IF ;Repone flag del TMR0 movlw .217 movwf TMR0 ;Repone el TMR0 con .217 retfie ;Retorno de interrupción MAIN ;SETEO DE PUERTOS movlw b'00000000' movwf INTCON ;DESActiva la interrupción del TMR0 movlw b'01100000' movwf STATUS ; BANKSEL ANSEL CLRF ANSEL CLRF ANSELH movlw b'00100000' movwf STATUS ; Selecciona el Bank1 CLRF TRISC ; Puerto como salida CLRF TRISB ; Puerto como salida CLRF TRISD ; Puerto como salida movlw b'00010010' ; Pines 1 y 4 del puerto A como entrada movwf TRISA ;INICIALIZACION movlw b'00000000' movwf STATUS ; BANKSEL PORTB ;Selecciona el Bank0 CLRF PORTA CLRF PORTC CLRF PORTD CLRF suma CLRF minutos INICIO BSF PORTC,0 BSF PORTC,2 BSF PORTC,4 BSF PORTC,6 btfsc PORTA,4 goto INICIO nop CLRF PORTC ;PROGRAMACION DEL TMR0 movlw b'00100000' movwf STATUS ;banksel OPTION_REG movlw b'00000111' ;TMR0 como temporizador movwf OPTION_REG ;con preescalador de 256 movlw b'00000000' movwf STATUS ; BANKSEL TMR0 movlw .217 ;Valor decimal 217 movwf TMR0 ;Carga el TMR0 con 217 ;PROGRAMACION DE INTERRUPCION movlw b'10100000' movwf INTCON ;Activa la interrupción del TMR0 movlw .100 ;Cantidad de interrupciones a contar movwf contador ;Nº de veces a repetir la interrupción presionar btfss PORTA,4 goto presionar goto soltar soltar btfss PORTA,4 goto lop goto soltar ; VA IR AL MANEJO DE LA INTERRUPCION CADA 0.01 SEGUNDOS lop nop goto lop ;=================================================== tabla ADDWF PCL,F ; PCL + W -> W RETLW 0x3F ; Retorna con el código del 0 RETLW 0x06 ; Retorna con el código del 1 RETLW 0x5B ; Retorna con el código del 2 RETLW 0x4F ; Retorna con el código del 3 RETLW 0x66 ; Retorna con el código del 4 RETLW 0x6D ; Retorna con el código del 5 RETLW 0x7D ; Retorna con el código del 6 RETLW 0x07 ; Retorna con el código del 7 RETLW 0x7F ; Retorna con el código del 8 RETLW 0x67 ; Retorna con el código del 9 RETLW 0x38 ; retorna letra L RETLW 0x77 ; retorna letra A RETLW 0x73 ; retorna letra P RETLW 0x39 ; retorna letra C END