Multiplexar Display 7 Segmentos

Como vimos en un articulo anterior, para controlar un Display 7 Segmentos necesitamos utilizar algun driver (por ejemplo el Registro de desplazamiento 74HC595) que nos permite controlar con pocos pines de nuestro micro controlador (arduino en nuestro caso) los 7 pines de nuestro 7 segmentos.

VENTAJAS DE MULTIPLEXAR DISPLAY 7 SEGMENTOS

Pero entonces, ¿que es y que ventajas tengo de multiplexar?, bueno supongamos que tenemos que controlar 4 displays, según nuestro análisis anterior necesitaríamos cuatro 74HC595 para controlar cada uno de los dígitos, si por cada driver utilizamos 3 pines de nuestro micro controlador, estaríamos gastando 16 pines de nuestro micro en solo visualizar números.. la cosa se empieza a complicar.

Con la técnica de multiplexado podríamos controlar los cuatro dígitos con un solo driver, esta técnica se basa en encender y apagar cada dígito de manera muy rápida, de forma tal que este cambio sea imperceptible a los ojos, aproximadamente cada 5ms.

EJEMPLO

Supongamos que quiero visualizar el numero 1234

  • Unidad de mil = 1
  • Centena = 2
  • Decena = 3
  • Unidad = 4

Para esto tenemos que hacer lo siguiente, encendemos el dígito de la unidad de mil y enviamos a visualizar el numero 1, dejamos pasar 5ms lo apagamos y prendemos el dígito de la decena y enviamos a visualizar el numero 2, dejamos pasar 5ms lo apagamos y prendemos la Decena y enviamos a visualizar el numero 3, dejamos pasar 5ms lo apagamos y prendemos la Unidad y enviamos el numero 4.

Esto es una gran ventaja ya que reducimos considerablemente el costo de nuestra placa al ahorrarnos de 3 componentes que suelen ser caros, ganando en costo y reduciendo el espacio en la placa.

RESUMEN

  • Reducción de componentes en la placa.
  • Economizamos nuestro proyecto.
  • Menor utilización de pines.

DESVENTAJAS DE MULTIPLEXAR DISPLAY 7 SEGMENTOS

Como nada es gratis en esta vida y esto tampoco, hacer esto tiene una serie de desventajas que debemos tener en cuenta en nuestro proyecto.

  • Complicación de software.
  • Debemos estar prendiendo y apagando nuestros display cada 5ms.

¿Que pasaría si necesito ejecutar una acción que demore mas de ese tiempo y que no se pueda interrumpir?,
por ejemplo ejecutar la lectura de un sensor de temperatura que suele demorar mas de ese tiempo, veríamos un numero incorrecto en los displays.

CIRCUITO PARA MULTIPLEXAR DISPLAY 7 SEGMENTOS

Para esto debemos controlar el encendido y apagado de cada 7 Segmento, en este caso utilizo transistores como interruptores, cuando en la base del transistor le coloco un uno permito que circule corriente a masa y el display se encienda, cuando le coloco un cero en la base los display se apagaran por que el transistores esta funcionando como un circuito abierto.

multiplexar display 7 segmentos

EJEMPLO ARDUINO

Este es un ejemplo que encontré en la web y la verdad me pareció muy completo así que se los comparto

#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define F 7
#define G 8

// Pushbuttons connected to pins 9 and 10
#define BTN1 14
#define BTN2 15

// Pins driving common anodes
#define CC1 9
#define CC2 10
#define CC3 11
#define CC4 12
// Pins for A B C D E F G, in sequence
const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 };
 
// Segments that make each number
const byte numbers[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
 
int estadobtn1 = 0;
int estadobtn2 = 0;
int digit1 = 0;
int digit2 = 0;
int digit3 = 0;
int digit4 = 0;
int count = 0;
int val;
int val2;
 
void setup() {
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(BTN1, INPUT);
  pinMode(BTN2, INPUT);
  digitalWrite(BTN1, HIGH); // activa RPA 
  digitalWrite(BTN2, HIGH); // activa RPA 
  pinMode(CC1, OUTPUT);
  pinMode(CC2, OUTPUT);
  pinMode(CC3, OUTPUT);
  pinMode(CC4, OUTPUT);
  count = 0;
}
 
void loop() {
  val = digitalRead(BTN1); // lee el valor de entrada y almacénlo en val
  if (val != estadobtn1) // el estado de botón ha cambiado!
  {
    if (val == LOW) // compruebe si el botón es presionado 
    {
      count++;
      count %= 10000;
    } 
  }
  estadobtn1=val;
 
  val = digitalRead(BTN2); // lee el valor de entrada y almacénlo en val
  if (val != estadobtn2) // el estado de botón ha cambiado!
  {
    if (val == LOW) // compruebe si el botón es presionado 
    {
      if (count == 0)
    {
      count=9999;
    } else {
      count--;
      }
    }
    estadobtn2=val;
  }
// display number
digit1=count / 1000;
digit2=(count - (digit1 * 1000)) / 100;
digit3=(count - (digit1*1000) - (digit2*100)) / 10;
digit4=count % 10;
 
lightDigit1(numbers[digit1]);
  delay(2);
  lightDigit2(numbers[digit2]);
  delay(2);
  lightDigit3(numbers[digit3]);
  delay(2);
  lightDigit4(numbers[digit4]);
  delay(2);
}
 
void lightDigit1(byte number) {
  digitalWrite(CC1, LOW);
  digitalWrite(CC2, HIGH);
  digitalWrite(CC3, HIGH);
  digitalWrite(CC4, HIGH);
  lightSegments(number);
}
 
void lightDigit2(byte number) {
  digitalWrite(CC1, HIGH);
  digitalWrite(CC2, LOW);
  digitalWrite(CC3, HIGH);
  digitalWrite(CC4, HIGH);
  lightSegments(number);
}
 
void lightDigit3(byte number) {
  digitalWrite(CA1, HIGH);
  digitalWrite(CC2, HIGH);
  digitalWrite(CC3, LOW);
  digitalWrite(CC4, HIGH);
  lightSegments(number);
}
 
void lightDigit4(byte number) {
  digitalWrite(CC1, HIGH);
  digitalWrite(CC2, HIGH);
  digitalWrite(CC3, HIGH);
  digitalWrite(CC4, LOW);
  lightSegments(number);
}
 
void lightSegments(byte number) {
  for (int i = 0; i < 7; i++) {
    int bit = bitRead(number, i);
    digitalWrite(segs[i], bit);
  }
}
multiplexar display 7 segmentos

ARTICULOS RELACIONADOS

15 comentarios sobre “Multiplexar Display 7 Segmentos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *