21 agosto 2016

CD4511 com Arduino e display 7 segmentos

Aqui no blog você já viu como controlar um display 7 segmentos com o Max7219 e também como ligar um display 7 segmentos diretamente nas portas do Arduino. Neste post vamos usar o CI decodifficador CD4511 para fazer esse controle junto com o Arduino.

CD4511 com Arduino


O CD4511 usa somente 4 portas do Arduino, tornando o circuito mais simples (principalmente na conexão com o microcontrolador) e deixando as outras portas livres para uso de outros componentes como sensores, atuadores, módulos, etc.

O CI decodificador CD4511

O circuito integrado CD4511 (datasheet) é um decodificador BCD (Binary-Coded Decimal) para 7 segmentos, que possui 4 pinos de entrada (em vermelho, na imagem abaixo), e 7 pinos de saída (em azul):

Pinagem CD4511

Essas 7 saídas são conectadas à um display 7 segmentos, que tem a seguinte estrutura:
Display 7 segmentos
Assim, basta ligarmos os pinos do CD4511 aos pinos correspondentes do display, e enviarmos um valor em binário para as portas de entrada. Conforme o valor da entrada, o display exibirá o valor correspondente em decimal, seguindo a tabela abaixo:

Tabela CD4511 BCD - 7 segmentos

Logo, para formar o número 3 por exemplo, vamos seguir a tabela e enviar para o CD4511 o binário 0011, que vai acender os segmentos A, B, C, D e G do display.

Circuito CD4511 com Arduino


Abaixo temos o esquema de ligação do CD4511 no Arduino, com os pinos digitais 4, 5, 6 e 7 conectados às entradas A0, A1, A2 e A3, respectivamente. Os pinos Lamp Test e Blanking vão ligados no Vcc, e o pino Latch vai ligado no GND. A alimentação do CD4511 é de 5V.

Circuito CD4511 e Arduino
O display utilizado nesse circuito é do tipo catodo comum, com a pinagem abaixo:
Display 7 segmentos catodo comum
Você pode até usar um display 7 segmentos anodo comum, mas para isso você terá que colocar transistores nos pinos de saída do CD4511. Consulte o datasheet do CI para ver o esquema de ligação.

Programa CD4511 e display 7 segmentos


O programa abaixo é um contador que mostra no display 7 segmentos os dígitos de 0 a 9.

Observe que usamos simplesmente o estado (HIGH ou LOW) dos pinos 4, 5, 6 e 7 para enviar os dados em binário para o CD4511.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
//Programa: CD4511 e Arduino
//Autor: Arduino e Cia

//Definicao dos pinos de entrada
#define PinoA0 4
#define PinoA1 5
#define PinoA2 6
#define PinoA3 7

void setup()
{
  Serial.begin(9600);
  //Define os pinos como saida
  pinMode(PinoA0, OUTPUT);
  pinMode(PinoA1, OUTPUT);
  pinMode(PinoA2, OUTPUT);
  pinMode(PinoA3, OUTPUT);
  //Mensagem inicial serial Monitor
  Serial.println("Teste de CD4511\n");
}

void loop()
{
  Serial.print("Numero: 0 ");
  digitalWrite(PinoA0, LOW);
  digitalWrite(PinoA1, LOW);
  digitalWrite(PinoA2, LOW);
  digitalWrite(PinoA3, LOW);
  delay(1000);

  Serial.print("1 ");
  digitalWrite(PinoA0, HIGH);
  digitalWrite(PinoA1, LOW);
  digitalWrite(PinoA2, LOW);
  digitalWrite(PinoA3, LOW);
  delay(1000);

  Serial.print("2 ");
  digitalWrite(PinoA0, LOW);
  digitalWrite(PinoA1, HIGH);
  digitalWrite(PinoA2, LOW);
  digitalWrite(PinoA3, LOW);
  delay(1000);

  Serial.print("3 ");
  digitalWrite(PinoA0, HIGH);
  digitalWrite(PinoA1, HIGH);
  digitalWrite(PinoA2, LOW);
  digitalWrite(PinoA3, LOW);
  delay(1000);

  Serial.print("4 ");
  digitalWrite(PinoA0, LOW);
  digitalWrite(PinoA1, LOW);
  digitalWrite(PinoA2, HIGH);
  digitalWrite(PinoA3, LOW);
  delay(1000);

  Serial.print("5 ");
  digitalWrite(PinoA0, HIGH);
  digitalWrite(PinoA1, LOW);
  digitalWrite(PinoA2, HIGH);
  digitalWrite(PinoA3, LOW);
  delay(1000);

  Serial.print("6 ");
  digitalWrite(PinoA0, LOW);
  digitalWrite(PinoA1, HIGH);
  digitalWrite(PinoA2, HIGH);
  digitalWrite(PinoA3, LOW);
  delay(1000);

  Serial.print("7 ");
  digitalWrite(PinoA0, HIGH);
  digitalWrite(PinoA1, HIGH);
  digitalWrite(PinoA2, HIGH);
  digitalWrite(PinoA3, LOW);
  delay(1000);

  Serial.print("8 ");
  digitalWrite(PinoA0, LOW);
  digitalWrite(PinoA1, LOW);
  digitalWrite(PinoA2, LOW);
  digitalWrite(PinoA3, HIGH);
  delay(1000);

  Serial.println("9 ");
  digitalWrite(PinoA0, HIGH);
  digitalWrite(PinoA1, LOW);
  digitalWrite(PinoA2, LOW);
  digitalWrite(PinoA3, HIGH);
  delay(1000);

  Serial.println("Limpa o display...");
  digitalWrite(PinoA0, HIGH);
  digitalWrite(PinoA1, HIGH);
  digitalWrite(PinoA2, HIGH);
  digitalWrite(PinoA3, HIGH);
  delay(1000);
}

O loop mostra os dígitos de 0 a 9 no display, e também envia essa informação para o serial monitor, para fins de acompanhamento.

5 comentários:

  1. Hello! Is CD4511 able to control 2 7segment displays as Max7219 can do it? If yes, you could to make a tutoral about it. Thanks.

    ResponderExcluir
    Respostas
    1. Hi!

      You can use two CD4511 to do this job... Each CD4511 can control only one 7 segment display.

      Regards!

      Excluir
    2. Yes it is capable.

      You just need to insert a transistor in each common terminal of the displays in order to switch separately them, an then, by your code, you need to set a logic that put on the four inputs first one number and after, the other number. Example: suppose that you want to show the number "80" , so you need to first switch on the transistor on the higher display of decimal number and switch off the units display and make all of your outputs in arduino as HIGH, then you will have an "8", so, for the "0" just need to invert transistors switch and lead the outputs to LOW, then you will have an "0".

      *to make it good, the delay between the switching transistor need to be very small, it makes the visual effect of both displays working at same time, but in fact, it is just switching one after another. Actually it can drive more than two displays... it only depends on your code.

      Excluir
    3. You can multiplex the displays, I did it just 1 hour ago...
      Send the number to 4511 and turn on the display1, delayMicroseconds(1) and then turn it off (delayMicroseconds(8)). send the other number to 4511 and turn on the display2, wait a microsecond and then turn off, wait 8 microseconds. I did this kind of PWM with the delays to not use any resistors or diodes in series with the segments.

      Excluir