7. Multiplexaje de Display

7. Multiplexaje de Display
5 (100%) 4 votes

En muchas ocasiones se requiere mostrar números en el display de más de un dígito, es decir, 2, 3, o 4 dígitos. (Ver con 1 solo display).

Si se pretende controlar cada display, se necesitan siete (7) líneas del microcontrolador por cada uno, esto ocuparía todas las líneas disponibles en cada puerto del microcontrolador, sin embargo existe una técnica llamada multiplexaje que consiste en conectar a las mismas 7 líneas los 2,3 o 4 display e ir encendiendo uno a uno los display, a través de un transistor, tan rápidamente que parece encenderse todos al mismo tiempo.

Cualquier elemento que se encienda y apague con una frecuencia mayor a 25Hz es imperceptible para el ojo humano, éste lo verá encendido en todo momento.

Multiplexacion con display 7 segmentos

Nota: los segmentos de cada display van unidos entre sí, es decir a con a, b con b, hasta el g con g, por cada display adicional se necesita un transistor y sólo una línea más del microcontrolador.

En este diagrama se asume que las unidades están en el display de la derecha y las decenas en el display de la izquierda.

Ejemplo 1

Realizar un temporizador de 0 a 99 que incremente cada segundo.

Multiplexación con PIC

Código del Microcontrolador

A continuación te dejo el código para que lo puedas copiar y pegar en tu compilador y de esta manera puedas reproducirlo en tu computador. Recuerda que para ver el código solo debes compartir el contenido de este post. Gracias por apoyar la página.

En el ejemplo anterior se utilizan funciones, que son pequeños subprogramas que se pueden llamar desde el programa principal (MAIN). Se debe digitar antes del programa principal que es quien las llama.

Las dos funciones empleadas son: “MOSTRAR” que es una pequeña rutina que se encarga de hacer la multiplexación entre los dos displays. Y la otra funcion es “RET1SEG” que es una rutina de retardo de 1 segundo, que va llamando en todo momento a multiplexación para que de este modo mientras se está esperando a que el retardo de 1 segundo se cumpla, vaya mostrando el valor del temporizador actual.

Si la función no retorna ningún valor se pone la directiva VOID antes del nombre de la función indicando que no retorna ningún valor.

Para descargar el programa y el esquema del proteus:

7. Multiplexacion

Si te sirvió de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.




Esta entrada tiene 3 comentarios

  1. me explico mejor disculpe que le responda hasta ahorita, ya vi el video e intento realizar una comvinacion de los 2 del primero el final con el contacto y del segundo pero no hallo como realizar el multiplexado con el pulsador

    osea me explico estoy haciendo un contador sumador y que resta con una pantalla led de 2 digitos necesito que cada vez que entra alguien(que se oprime el pulsador 1) suba un digito, y cuando salga alguien (que se oprime el pulsador 2) reste un digito, cuando se oprime el pulsador 3 resetee el conteo

    tambien hice este
    pero este solo funciona con un digito, no entendi bien lo del multiplexaje a la final hablas de dos formulas pero no se como funcionan, lo que entendi es que mostrar es la que muestra los dos digitos, y la conrec da un retardo que no entendi, pero para colocarle un pulsador para que este suba un solo digito tira error e invierte como se ve la pantalla(osea los leds que deberian prender permanecen apagados y los que estan apagados permanecen prendidos)

    #INCLUDE
    #FUSES XT,NOLVP,NOWDT,PUT
    #USE DELAY(CLOCK=4000000)
    Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
    #DEFINE SWENTRADA PORTC,0
    #DEFINE SWSALIDA PORTC,1
    #DEFINE SWRESET PORTC,3
    #DEFINE LEDENTRADA PORTD,0
    #DEFINE LEDSALIDA PORTD,1
    #DEFINE TUNI PORTA,0 //Definición de variables
    #DEFINE TDEC PORTA,1 //Definición de variables
    #BYTE PORTA = 5
    #BYTE PORTB = 6
    #BYTE PORTC = 7
    #BYTE PORTD = 8

    INT CONT; //Declarar la variable CONT como
    //un entero, es decir de 8 bits
    LONG CONTRET; //Declarar la variable CONTRET
    //como long, es decir de 16 bits

    VOID MOSTRAR( ) //Rutina mostrar
    {
    INT UNI,DEC; //Declarar las variables UNI, DEC
    //como un entero, es decir de 8bits
    DEC=CONT/10;
    UNI=CONT%10;
    PORTB=(DISPLAY[UNI]); //Muestra lo que hay en unidades
    //en el display
    BIT_SET (TUNI); //Enciende el display de unidades
    DELAY_MS(1); //Retardo de 1 milisegundos
    BIT_CLEAR(TUNI); //Apaga el display de unidades
    PORTB=(DISPLAY[DEC]); //Muestra lo que hay en unidades
    //en el display
    BIT_SET (TDEC); //Enciende el display de decenas
    DELAY_MS(1); //Retardo de 1 milisegundos
    BIT_CLEAR(TDEC); //Apaga el display de decenas

    }

    VOID RET1SEG() //Rutina RET1SEG
    {
    CONTRET=500; //Cargue con 500 la variable CONTRET
    WHILE (CONTRET>0) //Mientras que la variable CONTRET sea mayor que cero
    {
    MOSTRAR(); //Llamar la rutina MOSTRAR
    CONTRET–; // Decremente la variable CONTRET
    }
    }

    void main (){
    SET_TRIS_A(0B00000000);
    SET_TRIS_B(0B00000000);
    SET_TRIS_C(0B11111111);
    SET_TRIS_D(0B00000000);
    CONT=0;
    while(TRUE) // Haga por siempre
    {
    if(BIT_TEST(SWENTRADA)) // Si SW esta activado
    {
    BIT_SET(LEDENTRADA); // Active el led
    DELAY_MS(200);
    while(BIT_TEST(SWENTRADA));
    CONT++;
    PORTB= display[CONT];
    if (CONT==10)
    {
    CONT=0;
    }
    else // Sino, es decir si SW esta desactivado
    {
    BIT_CLEAR(LEDENTRADA); // Apagar led
    }
    }

    if(BIT_TEST(SWSALIDA)) // Si SW esta activado
    {
    BIT_SET(LEDSALIDA); // Active el led
    DELAY_MS(200);
    while(BIT_TEST(SWENTRADA));
    CONT–;
    PORTB= display[CONT];
    if (CONT<0)
    {
    CONT=0;
    }
    }
    else // Sino, es decir si SW esta desactivado
    {
    BIT_CLEAR(LEDSALIDA); // Apagar led
    }

    }
    }

    estoy confundido si puedes dar una pequeña explicacion de como se usaria un pulsador como tal para que este sume 1 digito

    1. Cristopher es lo siguiente: Si quieres usar un pulsador para hacer el conteo, debes saber que este es un dispositivo mecanico el cual genera un rebote (Un ruido) que puede generar conflicto. En esta entrada te enseño como colocar pulsadores en el PIC y justamente la misma entrada explica un poco lo que quieres hacer solo que con un único Display: Display con Pulsador (Click aca).

      Aqui puedes ver todas las entradas que hay en la pagina de microcontroladores (Click Aca)

      Ahora como vas a usar 2 displays, debes hacer una multiplexación. Lo que quiere decir que vas a conectar los 2 displays en un UNICO puerto, (El Puerto B) por ejemplo y con dos transistores los vas a encender y apagar. Entonces por el puerto B mandas el numero de las unidades osea que con el transistor unicamente enciendes el display de las unidades, luego apagas este display y mandas por el puerto B el numero de las decenas y con el otro transistor prendes el display de las decenas. La clave es que como prendes y apagas los displays a una velocidad muy elevada, el ojo humano no lo percibe y piensa que ve los dos displays encendidos al tiempo.

      En resumen, basicamente debes juntar el código de la entrada del pulsador y la entrada de la multiplexación. Cuando presiones los botones debes ir almacenando la cuenta en una variable que va a ser tu contador y luego debes mostrarla en el display, con la funcion MOSTRAR();

      Saludos

  2. Muy bueno migo

Deja un comentario

Menú de cierre