Robots Móviles
Software y documentación para robots móviles

Display de 7 segmentos

En el presente documento se describe cómo conectar un display de 7 segmentos (en realidad de 8 como ahora veremos) a un microcontrolador MC68HC11 a través del puerto B. También se ofrecen un conjunto de rutinas en ensamblador y macros para visualizar caracteres alfabéticos y numéricos.

[ Display conectado al robot Gustavo ]

Materiales

Para el montaje vamos a utilizar un display fácilmente localizable en tiendas de electrónica como es el TDSL5160 pero cualquier otro de de características similares nos puede servir para nuestros propósitos.

Un display de este tipo está compuesto por siete u ocho leds de diferentes formas especiales y dispuestos sobre una base de manera que puedan representarse todos los símbolos numéricos y algunas letras. Los primeros siete segmentos son los encargados de formar el símbolo y con el octavo podemos encender y apagar el punto decimal.

[ Gráfico del display ]

Entonces al tratarse de simples leds necesitaremos además tantas resistencias de unos 330 ohmios como leds queramos utilizar, en nuestro caso ocho, un conector macho de 10 pines en dos filas y placa perforada sobre la que montaremos el resto de los componentes. Se puede variar el valor de las resistencias para conseguir un mayor o menor brillo en los leds. Además, utilizaremos también, un cable de 10 hilos con dos terminales hembra debidamente construido para conectar la nueva placa a la del microcontrolador.

Esquema

Anteriormente se ha comentado que el display que se va a utilizar es de cátodo común, esto significa que todos los cátodos de los leds están conectados, alimentaremos cada led por separado por su correspondiente ánodo.

También existen displays de ánodo común, éstos son similares a los que vamos a utilizar en nuestro montaje con la salvedad de que las conexiones a alimentación y masa serían al revés.

La correspondencia de los pines y cada uno de los leds del display puede verse en la siguiente figura:

[ Correspondencia de los pines ]

Los pines 3 y 8 corresponden con el cátodo de los leds (son los situados en el centro de las dos filas de pines), para el resto se sigue el criterio mostrado en la tabla. Por ejemplo, si alimentamos el display por el pin 2 (utlizando una de las resistencias comentadas) y unimos el pin 3 o el 8 a masa, se encenderá el segmento inferior (marcado como d en la figura). Si alimentamos por el pin 5 lo que encenderemos será el punto decimal indicado como en la figura DP (del inglés Dot Point).

[ Display de 7 segmentos entre dos GP2D12 ]

En primer lugar soldaremos el conector a la placa (la utilizada se ha cortado a un tamaño de 16x13 agujeros) debidamente centrada, las resistencias y el display y realizaremos las conexiones entre el conector y el display. La masa del conector del puerto B se encuentra en el pin 6 (justo en la esquina diagonal del pin 1 marcado por la flecha) debe llevarse hasta uno de los cátodos del display (por ejemplo, el pin 8 que se encuentra más cerca). El resto de los pines controlables desde el micro se podrá realizar, por simple sencillez en el montaje, de la siguiente forma:

Pin del Puerto B
Pin del Display
Segmento
0 ($01)
9
f, superior izquierda
1 ($02)
10
g, central
2 ($04)
6
b, superior derecha
3 ($08)
7
a, superior
4 ($10)
5
DP, punto decimal
5 ($20)
4
c, inferior derecha
6 ($40)
2
d, inferior
7 ($80)
1
e, inferior izquierda

Al tratarse de un display de cátodo común, cada vez que activemos, es decir, pongamos a '1' lógico, uno de los bits de salida del puerto B, encenderemos el led correspondiente en el display. Nótese que si hubiesemos utilizado un display de ánodo común, el conexionado y la forma de operación serían diferentes. En nuestro caso, la correspondencia entre pines del puerto B y el led del display queda como la de la figura.

[ Correspondencia de los pines ]

Programación

La programación es tremendamente sencilla dado el puerto utilizado: todos sus bits son de salida y no hace falta ningún tipo de configuración previa especial, simplemente modificamos el valor correspondiente del led que queremos encender o apagar.

El siguiente programa enciende todos los segmentos exteriores del display uno tras otro y en orden, en sentido horario. Se utiliza la biblioteca wait.inc para realizar una pausa entre leds.


* -----------------------------------------------------------------------
* display2.asm
*
* Programa de prueba del display de 7 segmentos conectado al puerto B
* -----------------------------------------------------------------------

* -----------------------------------------------------------------------
* Símbolos
* -----------------------------------------------------------------------

PORTB	EQU $04 		; Dirección del puerto B

DISP_A	EQU $08 		; Segmento superior
DISP_B	EQU $04 		; Segmento superior derecho
DISP_C	EQU $20 		; Segmento inferior derecho
DISP_D	EQU $40 		; Segmento inferior
DISP_E	EQU $80 		; Segmento inferior izquierdo
DISP_F	EQU $01 		; Segmento superior izquierdo
DISP_G	EQU $02 		; Segmento central
DISP_DP EQU $10 		; Punto decimal

* -----------------------------------------------------------------------
* Programa
* -----------------------------------------------------------------------

	ORG $0000		; Programa en RAM interna

inicio	LDAA #DISP_A		; Enciende el segmento superior
	STAA PORTB,X
	BSR f_wait

	LDAA #DISP_B		; Enciende el segmento superior derecho
	STAA PORTB,X
	BSR f_wait

	LDAA #DISP_C		; Enciende el segmento inferior derecho
	STAA PORTB,X
	BSR f_wait

	LDAA #DISP_D		; Enciende el segmento inferior
	STAA PORTB,X
	BSR f_wait

	LDAA #DISP_E		; Enciende el segmento inferior izquierdo
	STAA PORTB,X
	BSR f_wait

	LDAA #DISP_F		; Enciende el segmento inferior derecho
	STAA PORTB,X
	BSR f_wait

;	LDAA #DISP_G		; Enciende el segmento central
;	STAA PORTB,X
;	BSR f_wait

;	LDAA #DISP_DP		; Enciende el punto decimal
;	STAA PORTB,X
;	BSR f_wait

	BRA inicio

* -----------------------------------------------------------------------
* Biblioteca de pausa
* -----------------------------------------------------------------------

	include wait.inc	  ; Carga la biblioteca de pausa

	END

El segundo programa muestra en orden todos los diígitos hexadecimales desde el 0 hasta la F. Para ello, hemos calculado el byte que debe enviarse por el puerto para encender simultáneamente los leds que nos interesen para conseguir el carácter deseado. Por ejemplo, para representar el carácter 4, siguiendo la tabla anterior, deben encenderse el segmento superior izquierdo (segmento f, $01), el segmento superior derecho (segmento b, $04), el segmento central (segmento g, $02) y el segmento inferior derecho (segmento c, $20), relizando un 'OR' entre todos los valores nos da como resultado $27, que es lo que enviaremos al display.


* -----------------------------------------------------------------------
* display3.asm
*
* Programa de prueba del display de 7 segmentos conectado al puerto B
* con el que se visualizan los 16 caracteres hexadecimales
* -----------------------------------------------------------------------

* -----------------------------------------------------------------------
* Símbolos
* -----------------------------------------------------------------------

PORTB	EQU $04 		; Dirección del puerto B

DISP_0	EQU $ED			; Carácter 0
DISP_1	EQU $24			; Carácter 1
DISP_2	EQU $CE			; Carácter 2
DISP_3	EQU $6E			; Carácter 3
DISP_4	EQU $27			; Carácter 4
DISP_5	EQU $6B			; Carácter 5
DISP_6	EQU $EB			; Carácter 6
DISP_7	EQU $2C			; Carácter 7
DISP_8	EQU $EF			; Carácter 8
DISP_9	EQU $6F			; Carácter 9

DISP_DP EQU $10			; Punto decimal

DISP_A	EQU $AF			; Carácter A
DISP_B	EQU $E3			; Carácter b
DISP_C	EQU $C9			; Carácter C
DISP_D	EQU $E6			; Carácter d
DISP_E	EQU $CB			; Carácter E
DISP_F	EQU $8B			; Carácter F

* -----------------------------------------------------------------------
* Programa
* -----------------------------------------------------------------------

	ORG $0000		; Programa en RAM interna

inicio	LDAA #DISP_0
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_1
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_2
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_3
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_4
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_5
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_6
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_7
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_8
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_9
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_DP
	STAA PORTB,X
	BSR pausa

alfa	LDAA #DISP_A
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_B
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_C
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_D
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_E
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_F
	STAA PORTB,X
	BSR pausa

	LDAA #DISP_DP
	STAA PORTB,X
	BSR pausa

	BRA inicio

* -----------------------------------------------------------------------
* Subrutina para hacer una pausa doble
* -----------------------------------------------------------------------

pausa	BSR f_wait
	BSR f_wait
	RTS

* -----------------------------------------------------------------------
* Biblioteca de pausa
* -----------------------------------------------------------------------

	include ..\wait.inc

	END

También puede accederse al código fuente en ensamblador directamente desde estos enlaces: display2.asm, display3.asm y wait.inc. Los primeros son los programas de prueba y el tercero es un fichero include para pausas. Esta facilidad de ficheros include sólo puede utilizarse desde el ensamblador Ras, si se utiliza otro programa ensamblador siempre puede incluirse a mano desde el editor.

Conclusiones

Como hemos visto, la conexión de un display de 7 segmentos a través de un puerto del MC68HC11 no presenta demasiada complejidad, puede decirse que es más un ejercicio de soldadura que de programación o diseño electrónico.

Lo que es en sí la visualización es excelente, jugando con los valores de las resistencias (en nuestro caso de 330 ohmios) y sin sobrepasar las recomendaciones del fabricante, podemos dar más brillo a los leds.

En cambio, presenta serias limitaciones en cuanto a la visualización de caracteres ya que con un único display no pueden representarse todos los caracteres alfanuméricos (por ejemplo, la M, la Z o la Ñ) y hay caracteres que tienen la misma representación (el 9 no se diferencia en nada de una g, el 5 de una S, etc.). Cuando se precise de un mayor conjunto de caracteres a visualizar e incluso de forma simultánea, por un pequeño incremento de dinero en el total del montaje podemos pasar a un LCD alfanumérico de 16 caracteres en dos filas.

En el web de Microbótica puede encontrarse información de los distintos modos de conexionado y programación de un LCD a un MC68HC11; en el de Fernando Remiro hay información adicional para su uso con PIC. Próximamente en este mismo web se ofrecerán otras alternativas de conexionado.

A modo de resumen, el uso de displays de 7 segmentos puede ser muy apropiado cuando queramos ver de lejos algún tipo de indicación de lo que está haciendo internamente nuestro robot autónomo en cada momento. Por ejemplo, si el sistema de control del robot tiene diferentes modos de funcionamiento, un display es una forma elegante de anunciar el modo en el que se encuentra, aunque hay otro tipo de soluciones más económicas que también pueden servir, como pueden ser uno o más leds (como ejemplo, véase la placa de depuración).


© Javier de Lope Asiaín 2000-2002
Última modificación
01-Nov-2001

FastCounter by bCentral