Multiplexación para display de 7 segmentos

En el ejemplo anterior aprendimos a hacer un contador 0 a 9, representándolo en un display de 7 segmentos, ahora, ¿qué pasa si necesitamos representar números de 2 o más cifras?

La respuesta más rápida es usar otro puerto para el siguiente display, pero tengamos en cuenta que nuestro microcontrolador tiene una cantidad de pines limitados y que probablemente vamos a necesitar algunos para conectar otros componentes.

Con la técnica de la multiplexación podemos conectar varios displays de 7 segmentos a un mismo puerto y encenderlos y apagarlos a una velocidad que podamos pasar un dato individual a cada uno sin que nuestros ojos ser percaten del cambio y se pueda apreciar un numero de dos o más cifras.

En el siguiente ejemplo haremos un contador de 0 a 9999 con cuatro displays de 7 segmentos y usaremos la multiplexación para mostrar el valor del conteo.

En el circuito se aprecia un nuevo componente, es el decodificador BCD 74LS48, este circuito integrado tiene la capacidad de recibir un numero en binario y entregar en sus salidas el código para que en un display de 7 segmentos se enciendan los leds correspondientes para representar tal numero recibido. El uso de este componente es decisión de quien diseña el circuito, teniendo en cuenta de que aumentara su costo, pero a su vez libera e pines del microcontrolador, además que en el programa ya no será necesario usar el vector con los números en BCD.

También tenemos un display de 7 segmentos de 4 posiciones que solo tiene una entrada A, una B, una C, etc. Eso quiere decir que todos los segmentos A están unidos en un solo pin, al igual que los restantes segmentos. Al final notamos otros pines numerados del 1 al 4, estos son los cátodos que corresponden a cada display.

A continuación se muestra el código debidamente documentado, este programa muestra un conteo desde 0 a 9999, cada número es primero separado en dígitos individuales (unidades, decenas, centenas, miles) para luego ser escrito en el puerto B donde está conectado el decodificador BCD, según el tipo de digito enviado al puerto se activa el transistor correspondiente al display, es decir, para el digito unidades, se activa el transistor Q4, para el digito decenas se activa el transistor Q3, para el centenas el Q2 y para el miles se activa el Q1.

#include <xc.h>

#pragma config FOSC = XT        // Oscilador con cristal de cuarzo de 4MHz conectado en los pines 15 y 16
#pragma config WDTE = OFF       // Perro guardian (WDT deshabilidado)
#pragma config MCLRE = ON       // Master clear habilitado (pin reset)

#define _XTAL_FREQ 4000000      // Oscilador a 4MHz

void main(){
    TRISA = 240;                // Configuramos RA0, RA1, RA2 y RA3 como salidas para controlar
                                // los transistores que habilitaran cada display
    TRISB = 0;                  // Puerto B como salida
    ANSELA = 0;                 // Puerto A Digital
    ANSELB = 0;                 // Puerto B Digital
    PORTA = 0;                  // Inicializamos Puerto A en 0
    PORTB = 0;                  // Inicializamos Puerto B en 0
    int cont = 0;               // Variable que incrementara de 0 a 9999
    char miles;                 // Almacenará los miles
    char centenas;              // Almacenará las centenas
    char decenas;               // Almacenará las decenas
    char unidades;              // Almacenará las unidades
    int aux = 0;                // Variable para almacenar datos temporalmente

    while(1){                   // Inicio del código a ejecutar constantemente
        if(cont > 9999){       // Inicialmente verificamos que el contador no haya superado la cantidad 
                                // máxima representable en los cuatro displays (9999)
            cont = 0;           // Si es así lo reiniciamos en 0
        }

        aux = cont;             // Guardamos en aux el valor en cont
        centenas = 0;           // Ponemos en cero todos los digitos
        decenas = 0;
        unidades = 0;
        miles = 0;

        while(aux > 999){       // Mientras el valor en aux sea superior a 999
            aux -= 1000;        // Le restamos de a 1000
            miles++;            // y por cada resta aumentamos una unidad a el digito miles
        }
        while(aux > 99){        // Mientras el valor en aux sea superior a 99
            aux -= 100;         // Le restamos de 100
            centenas++;         // y por cada resta aumentamos una unidad al digito centenas
        }
        while(aux > 9){         // Mientras el valor en aux sea superior a 9
            aux -= 10;          // Le resto de 10
            decenas++;          // y por cada resta aumentamos una unidad al digito decenas
        }

        unidades = aux;         // Por ultimo, el valor restante lo asignamos a unidades
               
        PORTA = 1;              // Activamos el transistor para las unidades
        PORTB = unidades;       // y pasamos el valor de las unidades al display
        __delay_ms(200);        // Damos un retardo, por lo general en una aplicación real
                                // debe ser de unos 3 a 5 milisegundos, para el caso de la
                                // simulación dejamos 200 ms para apreciar el cambio.
                        
        PORTA = 2;              // Activamos el transistor para las decenas
        PORTB = decenas;        // y pasamos el valor de las decenas al display
        __delay_ms(200);        // Damos el retardo
        PORTA = 4;              // Activamos el transistor para las centenas
        PORTB = centenas;       // y pasamos el valor de las centenas al display
        __delay_ms(200);        // Damos el retardo
        PORTA = 8;              // Activamos el transistor para los miles
        PORTB = miles;          // y pasamos los miles al display
        __delay_ms(200);        // Damos el retardo

        cont++;                 // Se incrementa en una unidad el contador
    }
}