Multiplexación Pantallas de 7 Segmentos
![]() |
Fig1. Pantallas de 7 Segmentos |
Muchas gracias por tu visita a este blog relacionado con la programación de micro-controladores PIC, en esta entrada quiero mostrarles como utilizar las pantallas de 7 segmentos mediante la técnica de multiplexación para así reducir la cantidad de lineas necesarias para su control.
El
objetivo de esta entrada es aplicar la técnica de multiplexación por tiempo de dos o mas pantallas de 7 segmentos con un microcontrolador PIC16F en la que se pretende mostrar un numero de cuatro dígitos correspondiente al resultado de una conversion ADC de 10-bit.
La programación del microcontrolador PIC se lleva a cabo con el software de diseño MPLABX y el compilador de lenguaje C para PIC XC8, ambos disponibles en la pagina de microchip de forma gratuita. Aquí dejo los enlaces de las versiones utilizadas para nuestro ejemplo:
Introducción al Tema
![]() |
Fig2. Display de 7 Segmentos |
Esta pantalla de visualización conocido como display de 7 segmentos, esta constituido por siete a ocho diodos LED con uno de sus extremos conectados a un punto común y físicamente distribuidos para representar un numero decimal. Dependiendo del modo en como se conectan los diodos veremos dos tipos de pantalla conocido como Ánodo Común (CA) y Cátodo Común (CC), observe la figura 2.
![]() |
Fig3. Tipo de configuracion 7 segmentos |
Es importante considerar el tipo de pantalla para su correcta polarización ya que de ello dependerá el numero que se desea mostrar, en ambos casos podemos observar en la figura 3, una tabla de equivalencia de los niveles lógicos necesarios para los símbolos que se pueden mostrar.
![]() |
Fig4. Numeración decimal con 7 segmentos |
![]() |
Tabla1 Decodificación de los segmentos (CC) |
Considerando la tabla anterior podemos notar que se necesitara un circuito combinatorio cuya salida active los segmentos en base a un numero binario presente en su entrada, este circuito es conocido como decodificador binario a 7 segmentos, dos circuito integrados de función fija muy utilizados para este fin son el 74LS47(CA) y 74LS48(CC), pero en el caso de un MCU esta operación pueden llevarse a cabo fácilmente con el uso de tablas en memoria, tal como se observa en la siguiente declaración del código para segmentos del tipo cátodo común.
/* Mapa de conversion a 7 Segmentos Cátodo Común dp-G-F-E-D-C-B-A */
uint8_t dmap[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67};
Este arreglo de memoria con diez elementos de un byte, contiene el valor necesario para representar el numero según su índice de posición, por ejemplo el primer elemento, tiene el índice cero por lo tanto se debe referencia como dmap[0] que tiene el valor 0x3F, siendo el bit0 de menor peso el segmento A y el bit6 el segmento G. Si queremos aplicar esta tabla de conversion a una pantalla del tipo Ánodo Común (CA), bastara únicamente invertir los valores al momento de hacer referencia a cada elemento aplicando el operador logico de complemento ~dmap[x] o reemplazar con lo siguiente:
/* Mapa de conversion a 7 Segmentos Ánodo Común dp-G-F-E-D-C-B-A */
uint8_t dmap[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x83,0xF8,0x80,0x98};
Multiplexación de Pantallas
Debido a que una pantalla necesitar al menos 7 a 8 lineas para polarizar los LED, en la practica es muy común utilizar la técnica de multiplexación por tiempo en la que las lineas para activar los segmentos se comparten a todas las pantallas, pero solo una permanecerá activa en el tiempo. Observe la siguiente figura animada que muestra este proceso y comprenderá que al incrementar la frecuencia o barrido de activación por pantalla se percibirá menos el cambio debido a la retención visual del ojo humano, al punto que el cambio no se notara si la frecuencia supera los 25Hz.
![]() |
Fig5. Multiplexación de 4 pantallas (Autor: Editorial Staff) |
Los modulo de cuatro dígitos como ser el LTC-5623HR y LTC-5723HR facilitan bastante la implementación del circuito electrónico en la que se requiere mostrar informacion de números decimales, esto porque los módulos ya llevan las conexiones poseen las conexiones de todos segmentos listos para el control por multiplexación, reduciendo significativamente la cantidad de pines.
Las siguiente figuras por ejemplo se han extraído de la hoja de datos LTC-5623HR para mostrar la interconexión de los segmentos para los cuatro dígitos.
![]() |
Fig 6. Modulo de 4 Dígitos LTC-5623 tipo Ánodo Común |
Esquema del Circuito
Para realizar una demostración de la multiplexación de estas pantallas utilizaremos uno de los circuitos que se muestra en los siguientes esquemas de circuito que se diferencian en el tipo de modulo de cuatro dígitos.
![]() |
Fig7. Configuración modulo LTC-5623 tipo Ánodo Común |
![]() | |
|
Se necesitaran ocho pines del PORTD para activar cada segmento de la pantalla incluido el punto que corresponde al pin RD7 y cuatro pines del PORTC para activar cada una de las cuatro pantallas mediante transistores que permiten la circulación de corriente necesaria para que mas de un segmentos a la vez se iluminen (segmentos en paralelo).
En el primer circuito de la figura 7, la activación de cada segmento así como las pantallas, se consigue aplicando niveles bajos en todas las lineas de control, esto quiere decir que en estado de reposo las lineas estarán en niveles altos. Por otro lado con el segundo circuito de la figura 8, la activación de segmentos y pantallas se realizar con niveles altos, siendo el nivel bajo el estado de reposo por defecto. Se debe considerar que las resistencias en serie utilizadas en cada segmentos influyen en la intensidad de iluminación, y respecto a los transistores para activar las pantallas puede utilizar un BC557 para el modulo LTC-5623HR y un BC547 con el modulo LTC-5723HR.
En ambos esquemas de circuito se utilizara un potenciómetro conectado a la entrada AN0 del PIC para que el resultado de la conversion ADC de 10-bit, que son cuatro dígitos 0000 al 1024 se visualicen en pantalla. Por ultimo el diodo LED1 que esta en la salida RE2 destellara cada segundo para indicar que nuestro circuito y su programa esta en operación normal.
Programación del PIC16F
Entonces elaboraremos un programa para el PIC16F887 considerando el uso del modulo LTC-5623 que es del tipo Ánodo Común, por lo tanto el control de las pantallas se lleva a cabo con niveles bajos. La estructura que tiene el programa principal se conforma por la ejecución de tres tareas con intervalos de un milisegundo, y en las que cada
tarea controla su estado de ejecución de forma independiente. Considera
hacer lectura de la siguiente entrada en la que explico con mas
detalle la ejecución de tareas concurrentes con interrupción del
temporizador. <Concurrencia de tareas con Temporizador>.
Con respecto al funcionamiento del código su descripción esta en los propios comentarios, por lo que espero pueda ser entendible y ante cualquier duda no dudes en escribirme.
La sección inicial del programa, muestra la configuracion de fusibles, definición de pines, mapa de conversion y variables del programa.
#pragma config FOSC=INTRC_NOCLKOUT, WDTE = OFF, BOREN = OFF, LVP = OFF
#include <xc.h>
#define LED1pin PORTEbits.RE2
#define SEGPORT PORTD
#define DP1pin PORTCbits.RC0
#define DP2pin PORTCbits.RC1
#define DP3pin PORTCbits.RC2
#define DP4pin PORTCbits.RC3
volatile __bit tickms;
/* Mapa de conversion a 7 Segmentos dp-G-F-E-D-C-B-A */
uint8_t dmap[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67};
uint16_t adcvalue; //Valor del ADC 10-bit
uint8_t dvalue[4]; //Valores decimales de cada dígito
El procedimiento principal refleja el orden de ejecución concurrente de las tareas por cada milisegundo, la bandera tickms es activada por interrupción del temporizador TMR0.
void main(void)
{
MCUSetup();
adcvalue = 0;
while(1)
{
if(tickms) //Valido cada 1ms
{
tickms = 0;
taskLED(); //Destello de LED1
taskADC(); //Lectura y actualización datos
taskTDM(); //Multiplexación de pantallas
}
}
}
En la Tarea de multiplexación de cuatro pantallas, tomando en cuenta que la llamada a este procedimiento se realiza cada 1ms que equivale a 1kHz en frecuencia, este valor se divide entre las cuatro pantallas siendo la frecuencia de barrido 250Hz.
void taskTDM(void) //Tarea para control Pantalla t=1ms
{
static uint8_t state = 0;
uint8_t res;
res = dvalue[state];
switch(state)
{
case 0: //Activa solo DP1
DP4pin = 1;
SEGPORT = ~dmap[res];//Dígito de mayor peso
DP1pin = 0;
state++;
break;
case 1://Activa solo DP2
DP1pin = 1;
SEGPORT = ~dmap[res];
DP2pin = 0;
state++;
break;
case 2://Activa Solo DP3
DP2pin = 1;
SEGPORT = ~dmap[res];
DP3pin = 0;
state++;
break;
case 3://Activa solo DP4
DP3pin = 1;
SEGPORT = ~dmap[res]; //Dígito de menor peso
DP4pin = 0;
state = 0;
break;
}
}
La tarea de lectura ADC y actualización de dígitos se repiten a intervalos de 200ms, es decir una frecuencia de 5Hz. Puede reducir o incrementar este valor si desea modificar la sensibilidad de cambio en el potenciómetro.
void taskADC(void) //Tarea de control ADC t=1ms
{
static uint16_t cnt = 0;
static uint8_t state = 0;
cnt++;
switch(state)
{
case 0: //Inicia Conversión
adcvalue = 0;
ADCON0bits.GO = 1;
state++;
break;
case 1: //Lectura del valor ADC
if(ADCON0bits.GO == 0)
{
adcvalue = ADRESL; //ADRESL First
adcvalue |= (uint16_t) (ADRESH << 8);
adcvalue >>= 6; //Left aligment of ADH:ADL
state++;
}
break;
case 2://Actualiza dígitos de pantalla y espera
if(cnt >= 200) //Intervalo 200ms
{
cnt = 0;
if(adcvalue > 999) //Miles
{
dvalue[3] = (uint8_t)(adcvalue / 1000U);
adcvalue = adcvalue % 10;
}
else dvalue[3] = 0;
if(adcvalue > 99) //Centenas
{
dvalue[2] = (uint8_t)(adcvalue / 100U);
adcvalue = adcvalue % 10;
}
else dvalue[2] = 0;
if(adcvalue > 9) //Decenas
{
dvalue[1] = (uint8_t)(adcvalue / 10U);
adcvalue = adcvalue % 10;
}
else dvalue[1] = 0;
dvalue[0] = (uint8_t) adcvalue;
state = 0;
}
break;
}
}
![]() |
Fig9. Funcionamiento del circuito PIC |
Los procedimientos que se mostraron con antelación son parte del archivo principal main.c del proyecto MPLABX, este archivo contiene código adicional que no
se ha detallando en esta publicación por esta razón dejo el
enlace para su descarga y así puedas hacer una mejor revisión mediante MPLABX. <Multiplexación 7 Segmentos>
Si quieres ver como compilar e implementar los proyectos de este blog, que están elaborados con el IDE MPLABX y el compilador XC mira este vídeo. <Compilando proyectos MPLABX>
Conclusiones y recomendaciones
Vimos como hacer el control varias pantallas de 7 segmentos aplicando la multiplexación por tiempo en nuestro microcontrolador, y como habrás notado el código es relativamente simple y mantiene una clara separación de otras tareas que se pueden ejecutar desde el programa principal, por lo que podrás agregar esta pantalla a la mayoría de tus proyectos con facilidad.
Un punto que debes considerar es que al incrementar la cantidad de pantallas, la intensidad en el brillo se reduce debido a que el tiempo de activación por dígito es menor, entonces para compensar esto puedes reducir el valor de las resistencias que van en serie con los segmentos, tomando en cuenta la corriente pico por segmento a un determinado ciclo de trabajo, este valor se muestra en la hoja de datos de la pantalla, por ejemplo el modulo LTC-5623HR posee los siguiente valores:
-Corriente continua por segmento de 25mA-Corriente pico por segmento de 100mA (ciclo 1/10, ancho de pulso 0.1ms)
Sin
mas que mencionar agradezco tu visita al blog y espero que el ejemplo
visto pueda ser útil en tu formación y el proyecto que desarrollas.
Atentamente, Pablo Zárate Arancibia email: pablinza@me.com / pablinzte@gmail.com, @pablinzar