Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] como fazer a multiplexação de dois displays

como eu faria a multiplexação de dois displays de 7 segmentos para o hardware do MSP430G24552 de forma com que não ocorra perda de informações no seguinte código:

#include"intrinsics.h"
#include"io430.h"
#define ROLETAS 3
unsigned char cod[]={0X3F,0X06,0X5F,0X4F,0X66,0X6D,0X7C,0X07,0X7F,0X6F,0X80,0X40,0X00};
void ConfiguraDisplay(void)
{ 
    P1DIR=0XFF; 
    P2DIR|=0X03; 
    P2SEL&=0X3F; 
    P2REN|=0XFC; 
    P1OUT=0X00; 
    P2OUT=0X00; 
}
unsigned int totalRoletas(int *roletas)
{
    int cont;
    unsigned int total=0;
    for (cont=0; cont<ROLETAS; cont++)
        total += roletas[cont];
    return (total);
}
void zeraRoletas(int *roletas)
{
    int cont;
    for (cont=0; cont<ROLETAS;cont++)
        roletas[cont] = 0;
}
void MostraDisplay(unsigned char valor)
{
    unsigned char unidades=valor;
    unsigned char dezenas=0;
    while(unidades>9)
    {
        dezenas++;
        unidades=unidades-10;
    }
    if (P1OUT&0X80)
    {
        P1OUT&=0X7F; 
        P1OUT|=0X40; 
    }
    else
    {
        P1OUT&=0XBF; 
        P1OUT|=0X80; 
    }
}
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;
    ConfiguraDisplay();
    int rol[ROLETAS];
    zeraRoletas(rol);
    char limite;
    char total;
    total=0x00;
    limite=0x64; 
    while (1)
    {
        while (total<limite)
        {
            if ((P2IN & 0x20)==0)
            {
                rol[0]++;
                __delay_cycles(5000);
            }
            else if ((P2IN & 0x40)==0) 
            {
                rol[1]++;
                __delay_cycles(5000);
            }
            else if ((P2IN & 0x80)==0)  
            {
                rol[2]++;
                __delay_cycles(5000);
            }
            unsigned int totalRoletas();
            if ((P2IN & 0x08)==0)
            {
                if ((P2IN & 0x10)==0)
                {
                    MostraDisplay(total);
                    __delay_cycles(5000);
                }
                else
                {
                    MostraDisplay(rol[1]);
                    __delay_cycles(5000);
                }
            }
            else
            {
                if ((P2IN & 0x10)==0)
                {
                    MostraDisplay(rol[0]);  
                    __delay_cycles(5000);
                }
                else
                {
                    MostraDisplay(rol[2]);  
                    __delay_cycles(5000);
                }
            }
        }
    }
}
1 resposta
solução!

Oi Gustavo, tudo bem?

No código, você já definiu o array cod que contém os valores para cada dígito no display de 7 segmentos. Além disso, você também já possui uma função MostraDisplay que recebe um valor e mostra o dígito correspondente no display.

Para fazer a multiplexação dos displays, você precisará alternar rapidamente entre os dois displays para que pareça que ambos estão acesos ao mesmo tempo. Isso pode ser feito através do uso de um temporizador e da alteração dos pinos de saída.

Uma possível abordagem seria a seguinte:

  1. Defina um temporizador que interrompa o programa a cada intervalo de tempo desejado. Isso pode ser feito usando as funções __delay_cycles ou __bis_SR_register.

  2. Dentro da função de interrupção do temporizador, alterne o valor dos pinos de saída para selecionar qual display será atualizado. Por exemplo, se você usar o pino P1.7 para selecionar o primeiro display e o pino P1.6 para selecionar o segundo display, você pode alternar entre eles usando as instruções P1OUT |= BIT7; e P1OUT &= ~BIT7;.

  3. Após selecionar o display correto, chame a função MostraDisplay passando o valor correspondente ao dígito que você deseja mostrar.

Lembra de ajustar o intervalo de tempo do temporizador para que a alternância entre os displays seja rápida o suficiente para que o olho humano não perceba a mudança.

Essas são algumas dicas para você conseguir fazer o que deseja.

Um abraço e bons estudos.