.: Programa de prueba para 4 display's
Volvamos a lo nuestro, y analicemos el programa por partes o en módulos, luego veremos si es necesario un diagrama de flujo...
Primero el encabezado con nuestro archivo .inc para hablar en términos de C, Z, W, F, etc. y la definición de variables...
;---------------Encabezado-------------------
LIST P=16F84
#include <P16F84luis.INC>
;-------- Variables a utilizar --------
ret1 equ 0x0d
ret2 equ 0x0e ; registros para retardos
rota equ 0x0f ; reg. para rotación (cambio de display)
disp1 equ 0x10 ; primer dato a mostrar
disp2 equ 0x11 ; segundo dato a mostrar
disp3 equ 0x12 ; tercer dato a mostrar
disp4 equ 0x13 ; cuarto dato a mostrar
Recuerda que lo que haremos será una secuencia de displays, por lo que es necesario una rutina de retardo, y será muy pequeña, algo como esto...
;------- RETARDO -------
retardo MOVLW 0x03
MOVWF ret1
dos MOVLW 0x6E
MOVWF ret2
uno NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ ret2,F
GOTO uno
DECFSZ ret1,F
GOTO dos
RETLW 0x00
No me voy a gastar explicando el retardo (tema visto anteriormente), sólo lo puse para tenerlo en cuenta, lo que sí rescato de aquí, es el uso de la instrucción NOP, que significa no hacer nada (aunque lo que estamos logrando es hacer tiempo). Una cosa más, los registros reg1 y reg2 son variables definidas anteriormente.
La configuración de puertos también será sencilla ya que ambos puertos serán de salida uno maneja los datos, y el otro selecciona cada display, entonces...
;-------Configuración de puertos-------
reset ORG 0x00
GOTO inicio
ORG 0x05
inicio BSF STATUS,RP0 ; configurando puertos
CLRF TRISA ; portA es salida
CLRF TRISB ; portB es salida
BCF STATUS,RP0
Habrás notado que en la definición de variables se incluyeron 4 registros llamados disp1, disp2, disp3 y disp4. Estos registros los vamos a utilizar para guardar el valor que se sumará al PCL en la tabla, de tal modo que tome el dato que queremos enviar al display, y como son 4 displays, pues utilizamos 4 registros y le cargamos con la dirección de esos 4 datos, así...
; ------- cargando direcc. de datos de la tabla -------
MOVLW 0x01
MOVWF disp1
MOVLW 0x02
MOVWF disp2
MOVLW 0x03
MOVWF disp3
MOVLW 0x04
MOVWF disp4
Y ahora la tabla, será muy pequeña, ya que sólo quiero mostrar mi nombre ;o))
;------- TABLA -------
tabla ADDWF PCL,F ; se incrementa el contador de programa
;display . gfedcba segmentos de los leds del display
NOP
RETLW B'00111000' ; código para la L
RETLW B'00111110' ; código para la U
RETLW B'00000110' ; código para la I
RETLW B'01101101' ; código para la S
Aquí también incluí un NOP, para pasar por encima, cuando el programa venga a buscar el primer dato, y así no empezamos desde cero.
Ahora viene lo más importante, el código principal del programa.
Primero borramos el Puerto_A para desactivar todos los transistores (apagar los displays) y luego continuamos con el código.
Hay por allí, un registro llamado "rota", que lo vamos a utilizar en el siguiente código para activar los transistores que están conectados a PORTA, de tal modo de seleccionar el display que vamos a encender, puesto que son 4, lo vamos a cargar con "00001000" ó 0x08 para seleccionar uno de los displays, y luego lo haremos rotar, para seleccionar los tres restantes. En la siguiente línea, hacemos que el FSR apunte al primer registro disp1, y nos preparamos para enviar datos al Display, todo esto en las primeras 4 líneas...
; ----------- apaga transistores ----------
CLRF PORTA
; ----------- PROG. PPAL ----------
ini MOVLW 0x08
MOVWF rota ; rota= '00001000'
MOVLW disp1
MOVWF FSR ; CARGA FSR CON LA DIRECC. DE disp1
display MOVLW 0x00
MOVWF PORTB ; PORTB=00000000
MOVF rota,W
MOVWF PORTA ; PORTA= 00001000
MOVF INDF,W ; lee dato al que apunta FSR (o sea disp1)
CALL tabla ; llama a la tabla
MOVWF PORTB ; pasa el dato al puerto B
CALL retardo ; llama miniretardo
BTFSC rota,0 ; rota = 00000000 ???
GOTO ini ; si es así, se vio todo, reinicia
BCF STATUS,C ; carry = 0 (para no afectar rotaciones)
RRF rota,F ; rota display
INCF FSR,F ; apunta al siguiente disp_X
GOTO display
En las dos primeras líneas de la etiqueta display enviamos 00000000 a PORTB (puesto que los display's son de cátodo común, los 4 estarán apagados), y luego seleccionamos el transistor del display de la izquierda, esto lo hacemos poniendo 00001000 en PORTA.
Recuerda que el FSR apuntaba a disp1, y como ya sabemos, INDF también, y cuando leamos INDF, estaremos leyendo disp1, luego lo pasamos a W, para seguidamente llamar a la tabla, tomar el dato y mostrarlo en el display seleccionado. Como disp1=1 estaremos tomando el código para la letra L de la tabla, y lo estaremos enviando al display de la izquierda.
Bien, ahora hacemos un miniretardo, y al regresar, preguntamos si se terminó de rotar, como recién comenzamos..., aún falta..., Ahora bien, por una cuestión de precaución borramos el Carry del registro STATUS, así no se afecta la rotación, de lo contrario cuando terminemos de rotar aparecerán cosas raras como un uno demás, así que lo borramos y hacemos la rotación a la derecha del registro rota, luego incrementamos el FSR (para que apunte al registro disp2) y regresamos a display
veamos como están las cosas, rota=00000100, FSR=disp2=INDF, ok, eso significa que ahora, con rota seleccionamos el siguiente display, cuando tomemos el dato de INDF, estaremos tomando el dato de disp2, y de la tabla tomaremos el código para la letra U, haremos un retardo, verificamos la rotación y si no terminó, seguiremos rotando, incrementamos el FSR para ir por el siguiente dato, y repetimos el ciclo.
Esta vez rota=00000010, FSR=disp3=INDF, es decir que esta vez mostraremos la I, y seguiremos así hasta mostrar la S, cuando esto ocurra, y lleguemos a la pregunta de si terminó la rotación, nos daremos con que SÍ, y entonces saltaremos a ini, para repetir la secuencia de displays.
Wowwww...!!!, terminamooooos...!!!, parecía que sería más extenso, pero no, claro que este programita, es con la intención de mostrar usos y aplicaciones del micro, cada uno sabrá la utilidad que le dará, y para que lo pongan a prueba, les dejo el programa completo...
R-Luis...
<--Anterior
Introducción
Siguiente -->
Tabla de Referencias
|