Jugando con displays de 7 segmentos

Los displays de 7 segmentos nos permiten mostrar información numérica y alfabética de forma muy eficaz, con gran impacto visual y mucho más fácil de lo que puede parecer en un principio.


Displays de 7 segmentos

Cada display de 7 segmentos está formado realmente por 8 leds, ya que además de cada una de las barritas que forman el dígito numérico, hay un led adicional para el punto decimal.

Cada segmento se suele nombrar con una letra, según el siguiente diagrama:

En esta figura observamos que podemos encontrar dos configuraciones distintas de displays de 7 segmentos, que siendo idénticos externamente, son completamente distintos eléctricamente:

  • displays de ánodo común: en este caso la parte común de los 8 leds es el ánodo, por lo que habrá que alimentar el display de 7 segmentos con tensión positiva y encender cada segmento tirando a masa su pin correspondiente.
  • displays de cátodo común: en este caso la parte común de los 8 leds es el cátodo, por lo que habrá que tirar a masa el punto común, y alimentar cada segmento con tensión por su pin correspondiente.

El pinout de los displays de 7 segmentos es el siguiente:

(Obviamente habrá que poner GND en los pines 3 y 8 en el caso de ser cátodo común)

Utilizando displays de 7 segmentos con SAA1064

Una alternativa rápida y fácil para gestionar hasta 4 displays de 7 segmentos es utilizar un chip específicamente diseñado para tal fin, que podemos controlar mediante protocolo I2C. Este chip es el SAA1064 que podemos conectar como sigue:

Este chip tiene distintas opciones de configuración que permiten entre otras funciones regular la intensidad de cada display, el nº de displays a conectar y dirección de funcionamiento. Para ampliar más información lo mejor es recurrir a su datasheet: SAA1064.pdf

Y bien, para facilitar su integración con un PIC, el amigo vsZener diseñó una librería en CCS que yo mismo amplié para poder utilizar toda la potencia del printf sobre una serie de displays de 7 segmentos.

Esta librería está disponible en la zona de descargas, en ejemplos de código fuente en CCS.

Utilizar esta librería es muy fácil, como demuestra el siguiente código:

////////////////////////////////////////////////////////////////////////////////////
//       Nocturno'07
//
// Ejemplo de uso de SAA1064 con librería vs_saa1064M.c de vsZENER
// ampliada para utilización de PrintF
//
// Dispositivo: PIC 16F876A   Compilador:  CCS vs3.242
//
//     Conexiones:  B0 -> SDA saa1064
//          B1 -> SCL saa1064
//
//////////////////////////////////////////////////////////////////////////////////
#include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
#use delay (clock=4000000)
#define SAA1064_DINAMICO
#define SAA1064_SCL PIN_B1
#define SAA1064_SDA PIN_B0
#include <vs_saa1064M.c>
#define Tamano 51
char frase[Tamano]="Hola TodoPIC 0123456789 ABCDEFGHIJLMOPQRSTUVYZ    ";
char cadena[4];
int posicion=0;
void main(void)
{
saa1064_init(SAA_ADR_VDD);
saa1064_conf(SAA_DINAMICO + SAA_DIG1_3_ON + SAA_DIG2_4_ON + SAA_MODONORMAL + SAA_3mA);
printf (saa1064,"HOLA");
delay_ms(1000);
while (1) {
printf (saa1064,"%c%c%c%c",frase[posicion],frase[posicion+1],frase[posicion+2],frase[posicion+3]);
delay_ms(400);
posicion++;
if (posicion==(Tamano-4))
{posicion=0;
delay_ms(1000);
}
}
}

Y aquí un vídeo del resultado:

Utilizando displays de 7 segmentos con PIC

Conectar un display de 7 segmentos a un PIC es tarea sencilla; son 8 pines y se puede utilizar un puerto completo del PIC para gestionarlo. De esta manera, enviando un bit alto o bajo a cada pin podemos encender o apagar cada segmento.

Si queremos utilizar un segundo display, podemos utilizar un segundo puerto del PIC y utilizarlo como el primero, aunque no es un método demasiado eficiente. Lo ideal en estos casos es aprovecharnos de que la velocidad de nuestra retina es más lenta que el PIC y alternar la información que se envía a los displays multiplexando la salida del puerto.

Para ello, y suponiendo que utilizamos displays de cátodo común (sería inverso para ánodo común), podemos alimentar ambos displays a través de sendos transistores (BC337 por ejemplo) que estarán gobernados por un pin del PIC cada uno. De esta manera, sólo consumimos los 8 pines del puerto +  los dos pines de los transistores = 10 pines para 2 displays.

Esta técnica nos permitirá también encender 4 displays con sólo 12 pines donde realmente ya se nota ahorro. A medida que aumentamos el nº de displays, disminuye su potencia lumínica porque los leds permanecen menos tiempo encendidos. De todas formas, trabajando con 4 displays la luminosidad es suficiente.

Además, como los pulsos son muy cortos y de un 25% del tiempo, podemos permitirnos el lujo de no poner resistencias a los leds, enganchándolos directamente a los pines del micro y todo funciona perfectamente.

Y como el movimiento se demuestra andando, he diseñado un programa en CCS para 16F876 que emula directamente el comportamiento de un SAA1064. Tanto es así que si sustituimos el cliente SAA1064 por el PIC 16F876 y probamos con otro PIC como máster con el código que pegué más arriba, el resulltado será exactamente el del vídeo.

Este nuevo programa lo podéis descargar en la zona de Descargas, en Ejemplos de CCS.

Espero que el artículo pueda ser útil a alguien y me encantará leer vuestras opiniones en el foro.

Share