Displays 7 Segmentos

Cuando trabajamos con microcontroladores, siempre es interesante ponerles Displays para representar valores, en muchos casos utilizaremos los famosos displays de 7 segmentos, que nos permiten representar  cualquier dígito decimal de una manera muy sencilla, en este tutorial os enseñaremos como utilizarlos.

En primer lugar, vemos que el display consta de normalmente de 10 pines, 7 pines son para la representación del dígito, 1 será para el punto, y dos de alimentación o tierra, según sean de ánado común o cátado común, conceptos que explicaremos ahora:



Los términos ánado y cátodo vienen de los diodos leds, el ánodo es el positivo del diodo y el cátodo será el negativo, cuando decimos que el display es de ánodo común significa que los dos pines son el positivo de los diodos que el display lleva en su interior, por el contrario, cuando hablamos de cátodo común significa que estos dos pines son los pines negativos de los diodos que el display lleva en su interior.

Captura

De manera que para encender un led en un display de cátodo común habrá que poner en alto las salidas digitales de los pines que se corresponden con los dígitos y el punto, por el contrario, para encender un led en un display de ánodo común debemos poner en bajo las salidas digitales de los pines que se corresponden con los digitos y el punto.

Como es normal al ser diodos necesitan de resistencias para que no se quemen, pero donde las ponemos, en el cátodo o ánodo común, o en los pines que se corresponden con los dígitos o el punto, en ambos casos los leds se activarán, si las ponemos en los pines comunes requeriremos de 2 resistencias solamente, en el otro caso requeriremos de 8 resistencias, la ventaja de este último es que el brillo no variará en función de cuantos pines estén activos, en el primero cuanto mas pines estén activos el brillo será menor.

Una vez visto el funcionamiento y configuraciones de los displays de 7 segmentos pasaremos hacer un primer ejemplo en el que lo llevaremos del 0 al 9 automáticamente variando de dígito cada segundo, para empezar tenemos que ver a que corresponde cada pin del display, en los datasheet podremos encontrarlos en imágenes como esta:

Captura

Suponiendo que el dígito sea de cátodo común en primer lugar deberemos hacer una tabla, en la que los dígitos decimales se corresponda con las salidas digitales activas:

Captura

Si fuera de ánodo común, simplemente tendríamos que intercambiar los valor, los ceros serían 1 y viceversa.

Una vez hecho esto podemos pasar a programar:

//Programa para escribir automáticamente en el display 7 segmentos del 0 al 9 ciclicamente
//Hacemos la configuración inicial del programa
void setup() {
  //Declaramos los pines que vamos a usar como salidas digitales
  for(byte x=2; x<=8; x++){
    pinMode(x, OUTPUT);
  }
}
 
//Creamos una función display en la que pasamos como parametro el estado de las salidas digitales asociadas
void display(boolean a, boolean b, boolean c, boolean d , boolean e, boolean f, boolean g)
{
 
  digitalWrite (2,a);   
  digitalWrite (3,b);   
  digitalWrite (4,c);
  digitalWrite (5,d);
  digitalWrite (6,e);
  digitalWrite (7,f);
  digitalWrite (8,g);
 
}
 
void loop() {
  //Escribe el número 0
  display(0, 0, 0, 0, 0, 0, 1);
  delay(1000);
  //Escribe el número 1
  display(1, 0, 0, 1, 1, 1, 1);
  delay(1000);
  //Escribe el número 2
  display(0, 0, 1, 0, 0, 1, 0);
  delay(1000);
  //Escribe el número 3
  display(0, 0, 0, 0, 1, 1, 0);
  delay(1000);
  //Escribe el número 4
  display(1, 0, 0, 1, 1, 0, 0);
  delay(1000);
  //Escribe el número 5
  display(0, 1, 0, 0, 1, 0, 0);
  delay(1000);
  //Escribe el número 6
  display(0, 1, 0, 0, 0, 0, 0);
  delay(1000);
  //Escribe el número 7
  display(0, 0, 0, 1, 1, 1, 1);
  delay(1000);
  //Escribe el número 8
  display(0, 0, 0, 0, 0, 0, 0) ;
  delay(1000);
  //Escribe el número 9
  display(0, 0, 0, 0, 1, 0, 0);
  delay(1000);
}

Como se puede apreciar en nuestro ejemplo hemos invertido los valores ya que el display utilizado es de ánodo común. A continuación podemos ver un vídeo ejemplo de como quedaría el resultado final:

El funcionamiento es sencillo y no carece de dificultad, pero en la realidad la mayoría de representaciones numéricas no son de una sola cifra, sino de varías, si consumiéramos 7 pines por cada cifra a representar terminaríamos consumiendo un número excesivo de pines, por ello se recurre una configuración matricial.

Captura

Los pines que controlan las barritas de los 7 segmentos se comparten entre los diferentes dígitos y cada dígito consta de un pin que habilita su escritura. Esto nos permite ahorrar pines cuantos mas dígitos usemos, pero también complicará algo mas la programación, ya que no podemos escribir sobre todos los dígitos diferentes números a la vez, sino que que tenemos que habilitar un dígito escribir su valor numérico, apagar lo, y repetir el proceso con el siguiente dígito. Esto también trae como consecuencia que no podamos usar DELAYS en nuestro programa, ya que con el programa parado no podrá estar representado correctamente el valor numérico en el display.

Ahora veremos un ejemplo de programa para una matriz de dos dígitos que irá aumentando su valor automáticamente cada segundo;

//Programa para escribir automáticamente en el una matriz de dos dígitos
 
//En primer lugar declaramos las varibles que necesita el programa
 byte contador1; //Varible que gobierna la primera cifra
 byte contador2; //Varible que gobierna la segunda cifra
 long tiempo;    //Variable para gestionar el tiempo
 
//Hacemos la configuración inicial del programa
void setup() {
  //Declaramos los pines que vamos a usar como salidas digitales
  for(byte x=2; x<=10; x++){
    pinMode(x, OUTPUT);
  }
  //Definimos los valores iniciales de las variables del programa
 
  contador1=0;
  contador2=0;
  tiempo=0;
}
 
void loop() {
  //Este if dará un true cuando pase un segundo depues de haber escrito en el display
   if(tiempo+1000<millis()){
      tiempo=millis();
      contador1++;
      if(contador1==10){
         contador1=0;
         contador2++;
         if(contador2==10){
            contador2=0;
         }
      }
   }
digitalWrite(9, HIGH); 
escribir_display(contador1);
escribir_display(10);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
escribir_display(contador2);
escribir_display(10);
digitalWrite(10, LOW);
}
 
void escribir_display(byte n){
 
                        switch (n){
 
                          case 0:
                            display(0, 0, 0, 0, 0, 0, 1);
                           break;
 
                          case 1:
                            display(1, 0, 0, 1, 1, 1, 1);
                           break;
 
                          case 2:
                            display(0, 0, 1, 0, 0, 1, 0);
                           break;
 
                           case 3:
                            display(0, 0, 0, 0, 1, 1, 0);
                           break;
 
                           case 4:
                            display(1, 0, 0, 1, 1, 0, 0);
                           break;
 
                           case 5:
                            display(0, 1, 0, 0, 1, 0, 0);
                           break;
 
                           case 6:
                            display(0, 1, 0, 0, 0, 0, 0);
                           break;
 
                           case 7:
                            display(0, 0, 0, 1, 1, 1, 1);
                           break;
 
                           case 8:
                            display(0, 0, 0, 0, 0, 0, 0);
                           break;                          
 
                          case 9:
                            display(0, 0, 0, 0, 1, 0, 0);
                           break;
 
                          default:
                             display(1, 1, 1, 1, 1, 1, 1);
 
                        }
}
 
void display(boolean a, boolean b, boolean c, boolean d , boolean e, boolean f, boolean g)
{
  digitalWrite (2,a);   
  digitalWrite (3,b);   
  digitalWrite (4,c);
  digitalWrite (5,d);
  digitalWrite (6,e);
  digitalWrite (7,f);
  digitalWrite (8,g);
 
}

A continuación podéis ver un vídeo ejemplo de como quedaría el programa en la matriz de dígitos:

Espero que os haya gustado este tutorial sobre control de displays de 7 segmentos ahora os toca a vosotros continuar trabajando con ellos un buen ejercicio para continuar sería controlarlos a través de pulsador o para representar valores de un sensor.

Be the first to comment on "Displays 7 Segmentos"

Deja un comentario.

Tu dirección de correo no será publicada.


*


*