Página de inicio Mi Correo






   » Foro
   » Nuevo Foro
   » Mi Correo
   » Mis Actividades...


--- Novedades ---



    
  » Microcontroladores » Display y Tablas (8 de 9)  

.: 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 -->
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Tabla de Referencias


    
--| |--