ESCUELA SUPERIOR POLITÉCNICA DEL LITORAL

FACULTAD DE INGENIERIA EN EN ELECTRICIDAD Y COMPUTACIÓN FIEC

PRACTICAS DE LABORATORIO DE MICROCONTROLADORES PARALELO # 1

Integrantes: Juan Carlo Pezo Oquendo Carlos Moisés Díaz Espinoza Profesor: Ing. Hugo Villavicencio V. Fecha de Presentación: Noviembre 23, 2011 PRACTICA 5 CONTADORES

PRACTICA 5 CONTADORES
1.- Enunciado del proyecto Esta práctica consta de tres programas, el primero muestra un display conectado al puerto b, que marca las unidades controladas mediante interrupciones y demás condiciones planteadas en la codificación del programa. El segundo consta de dos displays que conectados el uno al puerto b y el otro al puerto c, mostrarán, uno las unidades y el otro las decenas, utilizando el mismo sistema del programa anterior. El tercero muestra un display con dos displays pero estos están conectados ambos al puerto b, aquí utilizaremos la técnica de multiplexación. 2.- Diagrama de Bloques

RESISTENCIAS PIC 16F887

DISPLAY

Diagramas de Flujos funcional del Programa principal CONTADOR CON DISPLAY DE SIETE SEGMENTOS USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms PARA CONTAR CADA SEGUNDO ..3.

Subrutina .

Subrutina .

w<=10 Si Unidades<=0 Incf decenas . w<=10 Si Decenas<=0 No Contador<=100 Subwf unidades. w<= unidades call tabla PortB<= cod 7 seg w<= decenas call tabla PortC<= cod 7 seg No TMR <= 217 T0FI<=0 Decfsz Contador Si Incf unidades No Subwf unidades.CONTADOR DE DOS DIGITOS CON DISPLAY DE SIETE SEGMENTOS USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms (10x100) PARA INCREMENTAR SU VALOR CADA SEGUNDO DE 00-99 Inicio Seteo de puertos Cargar con divisor 255 el TMR0 Activar las interrupciones globales TMR0<= 217 Contador <= 100 .

.. 5.endc" reserva espacios de memoria a partir de 0x20 CBLOCK 0X020 contador .Use reloj de 4MHz.Define los SFRs y bits del .Cuenta 100 interrupciones unidades .01 .-Descripción del algoritmo o estrategia utilizada.Se trata de incrementar un contador cada segundo y mostrar su valor en .una interrupción cada 0.seg.La directiva "cblock 0X20. En el segundo se configura el TMR0 igual q en el del primero sino q en este caso se van mostrando en dos displays las unidades y decenas.cada 500 Ms.P16F887 __CONFIG _CONFIG1. En el primer ejercicio para realizar el retardo de un segundo se utiliza el TMR0 inicializándolo con 217 para q exista una interrupción cada 10mS.Vector de interrupción . (10 mS) que se repetirá 50 veces con el objeto de activar el conteo .el display.INC . PARA CONTAR CADA SEGUNDO . 1.********************************************************************* . PROGRAMADOR: Carlos Valdivieso .4. 2.Deshabilita mensajes de .********************************************************************* .Tipo de microcontrolador .INICIO DE PROGRAMA ORG 0x00 GOTO MAIN ORG 0x04 GOTO INTERRUPCION LIST INCLUDE p=16F887 P16F887.. DESCRIPCION: . Se programa el tmr0 para que genere .configuración errorlevel -302 . CONTADOR CON DISPLAY DE SIETE SEGMENTOS . . USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms . _CP_OFF&_WDT_OFF&_XT_OSC .********************************************************************* . NOMBRE: p5a_1d. 3.Vector de RESET . repitiendo dicha acción 100 veces para obtener un segundo antes de realizar el incremento y cambiar el valor del display.00 .advertencia por cambio bancos . VERSION: 1. . FECHA: 21/06/2010 . Por último se vuelve a utilizar la misma configuración en el TMR0 pero con la técnica de multiplexación y los displays se van refrescando cada 20ms.Código de 7 segmentos de unidades ENDC .asm .Setea parámetros de .DIRECTIVAS .registro de unidades uni_cod .Listado del programa fuente en lenguaje ensamblador con comentarios en las líneas de código que considere fundamentales EJERCICIO # 1 .********************************************************************* .

w btfss STATUS.100 movwf contador .Carga el TMR0 con 217 .Decrementa el contador 100 veces goto Seguir .217 .INTERRUPCION decfsz contador.Repone flag del TMR0 RETFIE .100 movwf contador .INICIALIZACION BANKSEL PORTB .217 movwf TMR0 movlw .Programa TMR0 como temporizador movwf OPTION_REG .PROGRAMACION DEL TMR0 banksel OPTION_REG movlw b'00000111' .10 subwf unidades.Selecciona el Bank1 CLRF TRISB .PORTB configurado como salida .Retorno de interrupción MAIN .SETEO DE PUERTOS BANKSEL ANSEL CLRF ANSEL CLRF ANSELH BANKSEL TRISB .2 goto cont clrf unidades cont movlw .Nº de veces a repetir la interrupción .Cantidad de interrupciones a contar .cada 10mS."~.217" movwf TMR0 .Selecciona el Bank 0 CLRF PORTB clrf unidades .w movwf PORTB INCF unidades.w movwf PORTB INCF unidades.MOSTRAR CERO INICIAL clrw call tabla movwf uni_cod movf uni_cod.Activa la interrupción del TMR0 . todavía movf unidades.39" es el complemento a 256 .El valor calculado para cargar en TMR0 es de 217 con un preescaler .f Loop nop goto Loop .PROGRAMACION DE INTERUPCION movlw b'10100000' movwf INTCON .w .Repone el TMR0 con 217 bcf INTCON.T0IF .Valor decimal 217 .No.Repone el contador con 100 Seguir movlw .f .con preescaler de 256 . para obtener una interrupción .equivale a ". movlw .de 256 y a una frecuencia de 4MHz.Ya ocurrieron 100 int de 10ms (1000ms) call tabla movwf uni_cod movf uni_cod.f movlw .

. . .configuración errorlevel -302 .Vector de interrupción LIST INCLUDE p=16F887 P16F887.01 seg. Uno para unidades y otro para decenas. DESCRIPCION: . . .********************************************************************* .Define los SFRs y bits del .DIRECTIVAS . se repetirá 100 veces con el objeto de activar el conteo cada 1000 mS.******************************************************************** .********************************************************************* . . .00 .Use un reloj de 4MHz.INC . TABLA DE CONVERSION tabla ADDWF PCL.Cuenta 100 interrupciones unidades uni_cod decenas dec_cod ENDC . . VERSION: 1. PROGRAMADOR: Carlos Valdivieso . . . PARA INCREMENTAR SU VALOR CADA SEGUNDO DE 00-99 .bancos CBLOCK 0X020 contador . _CP_OFF&_WDT_OFF&_XT_OSC . . . . . CONTADOR DE DOS DIGITOS CON DISPLAY DE SIETE SEGMENTOS .en dos displays.PROGRAMA ORG 0x00 .Setea parámetros de .Deshabilita mensajes de . PCL + W -> W El PCL se incrementa con el valor de W proporcionando un salto Retorna con el código del 0 Retorna con el código del 1 Retorna con el código del 2 Retorna con el código del 3 Retorna con el código del 4 Retorna con el código del 5 Retorna con el código del 6 Retorna con el código del 7 Retorna con el código del 8 Retorna con el código del 9 Fin del programa fuente EJERCICIO # 2 . NOMBRE: p5b_2d.F RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW END 0x3F 0x06 0x5B 0x4F 0x66 0x6D 0x7D 0x07 0x7F 0x67 . . FECHA: 21/06/2010 .********************************************************************* .Se trata de incrementar un contador cada segundo y mostrar su valor . (10 mS) que .Vector de RESET GOTO MAIN ORG 0x04 .P16F887 __CONFIG _CONFIG1.programa para que genere una interrupción cada 0.********************************************************************* . . El tmr0 se .Tipo de microcontrolador .. USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms (10x100) .advertencia por cambio .asm .

10 subwf decenas.INICIALIZACION BANKSEL CLRF CLRF CLRF CLRF ANSEL ANSEL ANSELH TRISB TRISB TRISC .Retorno de interrupción MAIN .f .Cuenta espacios de 10ms goto Seguir .w btfss STATUS. Interrupcion movf unidades.w btfss STATUS.Repone flag del TMR0 movlw .PROGRAMACION DEL TMR0 banksel OPTION_REG movlw b'00000111' .Borra latch de salida de PORTC .39 retfie .GOTO Interrupcion .2 goto cont clrf decenas cont movlw .una interrupción cada 10mS.TMR0 como temporizador .w movwf PORTC decfsz contador.DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES . . Cálculo al final del ejercicio.PARA COMPLETAR 10x100=1000ms.PORTB configurado como salida .Borra latch de salida de PORTB .Aún.w movwf PORTB movf decenas.Va a rutina de interrupción .10 subwf unidades.217 movwf TMR0 .Ahora sí 10x100=1000ms=1seg movlw .100 movwf contador .f .T0IF .Selecciona el Bank0 .PORTC configurado como salida PORTB PORTB PORTC unidades decenas .preescaler de 256 y a una frecuencia de 4MHz.Selecciona el Bank1 .Repone el TMR0 con ~. no son 100 interrupciones INCF unidades.2 goto cont clrf unidades incf decenas movlw . para obtener .Precarga contador con 100 Seguir bcf INTCON.El valor calculado para cargar en TMR0 es de 217 con un .w call tabla movwf dec_cod movf dec_cod.SETEO DE PUERTOS BANKSEL CLRF CLRF BANKSEL CLRF CLRF .w call tabla movwf uni_cod movf uni_cod.

Retorna con el código del 6 . Retorna con el código del 5 .********************************************************************* . Retorna con el código del 1 .el conteo cada 1000 mS. Retorna con el código del 4 . Retorna con el código del 7 .Carga el TMR0 con 217 .en dos displays colocados en el puerto B usando la técnica de .Se trata de incrementar un contador cada segundo y mostrar su valor .00 .01 seg. (10 mS) que se repetirá 100 veces con el objeto de activar .Nº de veces a repetir la interrupción Loop nop goto Loop . . TABLA DE CONVERSION tabla ADDWF PCL.DIRECTIVAS LIST INCLUDE p=16F887 P16F887.Activa la interrupción del TMR0 movlw .Tipo de microcontrolador .100 .. Retorna con el código del 0 .refrescan cada 20ms. Los displays se .********************************************************************* . Uno para unidades y otro para decenas. CONTADOR DE DOS DIGITOS MULTIPLEXADO CON DISPLAY DE . Fin del programa fuente RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW END 0x3F 0x06 0x5B 0x4F 0x66 0x6D 0x7D 0x07 0x7F 0x67 EJERCICIO # 3 . PCL + W -> W .movwf BANKSEL movlw movwf OPTION_REG TMR0 . PROGRAMADOR: Carlos Valdivieso . El PCL se incrementa con el . El tmr0 se programa para que genere una interrupción .cada 0.217 TMR0 . Retorna con el código del 9 . multiplexación. Retorna con el código del 3 . VERSION: 1. DE 10ms (10x100) PARA INCREMENTAR SU VALOR CADA . salto .INC .F .Cantidad de interrupciones a contar movwf contador . valor de W proporcionando un . Retorna con el código del 8 . Use un reloj de 4MHz. Retorna con el código del 2 . SEGUNDO DE 00-99 .PROGRAMACION DE INTERRUPCION movlw b'10100000' movwf INTCON .Valor decimal 217 . SIETE SEGMENTOS USANDO EL TMR0 COMO BASE DE TIEMPO . NOMBRE: p5c_2dm.P16F887 .con preescaler de 256 .********************************************************************* . FECHA: 21/06/2010 .********************************************************************* .asm . DESCRIPCION: .Define los SFRs y bits del .

sel=1 refresca dig2 goto dig2 dig1 movf unidades.2 .Se mueve a si mismo para afectar bandera btfss STATUS.advertencia por cambio .DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES .w .Vector de interrupción GOTO Interrupcion .Va a rutina de interrupción .Ahora sí 10x100=1000ms=1seg movlw .f dec decfsz contador.f goto dec dig2 movf decenas.PROGRAMA ORG 0x00 .w call tabla movwf uni_cod movf uni_cod.Setea parámetros de .f . _CP_OFF&_WDT_OFF&_XT_OSC .w bsf PORTA.0 bsf PORTA.********************************************************************* .1 comf sel.Aún.Deshabilita mensajes de .PARA COMPLETAR 10x100=1000ms.__CONFIG _CONFIG1. no son 100 interrupciones INCF unidades.10 subwf unidades.Cuenta 100 interrupciones unidades uni_cod decenas dec_cod sel ENDC .w call tabla movwf dec_cod movf dec_cod.2 goto cont clrf unidades incf decenas movlw . Interrupcion movf sel.f .10 subwf decenas.1 movwf PORTB bcf PORTA.sel=0 refresca dig1.cuenta espacios de 10ms goto Seguir .2 .1 movwf PORTB bcf PORTA.w btfss STATUS.0 comf sel.Vector de RESET GOTO MAIN ORG 0x04 .configuración errorlevel -302 .w btfss STATUS.w bsf PORTA.0 bsf PORTA.bancos CBLOCK 0X020 contador .

con preescaler de 256 BANKSEL TMR0 .Borra latch de salida de PORTC .Carga el TMR0 con 217 . Retorna con el código del 1 . El PCL se incrementa con el .Repone el TMR0 con ~. salto .100 movwf contador Seguir bcf INTCON.Borra latch de salida de PORTB . Retorna con el código del 6 . TABLA DE CONVERSION--------------------------------------------------------tabla ADDWF PCL.100 .Cantidad de interrupciones a contar movwf contador .PROGRAMACION DEL TMR0 banksel OPTION_REG .Retorno de interrupción ANSEL ANSEL ANSELH TRISA TRISA TRISB .39 movwf TMR0 retfie MAIN .Selecciona el Bank1 . Retorna con el código del 5 .Carga contador con 100 .PORTB configurado como salida PORTA PORTA PORTB unidades decenas sel . Retorna con el código del 0 .Activa la interrupción del TMR0 movlw . valor de W proporcionando un .Nº de veces a repetir la interrupción Loop nop goto Loop .Repone flag del TMR0 .Selecciona el Bank0 .39 .217 .Selecciona el Bank0 movlw .Selecciona el Bank3 . Retorna con el código del 2 . Retorna con el código del 7 RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW 0x3F 0x06 0x5B 0x4F 0x66 0x6D 0x7D 0x07 .F . PCL + W -> W .PROGRAMACION DE INTERRUPCION movlw b'10100000' movwf INTCON . Retorna con el código del 4 .Valor decimal 217 movwf TMR0 .goto clrf cont cont decenas movlw .PORTA configurado como salida .T0IF movlw ~. Retorna con el código del 3 .SETEO DE PUERTOS BANKSEL CLRF CLRF BANKSEL CLRF CLRF .INICIALIZACION BANKSEL CLRF CLRF clrf clrf clrf .TMR0 como temporizador movwf OPTION_REG .Selecciona el Bank1 movlw b'00000111' .

Retorna con el código del 8 . Retorna con el código del 9 .. Fin del programa fuente 6.Copia impresa del circuito armado en PROTEUS para la simulación en el momento de su ejecución EJERCICIO # 1 .RETLW 0x7F RETLW 0x67 END .

EJERCICIO # 2 EJERCICIO # 3 .

además que se genera una interrupción con repetición de 100 veces con el fin de activar el conteo cada 1000ms. pero sólo encendemos el display1. El display2 permanece apagado.Recomendaciones • Se recomienda para esta práctica aplicar el método de multiplexación en el microcontrolador ya que reduce pines de entradas y salidas en displays de 7 segmentos porque de otra forma estos necesitarían de 8 pines de salida por cada dígito. se llevo a cabo el uso del mismo contador con el método de multiplexación que se detalla a continuación. y con programas más complejos se torna difícil mantener una compensación en los tiempos. Mediante la técnica de multiplexación lo que hacemos es enviar el dato correspondiente a los dos displays. este estado lo mantenemos durante un tiempo de 20ms en nuestra práctica. por lo tanto.. nos facilitó el trabajo a nosotros. porque se pierden numerosos recursos de memoria para manejar la multiplexación dentro del micro. solo que cada uno presentó una técnica distinta de implementación y mediante esto pudimos llegar a la conclusión que el método mejor empleado sería el de multiplexación. que fueron usados como contadores. es decir. y con mejor eficiencia.Conclusiones • En el ejercicio 2 utilizamos el puerto B configurado como unidades y el puerto C como decenas para mostrar a través de dos displays valores generados entre 0 y 99. • • . • • 8. No se recomienda para propósitos generales el uso de esta técnica. Como se observó en la presente práctica. la rutina tabla que se utilizó para presentar los datos por display nos permitió la conversión respectiva y resolver el problema de manera efectiva y estructurada.. Se recomienda utilizar subrutinas dentro de un programa para facilitar la resolución de la misma. Con esto podemos visualizar datos de más de 1 dígito. ahora bien podemos concluir que para aplicaciones es mejor usar una implementación más reducida.7. aunque presenta deficiencias para el uso de programas más complejos. Finalmente realizamos 4 circuitos con el mismo fin.

Ejercicio Extra .RES 1 unidades_horas .RES 1 decs_cod . NOMBRE: p5d_2dm.RES 1 unim_cod . RELOJ BINARIO .217 . FECHA: 21/06/2010 .********************************************************************* .RES 1 unih_cod .PRESIONA LA TECLA RA1 ATECLA1 BTFSC GOTO PORTA.6 LEDS del puerto B y para las horas 2 LEDS del puerto C.RES 1 endc ORG GOTO ORG GOTO 0x00 MAIN 0x04 Interrupcion . DESCRIPCION: .DIRECTIVAS LIST p=16F887 .RES 1 decenas_horas . para los minutos . ********************* RUTINA DE INTERRUPCION************************* INTERRUPCION .Cuenta hasta100 interrupciones temp_dh .P16F887 __CONFIG _CONFIG1.Va a rutina de interrupción .********************************************************************* .RES 1 . PROGRAMADOR: Carlos Valdivieso .Se trata de mostrar valores de segundos minutos y horas utilizando .asm .1 ATECLA4 .Deshabilita mensajes de .como DISPLAY para los segundos 6 LEDS del puerto A. . .Vector de interrupción .********************************************************************* .RES 1 unidades_minutos .Deberá simularlo a velocidad normal y a velocidad rápida para poder . . _CP_OFF&_WDT_OFF&_XT_OSC errorlevel N N1 N3 CNT ft -302 EQU EQU EQU EQU equ .advertencia por cambio . *************************** DEFINICIONES **************************** cblock 0x20 contador .RES 1 decm_cod .RES 1 dech_cod .RES 1 decenas . VERSION: 1.RES 1 sel .1 0CH .si apreta salta a LTECLA1 . .Define los SFRs y bits del .RES 1 unidades .bancos . Use un reloj de 4MHz.INC .00 .Tipo de microcontrolador INCLUDE P16F887.50 0DH .RES 1 decenas_minutos .observar el correcto funcionamiento.********************************************************************* .RES 1 unis_cod .

clrf unidades incf decenas movlw .10 unidades.cuenta espacios de 10ms .0 LTECLA4 .f Seguir .clrf unidades_horas incf decenas_horas movlw .si afloja salta a la siguiente parar_contador .clrf decenas .LTECLA1 INSTRUCCION BTFSS GOTO goto PORTA.SEGUNDOS INCF movlw subwf btfss goto MOVLW MOVWF unidades.2 goto cont MOVLW 0X00 MOVWF decenas_horas .RESET ATECLA4 LTECLA4 instruccion GOTO COMENZAR decfsz goto dec .si apreta salta a LTECLA2 .2 cont 0X00 unidades_minutos .10 unidades_minutos.2 cont 0X00 unidades_horas .w STATUS.f .1 LTECLA1 .w STATUS.2 subwf decenas_horas.MINUTOS INCF movlw subwf btfss goto MOVLW MOVWF unidades_minutos.0 COMENZAR PORTA.2 cont 0X00 unidades .w STATUS. no son 100 interrupciones RESETEAR BTFSC GOTO BTFSS GOTO PORTA.probar si usuario apreta tecla RA0 .clrf decenas_horas cont CALL MOSTRAR_HORA .10 unidades_horas.f .si afloja salta a la siguiente .Aún.w btfss STATUS.2 goto cont MOVLW 0X00 MOVWF decenas_minutos .HORA INCF movlw subwf btfss goto MOVLW MOVWF unidades_horas.f .clrf decenas_minutos .AQUI espera hasta que se afloje tecla .w btfss STATUS.6 subwf decenas_minutos.6 subwf decenas.Ahora sí 10x100=1000ms=1seg contador.2 goto cont MOVLW 0X00 MOVWF decenas .clrf unidades_minutos incf decenas_minutos movlw .AQUI espera hasta que se afloje tecla .w btfss STATUS.

T0IF ~. STATUS.CLRF MOVWF .RP0 STATUS.BANKSEL BCF BCF MOVWF .CLRF MOVLW MOVWF .movlw movwf Seguir bcf movlw movwf retfie .PORTb configurado como salida 0X00 TRISD TRISD .CLRF MOVLW MOVWF .RP1 0X00 ANSEL ANSEL 0X00 ANSELH ANSELH TRISC STATUS.RP0 STATUS.CLRF .CLRF .BANKSEL BCF BCF MOVLW MOVWF .39 .RP1 0X00 PORTA PORTA .INICIALIZACION .RP0 STATUS.100 contador INTCON. .CLRF .RP0 STATUS.CLRF MOVLW MOVWF .CLRF MOVWF .Carga contador con 100 . TRISA .RP0 STATUS.RP1 PORTB PORTB PORTC STATUS.BANKSEL BCF BCF MOVWF .CLRF MOVLW MOVWF .RP1 PORTD PORTD PORTE STATUS.RP1 PORTC PORTC PORTD STATUS.CLRF MOVWF .CLRF .*************************************************MAIN************************************************* MAIN .CLRF MOVLW MOVWF .PORTA configurado com I/O Digital PORTA .SETEO DE PUERTOS .Repone flag del TMR0 .PORTd configurado como salida 0X00 TRISE TRISE .Selecciona el Bank3 STATUS.Repone el TMR0 con ~.RP1 PORTE PORTE unidades unidades decenas decenas unidades_minutos unidades_minutos decenas_minutos ANSEL .BANKSEL BSF BSF MOVLW MOVWF .BANKSEL BCF BCF MOVWF .CLRF MOVWF PORTB STATUS.PORTc configurado como salida 0X00 TRISB TRISB .RP0 STATUS.39 TMR0 .RP0 STATUS.CLRF .BANKSEL BSF BCF MOVLW MOVWF .PORTE configurado como salida b'00000111' .BANKSEL BCF BCF MOVWF .Retorno de interrupción .RP1 0X00 TRISC TRISC .

Selecciona el Bank1 .delay1=2.*boton reset RESETEAR Loop .probar si usuario apreta tecla RA1 .PROGRAMACION DEL TMR0 .BANKSEL BCF BCF movlw movwf .0 mseg para una frecuencia de .Valor decimal 217 .se requiere TMR0=193 LZO1 BTFSS INTCON. MOVLW MOVWF CALL DECFSZ GOTO b'110' PORTE DELAY1 CNT.Cantidad de interrupciones a contar .RP0 STATUS.********************************************* RETURN************************************************ .CLRF MOVWF .AQUI espera hasta que se afloje tecla .Selecciona el Bank0 .si afloja salta a la siguiente instruccion .100 movwf contador Loop nop goto .1 LTECLA ALARMA PARAR_ALARMA .193 .Carga el TMR0 con 217 PORTA.cuando para el conteo parar_contador CALL ALARMA CALL PARAR_ALARMA GOTO ATECLA .CLRF MOVWF .*****************************************TONO******************************************************** ALARMA LZO3 250 hz.TMR0 como temporizador .N3=100 veces repite tono de 250Hz.banksel BSF BCF movlw movwf .RP1 .1 ATECLA PORTA.CLRF .Para una frecuencia audible de 250 Hz MOVWF TMR0 .RP0 STATUS.F LZO3 MOVLW MOVWF MOVLW MOVWF CALL N3 CNT B'110' PORTE DELAY1 .DELAY1 = 2MSEG DELAY1 MOVLW N MOVWF N1 LZO2 MOVLW . .con preescaler de 256 .CLRF MOVLW MOVWF .217 TMR0 . .T0IF .Nº de veces a repetir la interrupción CALL ALARMA CALL PARAR_ALARMA GOTO MAIN .RP1 b'00000111' OPTION_REG TMR0 STATUS.Activa la interrupción del TMR0 .PROGRAMACION DE INTERRUPCION PTMR0 movlw b'10100000' movwf INTCON movlw .Presiona la tecla para iniciar ATECLA LTECLA BTFSC GOTO BTFSS GOTO CALL CALL decenas_minutos unidades_horas unidades_horas decenas_horas decenas_horas 0X00 sel sel OPTION_REG STATUS.si apreta salta a LTECLA ..

GOTO BCF DECFSZ GOTO LZO1 INTCON. salto . Retorna con el código del 6 .T0IF N1.w call tabla movwf decm_cod swapf decm_cod.w .************************************************************************************************** PARAR_ALARMA BCF PORTE.0 BCF PORTE.F LZO2 .w movwf PORTC . Retorna con el código del 8 . Retorna con el código del 3 .MOSTRAR MINUTOS movf unidades_minutos.w addwf unih_cod. Retorna con el código del 9 RETLW B'00000000' RETLW B'00001000' RETLW B'00000100' RETLW B'00001100' RETLW B'00000010' RETLW B'00001010' RETLW B'00000110' RETLW B'00001110' RETLW B'00000001' RETLW B'00001001' . Retorna con el código del 0 . Retorna con el código del 2 .1 BCF PORTE.*******************************MOSTRAR HORAS EN LOS LEDS**************************** MOSTRAR_HORA . valor de W proporcionando un .F .w movwf sel SWAPF sel.w movwf PORTD .MOSTRAR SEGUNDOS movf unidades. Retorna con el código del 7 .w call tabla movwf decs_cod swapf decs_cod.Subrutina que apaga alarma movlw b'001' movwf PORTE NOP RETURN .w movwf sel SWAPF sel. Retorna con el código del 1 .w call tabla movwf unim_cod movf decenas_minutos.w call tabla movwf dech_cod swapf dech_cod.****************************RETURN TABLA DE CONVERSION************************** tabla ADDWF PCL.w movwf sel SWAPF sel. Retorna con el código del 4 .w call tabla movwf unih_cod movf decenas_horas.w addwf unim_cod.w call tabla movwf unis_cod movf decenas.MOSTRAR HORA movf unidades_horas. Retorna con el código del 5 . El PCL se incrementa con el .2 . PCL + W -> W .w addwf unis_cod.

movwf PORTB RETURN END .