Multiplexação e POV com PCF8574 e display de 7 segmentos

Já escrevi sobre multiplexação com 74HC595 nesse outro artigo, que certamente tem suas vantagens e pode ser mais apropriado por diversas questões. Mas é interessante testar a possibilidade com um PCF8574 e display de 7 segmentos para ver a velocidade do barramento I2C, utilizar bitwise e rever a multiplexação.

Display de 7 segmentos

Peguei um display de 4 dígitos, dos quais o primeiro já está com o LED central queimado, infelizmente. Mas indiferente, o conceito está sendo testado em apenas 1 dígito, então fiz uso do segundo. Além disso, com o PCF8574 não seria possível alternar o dígito, exceto utilizasse um NE555, um flip-flop ou algo do tipo, porque dos 8 bits, 7 são utilizados para o display.

Também já escrevi um artigo com o MCP23017, nesse link, que possui 2 Bytes e, com ele sim seria possível manipular os 4 dígitos do display, com pinos de sobra.

Para identificar os pinos do display, simplesmente coloquei o multímetro em modo de continuidade e fui colocando pino a pino para identificar os dígitos, depois para identificar os segmentos. É um processo rápido, não há razão para procurar datasheet.

No código mais abaixo estão identificados os segmentos e as relações com os pinos do PCF8574.

PCF8574 e display de 7 segmentos

Já escrevi diversos artigos sobre esse expansor de IO, dos quais sempre recomendo esse.

Eu estava decidido a utilizar um PCF8574 soldado a uma placa de prototipagem, mas no final das contas ia ficar muito esparramado para o artigo porque não tinha onde colocar o display. De qualquer modo, vou deixar as dicas para você montar sua própria placa com o CI PCF8574.

Primeiro passo: Identificar os pinos ou, “pinout”

Comece sempre procurando pelo documento do CI que deseja utililzar. Esse documento é chamado “datasheet”, contendo mais especificações do que muitos de nós haveríamos de utilizar, mas essencial para diversos desenvolvedores de hardware por diversas questões.

Para montar nossa placa com o PCF8574 em casa, poucas informações são necessárias, dentre as quais, o pinout. Buscando no Google por “pcf8574 datasheet” já encontramos o arquivo .pdf. Logo nas primeiras páginas encontra-se os tipos de empacotamento do CI, com o respectivo pinout. No caso, utilizei esse:

PCF8574 e display de 7 segmentos

Agora precisamos de um exemplo de aplicação típica, que normalmente se encontra no datasheet também. Lendo o documento, encontra-se uma informação dizendo que entre os pinos SDA, SCL e INT, deve-se utilizar um resistor de pull-up. Mas não diz o valor. Não é problema, porque no exemplo de aplicação típica está mostrando resistores de 10k.

PCF8574 e display de 7 segmentos

Repare que os endereços estão indo ao GND. Se quiser, por optar por fazer sua placa endereçável, mas desse modo já teremos disponível o PCF8574 no endereço 0x20.

Agora resta buscar uma informação; quanto podemos (ou devemos) colocar de tensão no VCC?

Bem, nada é mais seguro do que o datasheet, porque tem tutoriais por ai que a galera coloca 5V em coisas com nível lógico 3V3. Buscando no datasheet, encontra-se 2 informações relacionadas, das quais apenas uma deve ser considerada: Recomended Operation Conditions.

Podemos usar em 3V3 ou em 5V. Ótimo!

A outra referência é a Absolute Maximum Rates, que é o uso sob condições extremas em ambiente controlado, nunca confunda esses dois tópicos.

Seguindo o datasheet, o resultado foi esse:

Wiring

Agora que já temo a placa, podemos partir para as conexões do PCF8574 e display de 7 segmentos. Ou se preferir, pode comprar um Arduino da MaxBlitz que já vem com o PCF8574. Como citei anteriormente, acabou sendo mais prático porque utilizei a área de prototipagem da própria placa para “slotar” o display. A placa é essa da imagem de destaque. Ela também está com endereçamento fixo em 0x20, o código a seguir será transparente para ambos os casos supracitados.

Código

No código disponibilizo um comentário relacionando os pinos do display e exemplificando com 3 funções diferentes o ligamento incremental, bit a bit e POV (Persistence Of Vision), que é o ligamento tão rápido quanto possível após o desligamento do bit anterior, causando a impressão de que todos os bits estão ligados ao mesmo tempo.

No código só escrevi os números de 0 à 2 para exemplificar, pratique criando os demais dígitos!

#include <Arduino.h>
#include <Wire.h>

/*
display

DIGITOS:
baixo
1 - 1
2 - 2
3 - 6
8 - 4

baixo
7 - .
3 - baixo
5 - left down

cima
1 - right top
2 - center
3 - top
4 - right down
6 - left up


PCF      0 1 2 3 4 5 6 7
DSP DOWN 3 5
DSP UP       6 3 1 4 2

FORMAR NUMEROS COM POV, MULTIPLEXANDO:
0 = 0 + 1 + 2 + 3 + 4 + 5 ou 1+2+4+8+16+32 
Ligando todos direto: 255&~(1<<0|1<<2|1<<3|1<<4|1<<5|1<<6)
Multiplexando: 
ZERO = 1<<0|1<<1|1<<2|1<<3|1<<4|1<<5;
E escrevendo para o display:
255^(6<<ZERO);
*/

uint8_t value = 255;
uint8_t pos   = 0;
uint8_t speed = 1000;

struct numbers{
    uint8_t ZERO = 1<<0|1<<1|1<<2|1<<3|1<<4|1<<5;
    uint8_t UM   = 1<<4|1<<5;
    uint8_t DOIS = 1<<3|1<<4|1<<6|1<<1|1<<0;
} number;


void setup() {
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(0x20);
  Wire.write(0xFF);
  Wire.endTransmission();
  delay(2000);
}

void showNumber(uint8_t num){
    uint8_t toWrite = num&(1<<pos);
    value = 255^toWrite;
    Wire.beginTransmission(0x20);
    Wire.write(value);
    Wire.endTransmission();
    pos = pos+1 > 7 ? 0 : pos+1;
    if (toWrite > 0){
        delay(1);
    }
}

void pov(){
    value = 255^(1<<pos);
     Wire.beginTransmission(0x20);
     Wire.write(value);
     Wire.endTransmission();
     pos = pos+1 > 7 ? 0 : pos+1;
     delay(speed);

    speed = speed > 2 ? speed-1 : 1;
}

void incremental(){
  value = value^(1<<pos);
  Serial.println(value);
  Wire.beginTransmission(0x20);
  Wire.write(value);
  Wire.endTransmission();
  pos = pos+1 > 7 ? 0 : pos+1;
  delay(1000);
}

void loop() {
    showNumber(number.DOIS);
}

Vídeo

Vou subir um vídeo mostrando e explicando os conceitos utilizados. Se tiver dúvidas sobre o uso de bitwise, recomendo a leitura desse artigo. Se preferir um vídeo sobre bitwise, no meu curso de Raspberry Pi eu deixei aberta a aula completa sobre bitwise, acesse através desse link. Se quiser adquirir o curso, utilize o cupom DOBITAOBYTE para obter o curso por R$21,00.

O vídeo relacionado ao artigo estará disponível em nosso canal Dobitaobytebrasil no Youtube. Se não é inscrito, inscreva-se e clique no sininho para receber notificações. Ah, e não se esqueça de deixar um like no vídeo, ok?

Provavelmente no final da página aparecerão algumas sugestões de artigos relacionados que podem lhe ser útil, dê uma conferida.

Até a próxima!

Djames Suhanko

Sobre o autor: Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

2 thoughts on “Multiplexação e POV com PCF8574 e display de 7 segmentos

Fechado para comentários.