Conectando 6 LEDs com Apenas 3 Pinos do Microcontrolador

Algumas vezes você precisa de mais do que o que tem. Eeu estou falando sobre os pinos do microcontrolador.

Veja bem: você tem que conectar 6 LEDs mas possui apenas três pinos do microcontrolador disponíveis. Utilizar outro microcontrolador não é sempre uma opção e outros circuitos decodificadores também não.

Esta é uma dica simples de como fazer isso. Conecte os diodos LED ao microcontrolador dessa forma:

 

Agora veja: se você setar o pino um para “1” e o segundo para “0” (deixando o pino 3 no estado de alta impedância, como entrada) então você somente vai acender um LED. Você pode ligar dois leds ao mesmo tempo setando o terceiro pino para o estado “1” ou “0”, dependendo de qual LED adicional você pretende acender.
Se você precisar ligar todos os LEDs ao mesmo tempo, precisará mudar o estado dos pinos em uma freqüência mais alta para evitar a sensação dos LEDs piscando.

Com esse método você pode ligar até doze LEDs com apenas 4 pinos. Este é um método conveniente para ser utilizado com LEDs bicolores, quando dois LEDs são colocados no mesmo encapsulamento, mas em diferentes direções.

Este é um exemplo de código em C para o ARV-GCC de como controlar os LEDs. No exemplo, os LEDs estão conectados na porta B, entre os pinos 0 e 2.

Fragmento da função de controle:


unsigned char leds;           // Os bits são os estados dos leds
void LEDs_refresh(void)
{
static unsigned char state;   // Taxa de atualização atual
OFF();                      // Coloca todos os pinos em alta impedância (entrada)
switch (state)
{
   default:
      CLR_0();                  // Coloca o pino 0 baixo
        if (leds &  1) {SET_1();} // Coloca o pino 1 alto para o led 1
        if (leds &  2) {SET_2();} // Coloca o pino 2 alto para o led 2
        state=1;                  // próximo estado
       break;
  case 1:
       CLR_1();                  // Coloca o pino 0 baixo
        if (leds &  4) {SET_0();} // Coloca o pino 0 alto para o led 3
        if (leds &  8 ) {SET_2();} // Coloca o pino 2 alto para o led 4
       state=2;                  //próximo estado
       break;
    case 2:
       CLR_2();                  // Coloca o pino 2 em nível baixo
       if (leds & 16) {SET_0();} // Coloca o pino 0 alto para o LED 5
       if (leds & 32) {SET_1();} // Coloca o pino 1 alto para o LED 6
       state=0;                 // Próximo estado
       break;
}//end switch
}
Esta função deve ser chamada com freqüência para evitar deixar visível a piscada dos LEDs. O melhor é utilizar a interrupção do timer.

O código completo do projeto está na caixa abaixo para download.

Anexos