Pedro Guerrero Amado.Marzo 2002 PRACTICA 6 ENCENDIDO DE LOS DIODOS LED Y DISPLAY USANDO UNA TABLA DESCRIPCIÓN. En esta práctica vamos a realizar el encendido alternativo de los diodos leds de la puerta B. Para ellos utilizaremos los valores almacenados en una tabla, y según el valor de dicha tabla, así se activarán las salidas. Usaremos la directiva include 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 A continuación usamos la directiva include. Esta directiva me indica que debemos incluir el contenido del fichero .h especificado o fichero de cabecera, o lo que es lo mismo para no escribir siempre lo mismo en la declaración de registros, lo hacemos en un fichero y usamos la directiva include que nos introduce el contenido de dicho fichero en nuestro programa fuente. include <registr.h> El contenido del fichero registr.h es el siguiente: porta EQU 0x05 portb EQU 0x06 trisa EQU 0x5 trisb EQU 0x6 status EQU 0x03 opcion EQU 0x01 pc EQU 0x02 pc1 EQU 0x0A tm0 EQU 0x1 w EQU 0 f EQU 1 Es decir la declaración de registros que hacemos siempre al inicio de los programas. Pedro Guerrero Amado.Marzo 2002 Seguidamente hacemos una declaración de variables en la que incluimos una nueva, indice que es la que nos contiene el índice de la tabla a la que queremos acceder. cont1 cont2 uno indice EQU 0xc EQU 0dh EQU 0xe EQU 0x0f Las instrucciones siguientes ya hemos explicado lo que hacen 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 principal CLRF portb ; ponemos todas las salidas a 0 CALL retardos MOVLW 0X0 MOVWF indice ; ponemos el índice a 0. El grupo de instrucciones que viene a continuación realiza lo siguiente: En primer lugar llamamos a la subrutina tabla_1 que lo que nos hace es cargarnos un valor en el registro W. A continuación lo movemos a la puerta B y hacemos un retardo. Le movemos a continuación 8 al registro W para hacerle la función OE Exclusiva con el índice, es decir, ver si el índice vale 8, si vale 8 la operación vale 0 y se activará el flag de cero. Según valga 0 o no, incrementaremos el registro de índice o lo inicializaremos a 0, para volver a llamar a la tabla_1 con el valor de índice. El valor de índice hay que cargarlo en el registro W. buc_tab CALL tabla_1 MOVWF portb CALL retardos MOVLW 0x8 ; XORWF indice,w BTFSS status, 2 GOTO incrementa MOVLW 0x00 MOVWF indice GOTO buc_tab ; llamada a la subrutina ; sacamos a B el valor devuelto ; por la tabla ;comparamos el indice con 8 ;vemos si es 0 el bit 2 de status ;si no es cero vamos a incrementar ;si es cero, inicializamos indice ;repetimos Pedro Guerrero Amado.Marzo 2002 incrementa INCf indice,f ;incrementamos el indice MOVF indice,w ;lo pasamos a W GOTO buc_tab ; volvemos a tabla Las tablas que viene a continuación son subrutinas cuya primera instrucción consiste en sumarle al contador de programa el valor del índice contenido en W. Según sea este valor saltará a una instrucción u otra y ejecutará RETLW X que retornará la subrutina con el valor X que cargará en W. Hemos definido un par de tablas, una con los valores del 1 al 9 y otra con los valores para sacar el valor de los diodos leds al display. ; 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 ;tabla que enciede 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