Вы находитесь на странице: 1из 12

Ventajas de 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.
Pero entonces, que es y que ventajas tengo de multiplexar?, bueno supongamos
que tenemos que controlar 4 displays, segn nuestro anlisis anterior
necesitaramos cuatro 74HC595 para controlar cada uno de los dgitos, si por cada
driver utilizamos 3 pines de nuestro micro controlador, estaramos gastando 16
pines de nuestro micro en solo visualizar numeros.. la cosa se empieza a
complicar.
Con la tcnica de multiplexado podramos controlar los cuatro dgitos con un solo
driver, esta tcnica se basa en encender y apagar cada dgito de manera muy
rpida, de forma tal que este cambio sea imperceptible a los ojos,
aproximadamente cada 5ms.

Por
Supongamos

Unidad

ejemplo:
que

quiero

de

visualizar

mil

el

numero 1234

Centena

Decena

Unidad

Para esto tenemos que hacer lo siguiente, encendemos el dgito de la unidad de


mil y enviamos a visualizar el numero 1, dejamos pasar 5ms lo apagamos y
prendemos el dgito 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.

Entonces

resumiendo,

Reduccin

las

de

ventajas
componentes

Economizamos
Menor

son

las

en

nuestro
utilizacin

siguientes:
la

placa.
proyecto.

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.

Complicacin

de

software.

Debemos estar prendiendo y apagando nuestros display cada 5ms, que pasara
si necesito ejecutar una accin 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, veramos 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.

Ejemplo para probar en 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 almacnlo en
val
if (val != estadobtn1) // el estado de botn ha cambiado!
{
if (val == LOW) // compruebe si el botn es presionado

{
count++;
count %= 10000;
}
}
estadobtn1=val;

val = digitalRead(BTN2); // lee el valor de entrada y almacnlo en


val
if (val != estadobtn2) // el estado de botn ha cambiado!
{
if (val == LOW) // compruebe si el botn 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);
}
}

Multiplexado de 8 displays de 7
segmentos con solo 8 pines
La tcnica de multiplexar varios displays de 7 segmentos se basa en el defecto que tenemos los
humanos en los ojos (persistencia de la retina) en donde nos da la sensacin de ver una imagen
cuando esta ya ha desaparecido.
Si tenemos un oscilador que nos controla el encendido y el apagado de un led, creando una
intermitencia, en el momento que esta sea lo suficientemente rpida ya no apreciaremos que el

led llega a apagarse, sino que nos dar la sensacin que esta permanentemente encendido.
Prcticamente a frecuencias superiores a 30hz ya no apreciamos el parpadeo.
En muchos dispositivos se emplea el multiplexado para ahorrar el nmero de pines.
El esquema de la figura representa la forma ms tpica para multiplexar 2 displays a travs de un
microcontrolador.

Por ejemplo si queremos representar en los displays el numero 12, primero mandamos a los
nodos la tensin para encender los dos segmentos que forman el numero 1 y a continuacin
polarizamos el ctodo mediante el transistor T1, con lo cual solo se iluminara ese display,
transcurrido un tiempo dejamos de polarizar la base de T1 para que dicho display se apague, y
procedemos a mandar la informacin para encender los cinco segmentos que forman el numero
2 y solo entonces polarizamos el transistor T2 para que se encienda ese display.
Al realizar esta operacin a una frecuencia superior a 30 hz no apreciaremos que el 1 y el 2
estn continuamente parpadeando y alternndose uno y otro.
Con este sistema necesitaremos 7 pines del microcontrolador para controlar los nodos de los
displays, mas un pin mas por cada digito que queramos poner. As en el caso de utilizar 8
displays necesitaremos 15 pines para controlarlos.
Primeramente observar detenidamente el esquema de cmo controlar 8 displays con tan solo 8
pines. Pinchar en la imagen para ampliar.

Como veis a parte del ahorro de pines, tampoco necesitamos transistores ni resistencias
limitadoras, ya que el propio microcontrolador PIC limita la corriente a 25 mA.
Para usar este sistema de multiplexado tenemos que encender los 56 segmentos que forman los
8 displays individualmente, pondremos a 0 el ctodo del display a representar, a 1 un nico
segmento, y el resto de pines hay que ponerlos en estado de alta impedancia (configurados
como entradas).
Por supuesto la ventaja del ahorro de pines se vera contrarestada por la disminucin en
luminosidad de los segmentos. Para el caso concreto del control de 8 dgitos, cada segmento lo
he mantenido encendido durante 400 microsegundos, y tarda 23 milisegundos en completar un
ciclo completo. La eleccin de los 400 microsegundos los he elegido para evitar que se aprecie la
intermitencia de los segmentos, ya que si aumento el tiempo a 500 microsegundos ya se aprecia
una leve intermitencia.
En la rutina que os pongo a disposicin, dedico 400 microsegundos a cada segmento,
independientemente que este se muestre apagado o encendido. Fcilmente se puede modificar
la rutina para eliminar el tiempo en donde los segmentos permanecen apagados, con lo cual
ganaramos en luminosidad, pero tendremos el inconveniente de que la luminosidad variara
dependiendo de los nmeros a representar, asi el 11111111 se vera con mucha luz, mientras
que el 88888888 se vera menos iluminado.
La modificacin consistir en sustituir en las lneas donde aparezca: goto FinSeg-- (FinSeg2a)
por goto Seg-- (Seg2b).
Podeis descargar el Archivo de PROTEUS, el codigo HEX y el codigo fuente ASM.

Es muy posible que la simulacion con proteus no funcione correctamente, ya que puede que el
ordenador se ralentice.
En el ejemplo que descargueis muestro en los 8 displays los numeros "12345678".