.: Código para el Control del Display sin Decodificador
En el encabezado incluimos nuestro ARCHIVO.INC y como variables incorporamos reg1, reg2 y reg3 para el retardo, más la variable cont que controlará la cuenta para incrementar el PCL por medio de W.
En la configuración de puertos, habilitamos PORTB como salida, y comenzamos con la programación.
;---------------Encabezado-------------
LIST P=16F84
#include <P16F84luis.INC>
;----------- Variables utilizadas ----------
reg1 equ 0x0D ; 3 registros para el retardo
reg2 equ 0x0E
reg3 equ 0x0F
cont equ 0x10
;---------Configuración de puertos----------
ORG 0x00
GOTO inicio
ORG 0x04
ORG 0X05
inicio BSF STATUS,RP0 ; configurando puertos
CLRF TRISB ; PORTB = SALIDA
BCF STATUS,RP0
;------------- Programa Principal ----------
reini CLRF cont ; pone el contador a 0
MOVF cont,W ; pasa el contador a w (índice)
CALL tabla ; llama a la tabla
MOVWF PORTB ; pasa el dato obtenido a PORTB
CALL retardo
disp_ MOVF cont,W
XORLW B'1001' ; verifica si el contador llegó a 9
BTFSC STATUS,Z ; si no es así salta una línea
GOTO reini ; si llegó a 9 lo atiende en reini
INCF cont,F ; incrementa el contador
MOVF cont,W ; pasa el contador a w (índice)
CALL tabla ; llama a la tabla
MOVWF PORTB ; pasa el dato obtenido en la tabla a PORTB
CALL retardo
GOTO disp_
;--------------- Tabla --------------------
tabla ADDWF PCL,F ; se incrementa el contador de programa
;display . gfedcba segmentos de los leds del display
RETLW B'01101101' ; código para el 5
RETLW B'01100110' ; código para el 4
RETLW B'01001111' ; código para el 3
RETLW B'01011011' ; código para el 2
RETLW B'00000110' ; código para el 1
RETLW B'00111111' ; código para el 0
RETLW B'00111000' ; código para el L
RETLW B'00111110' ; código para el U
RETLW B'00000110' ; código para el I
RETLW B'11101101' ; código para el S.
;-----------Rutina de Retardo-----------
retardo movlw 30 ; Aquí se cargan los registros
movwf reg1 ; reg1, reg2 y reg3
tres movlw 20 ; con los valores 30, 20 y 35
movwf reg2
dos movlw 35
movwf reg3
uno decfsz reg3,1 ; Aquí se comienza a decrementar
goto uno
decfsz reg2,1
goto dos
decfsz reg1,1
goto tres
retlw 00 ; regresare del retardo
;------------------------------------------
END
;------------------------------------------
|
|
.: Descripción
Vamos por el programa principal...
reini CLRF cont ; pone el contador a 0
MOVF cont,W ; pasa el contador a w (índice)
CALL tabla ; llama a la tabla
MOVWF PORTB ; pasa el dato obtenido a PORTB
CALL retardo
En la primer línea, ponemos el contador a cero, en la segunda, lo pasamos al registro W, es decir W=00000000 y nos vamos con este valor a la tabla, veamos que ocurrirá allí...
tabla ADDWF PCL,F ; se incrementa el contador de programa
;display . gfedcba segmentos de los leds del display
RETLW B'01101101' ; código para el 5
ADDWF PCL,F es sumarle al PCL lo que trae W, y como W=00000000, pues PCL seguirá siendo igual a PCL, y pasará a la siguiente instrucción...
RETLW B'01101101', recuerda que la línea de comentario no es tenida en cuenta. En esta línea, se carga w con 01101101, y como se trata de una instrucción de retorno, regresa al lugar de donde vino, es decir a...
MOVWF PORTB ; pasa el dato obtenido a PORTB
CALL retardo
Aquí se pasa el valor de W a PORTB y se visualiza 5 en el Display, luego se hace un retardo, y cuando termina...
disp_ MOVF cont,W
XORLW B'1001' ; verifica si el contador llegó a 9
BTFSC STATUS,Z ; si no es así salta una línea
GOTO reini ; si llegó a 9 lo atiende en reini
INCF cont,F ; incrementa el contador
MOVF cont,W ; pasa el contador a w (índice)
CALL tabla ; llama a la tabla
Cargamos W con lo que hay en el contador, y luego, lo que nos toca hacer, es averiguar si ya se mostraron todos los valores que figuran en la tabla, para eso utilizamos la instrucción de comparación XORLW con 9 en binario (00001001) puesto que son 10 los elementos de la tabla (del elemento 0 al elemento 9), la instrucción XORLW ya la vimos anteriormente, pero sirve recordarla.
Piensa que si el contador está en 1001 (9), ya mostró todos los elementos de la tabla, y la comparación XORLW dará como resultado 00000000 y la bandera de cero (Z) del registro STATUS se pondrá en 1, de lo contrario permanecerá en 0, ahora viene la pregunta...
BTFSC STATUS,Z
Está en cero la bandera Z del registro STATUS...?, si es así, aún faltan elementos por mostrar, entonces salta una línea, y allí...
INCF cont,F ; incrementa el contador
MOVF cont,W ; pasa el contador a w (índice)
CALL tabla ; llama a la tabla
Y este trozo de código se repetirá hasta que se muestren todos los elementos.
Bien. Suponte ahora, que la cuenta ya terminó, y se mostraron todos los elementos, eso significa que "cont=1001", cuando llegue a la comparación (XORLW) el resultado SÍ dará 00000000, la bandera Z se pondrá en 1, y cuando llegues a la pregunta...
BTFSC STATUS,Z
Está en cero la bandera Z del registro STATUS...?, la respuesta será NO, por lo tanto se mostraron todos los elementos de la tabla, y no se realizará el salto, es decir que pasará a...
GOTO reini
y bueno, allí comenzará todo de nuevo...
Bien mis queridos amigos, espero que les haya servido de ayuda este tutorial, yo lo hice con algo sencillo, para que puedan interpretar la forma de trabajar con estos dispositivos. Imagino que mas de uno, tiene proyectos en los cuales puede incorporarlo, o tiene las intenciones de desarrollar uno nuevo con todos estos chiches, que más da, ahora queda en sus manos, por lo pronto yo me iré a jugar al Mythology, jejeje
BYE...!!!
R-Luis...
<--Anterior
Introducción
Siguiente -->
Tabla de Referencias
|