Pedro Guerrero Amado.Marzo 2002 PRACTICA 8 SECUENCIA DE ENCENDIDO DE DIODOS LEDS USANDO DOS TABLAS DESCRIPCIÓN. En esta práctica usaremos el encendido alternativo de diodos leds usando dos tablas y un interruptor. El interruptor seleccionará la secuencia que queremos poner según esté activado o desactivado, es decir, trabajaremos con una tabla o con otra. PROGRAMA FUENTE. Las primeras instrucciones ya son conocidas. LIST P=PIC16F84 LIST C=132 #DEFINE banco1 bsf 0x03,5 #DEFINE banco0 bcf 0x03,5 ;DECLARACION REGISTROS Y VARIABLES include <registr.h> cont1 cont2 uno indice EQU 0xc EQU 0dh EQU 0xe EQU 0x0f ORG 0 GOTO inicio ; salvamos el vector de interrupción ORG 5 inicio banco1 ; seleccionamos banco 1 de registros CLRF trisb ; ponemos trisb a 0, puerta B como salidas MOVLW 0x1f MOVWF trisa ;ponemos a como entradas banco0 ; seleccionamos banco 0 En estas instrucciones, ponemos a cero las salidas, llamados a la rutina de retardo, y le movemos 0 a la variable índice, que será el índice de la tabla. principal CLRF portb ; ponemos todas las salidas a 0 CALL retardos MOVLW 0X0 MOVWF indice Pedro Guerrero Amado.Marzo 2002 En primer lugar comprobamos el valor del bit 0 de la puerta A. Si el es 0, no salta y ejecuta GOTO unos y llamamos a la tabla_1, si es 1 entonces salta y llamamos a tabla. A continuación sacamos a la puerta B el valor devuelto que lo tendremos en W. Después de un retardo cargamos el registro W con el valor 8. Una vez echo esto comparamos el valor de W con el índice con la instrucción XORWF (que activa el flag Z). Si el resultado de la operación es cero (índice es igual a 8) entonces el flag Z se pone a 1, que es lo que preguntamos nosotros a continuación, si el bit 2 del registro de ESTADO es 1 (flag Z). Si es así (índice=8, Z=1) entonces inicializamos el índice con las instrucciones que vienen a continuación, si no saltamos a incrementa y le sumamos 1 a índice y lo movemos a W que es el que usamos en la rutina de carga del dato de la tabla. buc_tab unos dos incrementa BTFSS porta, 0 GOTO unos CALL tabla GOTO dos CALL tabla_1 MOVWF portb CALL retardos MOVLW 0x8 ; XORWF indice,w BTFSS status, 2 GOTO incrementa MOVLW 0x00 MOVWF indice GOTO buc_tab INCf indice,f MOVF indice,w GOTO buc_tab ;comprobamos el bit 0 de la puerta a ;según el valor que tenga cogemos una tabla u otra ; llamada a la subrutina ; sacamos a B el valor devuelto ; por la tabla ;comparamos el índice con 8 ;vemos si es 0 el bit 2 de status ;si no es cero vamos a incrementar ;si es cero, inicializamos índice ;repetimos ;incrementamos el índice ;lo pasamos a W ; volvemos a tabla Las tablas que viene a continuación son las que vimos en la práctica 6 y ya vimos como funcionaban. ; tabla que enciende en binario los leds de 1 al 9 tabla ADDWF pc ,f ; le sumamos al PC el contenido de RETLW 1 ; indice y retormamos segun el valor RETLW 2 RETLW 3 RETLW 4 RETLW 5 RETLW 6 RETLW 7 RETLW 8 RETLW 9 Pedro Guerrero Amado.Marzo 2002 ;tabla que enciende el display del 1 al 9 tabla_1 ADDWF pc ,f RETLW 0x06 RETLW 0x5b RETLW 0x4f RETLW 0x66 RETLW 0x6d RETLW 0x7d RETLW 0x07 RETLW 0x7f RETLW 0x67 ; RUTINA DE RETARDO DE APROXIMADAMENTE 0.2sg * valor de uno retardos bucle MOVLW 0xff MOVWF cont1 MOVWF cont2 MOVLW 0x5 ; MOVWF uno DECFSZ cont1,f GOTO bucle DECFSZ cont2,f GOTO bucle ; DECFSZ uno,f GOTO bucle RETURN END ;MOVEMOS FF A W Y cargamos ;cont1 y cont2 con ff ; ;igual ;decrementamos cont1, si es 0 saltamos ;sino volvemos a bucles ;igual pero con cont2