Manejar un display 7 segmentos

Un display 7 segmentos es nada mas que 7 LED encapsulados formando un 8, de modo que es posible lograr mostrar los dígitos 0~9. También se encuentran encapsulados de 2, 3 y 4 dígitos. Algunos llevan un octavo LED para representar el punto decimal. De modo que para manejar un dígito se requieren los 7 elementos que normalmente son nombrados con letras a, b, c, d, e, f y g, ademas un pin común a todos los LED que puede ser ánodo común o cátodo común. Si tiene punto decimal este normalmente se nombra como DP.

Display 7 segmentos

1. Circuito propuesto

Ya que el circuito electrónico es mas complejo y hay bastantes opciones de equivocarse, les recomiendo avanzar paso a paso y no pasar al siguiente paso si no lograron el anterior.

Manejar un display 7 segmentos

2. Componentes

Los componentes son muy simples.

  1. Arduino UNO
  2. Display 7 segmentos de cátodo común
  3. 7 resistencia 330 ohms
  4. 7448 (solución 3)

Como practica podrías intentar hacer funcionar un display de ánodo común.

3. Código Arduino

Con este código pretendemos comprobar que las conexiones electrónicas son las correctas. Lo que deberías lograr ver aquí es que cada uno de los 7 segmentos se van prendiendo en secuencia y en orden (a, b, c...), al terminar el ciclo hay una pausa de 2 seg antes de volverla a repetir.

void setup(){
   pinMode(7, OUTPUT);  //g
   pinMode(8, OUTPUT);  //f
   pinMode(9, OUTPUT);  //e
   pinMode(10, OUTPUT); //d
   pinMode(11, OUTPUT); //c
   pinMode(12, OUTPUT); //b
   pinMode(13, OUTPUT); //a
}

void loop(){
   for (byte i=13; i>=7; i--){
      digitalWrite(i, HIGH);
      delay(500);
      digitalWrite(i, LOW);
   }
   delay(2000);
}

Si alguno de los segmentos no prende o el orden de la secuencia no es el correcto debes revisar el cableado correspondiente.

4. Solución 1

Ahora que tenemos todos los segmentos funcionando adecuadamente daremos un paso adelanto para mostrar números entre 0 y 9. En esta primera oportunidad en secuencia con un intervalo de 0.5 segundo y al final u na pausa de 1 segundo.

const byte dig[10][7]={
   {1,1,1,1,1,1,0},   //0
   {0,1,1,0,0,0,0},   //1
   {1,1,0,1,1,0,1},   //2
   {1,1,1,1,0,0,1},   //3
   {0,1,1,0,0,1,1},   //4
   {1,0,1,1,0,1,1},   //5
   {1,0,1,1,1,1,1},   //6
   {1,1,1,0,0,0,0},   //7
   {1,1,1,1,1,1,1},   //8
   {1,1,1,0,0,1,1}    //9
};
void setup(){
   for (byte i=7; i<=13; i++){
      pinMode(i, OUTPUT);
   }
}

void loop(){
   for (byte n=0; n<=9; n++){
      for (byte i=7; i<=13; i++){
	     digitalWrite(i, dig[n][13-i]);
      }
      delay(500);
   }
   delay(1000);
}

En esta oportunidad hemos usado 7 pines digitales para manejar el display.

5. Solución 2

Simplifiquemos nuestro código y elevemos los requerimientos. Usaremos la función random() para generar el numero aleatorio. Por lo que ahora los números mostrados sean aleatorios. Ademas se hizo un gran ahorro en la matriz guardando los segmentos como un numero binario.

const byte dig[10]={
   B1111110,   //0
   B0110000,   //1
   B1101101,   //2
   B1111001,   //3
   B0110011,   //4
   B1011011,   //5
   B1011111,   //6
   B1110000,   //7
   B1111111,   //8
   B1110011    //9
};
void setup() {
   for (byte i=7; i<=13; i++){
      pinMode(i, OUTPUT);
   }
	randomSeed(analogRead(0));
}

void loop() {
   byte n = random(10);
   for (byte i=7; i<=13; i++){
      digitalWrite(i, bitRead(dig[n],i-7));
   }
   delay(500);
}

6. Solución 3

Otra opción interesante cuando tienes que manejar display 7 segmentos es usar un IC decodificador de BCD a 7 segmentos como el 7448 o 4011. Su principal virtud es que te ahorra pines de Arduino ya que no tendrás que usar 7 pines sino solamente 4. Ademas mejoramos nuestro código usando la función bitRead()

void setup() {
   for (byte i=10; i<=13; i++){
      pinMode(i, OUTPUT);
   }
}

void loop() {
   byte n = random(10);
   for (byte i=10; i<=13; i++){
      digitalWrite(i, bitRead(n,13-i));
   }
   delay(500);
}

En esta oportunidad hemos usado 4 pines digitales para manejar el display.

7. Solución final



Si puedes mejorar o simplificar mas aun este código de ejemplo dímelo aquí