Skip to Content

Mais Entradas com o Shift Register 74HC165

Mais Entradas com o Shift Register 74HC165

Neste tutorial vou mostrar como adicionar mais entradas ao seu Arduino ou ESP8266/ESP32 usando o Shift Register 74HC165.

O popular Arduino UNO tem 14 pinos GPIO que pode usar para entrada (ou saída) de dados. Muitas vezes isto é suficiente, mas por vezes precisa de mais. Poderia comprar um Arduino mais caro como um  Arduino Mega  com 54 pinos GPIO ou um  GPIO expander board . Mas a forma mais económica é usar um Shift Register como o  74HC165 .

O 74HC165 fornece 8 entradas, utiliza apenas 3 pinos do seu Arduino e pode ser encadeado para ler quantas entradas quiser. A única desvantagem é que é mais lento do que usar diretamente os pinos GPIO do Arduino. As aplicações mais comuns são a descodificação de teclados ou quando tem muitos sensores digitais.

Vamos começar pelos componentes necessários antes de analisar em detalhe o funcionamento do Shift Register 74HC165.

Componentes Necessários

Usei um Arduino Uno para este projeto, mas qualquer outra placa Arduino, ou placa ESP8266/ESP32, funcionará igualmente bem. Indiquei um conjunto de botões, mas na minha montagem usei um DIP switch, pois é mais compacto. No entanto, botões normais também servem.

Arduino

Arduino Uno

Dupont wire set

Conjunto de Cabos Dupont

Half_breadboard56a

Breadboard

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

74HC165 Shift Register

Shift Register 74HC165

Kit de Resistores & LED

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Função do Shift Register 74HC165

O 74HC165 é um shift register de 8 bits com carga paralela, que lê 8 entradas digitais em paralelo e depois as envia em série por um único pino. Precisa de um sinal de clock para temporizar o envio dos 8 bits para a saída série, e outro sinal para controlar o carregamento dos dados de entrada.

Isto significa que, com três pinos e um 74HC165, pode ler até 8 entradas digitais. No entanto, pode também encadear vários 74HC165 e assim ler um número praticamente ilimitado de entradas digitais, continuando a usar apenas três pinos do seu microcontrolador!

Diagrama Funcional em Bloco

A imagem abaixo mostra o Diagrama Funcional em Bloco do Shift Register 74HC165. Pode ver as 8 entradas digitais paralelas (A…H) no topo. A saída série Q H e o seu complemento Q̅ H estão à direita. E ao centro encontra os latches ( flip-flops ) onde os dados de entrada são carregados.

Functional Block Diagram of the 74HC165 Shift Register
Diagrama Funcional em Bloco do Shift Register 74HC165 ( source )

Os pinos de controlo estão à esquerda. SH/L̅D̅ ativa as 8 entradas digitais quando está em nível baixo. CLK (ou CLK INH) envia os dados um a um para a saída série Q H . E SER é a entrada série usada ao encadear vários Shift Registers 74HC165.

Diagrama lógico

A imagem seguinte mostra o diagrama lógico do processo. O sinal CLK temporiza o envio das entradas digitais (A…H) para a saída série Q H e o seu inverso Q̅ H .

Logic diagram of the 74HC165 Shift Register
Diagrama lógico do Shift Register 74HC165 ( source )

O sinal de clock é desativado enquanto o clock-inhibit (CLK INH) estiver em nível alto. Da mesma forma, para carregar as entradas digitais, o SH/L̅D̅ tem de ir para nível baixo. O SER só é usado ao encadear vários Shift Registers.

Resumindo, para enviar as 8 entradas digitais A…H para a saída série Q H precisamos de realizar os seguintes passos.

  1. Colocar SH/L̅D̅ em nível baixo para carregar os dados
  2. Colocar SH/L̅D̅ novamente em nível alto
  3. Repetir 8 vezes os seguintes passos
    • Colocar CLK em nível alto para enviar os dados
    • Colocar CLK novamente em nível baixo

O CLK INH não é necessário e pode ficar sempre em nível baixo. Além disso, ao usar apenas um Shift Register 74HC165, a entrada SER não é utilizada.

Pinout

Na imagem abaixo encontra o Pinout do Shift Register 74HC165. A alimentação é feita através de V CC e GND. A tensão de alimentação V CC pode variar entre 2V e 6V, e a tensão de saída no pino Q H é determinada por V CC .

Pinout of the 74HC165 Shift Register
Pinout do Shift Register 74HC165 ( source )

A função dos outros pinos já foi explicada acima, mas a tabela seguinte resume as funções de todos os pinos. Pode encontrar mais detalhes no Datasheet for the 74HC165 Shift Register .

Pin functions of the 74HC165 Shift Register
Funções dos pinos do Shift Register 74HC165 ( source )

Na próxima secção, vamos ligar o Shift Register 74HC165 a um Arduino.

Ligar o Shift Register 74HC165 ao Arduino

Para simplificar, vamos ligar o 74HC165 ao Arduino sem sinais nos pinos de entrada de dados A…H, para já. A imagem abaixo mostra a cablagem deste primeiro passo.

Connecting the 74HC165 Shift Register to Arduino
Ligar o Shift Register 74HC165 ao Arduino

Comecemos pelas ligações de alimentação. Ligue um fio preto do pino GND do Arduino ao rail negativo da breadboard. Depois use um fio vermelho para ligar os 5V do Arduino ao rail positivo. Em seguida, ligue os dois rails negativos da breadboard com um fio preto. Não usamos o segundo rail positivo, por isso não é preciso ligação aí.

Agora, vamos ligar a alimentação do 74HC165. Ligue o pino 8 (GND) do 74HC165 ao rail negativo (fio preto) e o pino 16 (V CC ) ao rail positivo (fio vermelho).

Por fim, os fios de sinal. Não usamos o CLK INH no pino 15, por isso ligamo-lo diretamente ao rail negativo (fio preto). O SH/L̅D̅ no pino 1 liga-se ao pino 3 do Arduino (fio verde). O sinal CLK no pino 2 liga-se ao pino 2 do Arduino (fio laranja). E a saída série Q H no pino 9 liga-se ao pino 4 (fio amarelo).

E estas são as ligações necessárias para controlar o 74HC165 e obter dados dele. Na próxima secção vamos ligar alguns botões como entradas digitais aos pinos de entrada.

Ligar Botões ao Shift Register 74HC165

Podíamos ligar qualquer tipo de sinal digital aos pinos de entrada (A…H) do 74HC165. Mas, para experimentar, vamos ligar alguns botões. E vamos começar por ligar apenas um botão. O diagrama abaixo mostra o mesmo circuito anterior, mais a ligação de um botão.

Connecting a button to the 74HC165 Shift Register
Ligar um botão ao Shift Register 74HC165

O botão está ligado em pull-down configuration com uma resistência de 10KΩ. Isto significa que, quando o botão é pressionado, o sinal é puxado para o GND. Para isso, ligamos um pino do botão ao rail positivo (fio vermelho) e o pino oposto ao rail negativo através da resistência de 10KΩ.

A saída do botão é ligada à entrada digital A no pino 11 do 74HC165 (fio roxo). Note que a outra ponta do fio roxo está ligada ao mesmo pino da resistência, pois a ligação interna do botão é a seguinte:

Internal wiring of Push Button
Ligação interna do Push Button

Certifique-se de inserir o botão na orientação correta na breadboard. E se precisar de mais informações sobre botões, veja o nosso tutorial How to use a Push Button with Arduino.

Note que também poderia ligar o botão numa configuração pull-up, mas a saída em Q H ficaria invertida. Para compensar, pode usar a saída complementar Q̅ H para inverter novamente ou tratar a inversão no código.

Ligar vários botões

O diagrama abaixo mostra como ligar mais 7 botões para criar sinais para todas as 8 entradas digitais A…H do 74HC165. Todos são ligados da mesma forma que o botão único acima, apenas as saídas vão para as outras entradas B…H do 74HC165 (fios roxos).

Connecting multiple buttons to the 74HC165 Shift Register
Ligar vários botões ao Shift Register 74HC165

Como pode ver, são bastantes fios ; ) Vamos ver o que é preciso fazer para ler o estado destes botões.

Código para ler Botões com o Shift Register 74HC165

Nesta secção vamos ler o estado dos botões ligados ao 74HC165. O código é simples e segue os passos definidos pelo diagrama lógico do 74HC165:

  1. Colocar SH/L̅D̅ em nível baixo para carregar os dados
  2. Colocar SH/L̅D̅ novamente em nível alto
  3. Repetir 8 vezes os seguintes passos
    • Colocar CLK em nível alto para enviar os dados
    • Colocar CLK novamente em nível baixo

Veja primeiro o código completo abaixo e depois discutimos os detalhes.

const int dataPin = 4;   // QH
const int clockPin = 2;  // CLK
const int latchPin = 3;  // SH/LD
  
void setup() {
  Serial.begin(9600);
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}
 
void loop() {
  // Load input bits into latches
  digitalWrite(latchPin, LOW);
  digitalWrite(latchPin, HIGH);
 
  for (int i = 0; i < 8; i++) {
    int bit = digitalRead(dataPin);
    Serial.print(bit ? "1" : "0");

    // Shift out the next bit to QH
    digitalWrite(clockPin, HIGH); 
    digitalWrite(clockPin, LOW);
  }
 
  Serial.println();
  delay(1000);
}

No excerto de código acima, estamos a ler 8 bits de entrada digital do Shift Register 74HC165 e a imprimi-los a cada segundo.

Constantes e Variáveis

Começamos por definir as constantes dataPin , clockPin , e latchPin que representam os pinos ligados aos pinos de dados (QH), clock (CLK) e latch (SH/LD) do Shift Register 74HC165. Note que pode usar outros pinos do Arduino. Apenas certifique-se que a cablagem e o código coincidem.

const int dataPin = 4;   // QH
const int clockPin = 2;  // CLK
const int latchPin = 3;  // SH/LD

Função setup

Na função setup() , inicializamos a comunicação série a 9600 bauds. Também configuramos o dataPin como INPUT e o clockPin e latchPin como OUTPUT, pois vamos ler dados do pino de dados e controlar os pinos de clock e latch.

void setup() {
  Serial.begin(9600);
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}

Função loop

Na função loop() , primeiro carregamos os bits de entrada nos latches do shift register, alternando o pino de latch.

void loop() {
  digitalWrite(latchPin, LOW);
  digitalWrite(latchPin, HIGH);

  ...
}

Depois, percorremos cada um dos 8 bits, lemos os seus valores do pino de dados, imprimimos (como ‘1’ ou ‘0’), e enviamos o bit seguinte alternando o pino de clock. Por fim, adicionamos um atraso de 1 segundo entre cada ciclo de leitura.

void loop() {
  digitalWrite(latchPin, LOW);
  digitalWrite(latchPin, HIGH);

  for (int i = 0; i < 8; i++) {
    int bit = digitalRead(dataPin);
    Serial.print(bit ? "1" : "0");

    digitalWrite(clockPin, HIGH); 
    digitalWrite(clockPin, LOW);
  }

  Serial.println();
  delay(1000);
}

Com este código e circuito pode agora ler 8 entradas digitais usando apenas três pinos do seu Arduino. E, claro, isto funciona da mesma forma num ESP8266 ou ESP32. Se correr este código, deverá ver uma saída semelhante a esta no seu Serial Monitor.

Output on Serial Monitor
Saída no Serial Monitor

O padrão de bits real vai depender dos botões que pressionar enquanto o programa está a correr. Como referi, usei um DIP switch e liguei apenas os primeiros quatro para testar o circuito e o código. A imagem abaixo mostra a minha breadboard com o circuito.

Arduino with 74HC165 Shift Register and DIP switch
Arduino com Shift Register 74HC165 e DIP switch

Com o circuito e código acima pode ler até 8 entradas digitais. Se precisar de ainda mais entradas, pode encadear vários Shift Registers 74HC165. Como isso se faz é o tema da próxima secção.

Encadeamento de Shift Registers 74HC165

Pode ligar a saída série Q H de um Shift Register 74HC165 à entrada série SER de outro Shift Register 74HC165 para os encadear. Isto permite-lhe ler 16 em vez de 8 entradas digitais.

Chaining two 74HC165 via QH and SER
Encadeamento de dois 74HC165 via Q H e SER

E não tem de ficar por aí. Pode continuar a encadear quantos quiser, permitindo-lhe um número praticamente ilimitado de entradas digitais. E a melhor notícia é que todos esses Shift Registers 74HC165 são controlados pelos mesmos três pinos.

O diagrama abaixo mostra como ligar 16 botões como entradas a um Arduino usando dois Shift Registers 74HC165. Parece complicado, mas é apenas uma duplicação da cablagem anterior.

Chaining two 74HC165 two read 16 Buttons
Encadeamento de dois 74HC165 para ler 16 Botões

Note que o CLK e o SH/LD dos 74HC165 estão ligados em paralelo e a única diferença em relação à ligação de um único 74HC165 é o encadeamento via Q H e os pinos SER.

Código para ler de Shift Registers 74HC165 encadeados

O código para ler dados de dois Shift Registers 74HC165 encadeados é uma extensão simples do código para ler de um único Shift Register 74HC165. Veja abaixo:

const int dataPin = 4;   // QH
const int clockPin = 2;  // CLK
const int latchPin = 3;  // SH/LD

const byte numBits = 16;  
  
void setup() {
  Serial.begin(9600);
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}
 
void loop() {
  digitalWrite(latchPin, LOW);
  digitalWrite(latchPin, HIGH);
 
  for (int i = 0; i < numBits; i++) {
    int bit = digitalRead(dataPin);
    Serial.print(bit ? "1" : "0");

    digitalWrite(clockPin, HIGH); 
    digitalWrite(clockPin, LOW);
  }
 
  Serial.println();
  delay(1000);
}

Basta adicionar uma constante numBits que nos permite definir quantos bits queremos ler. No caso de um único Shift Register 74HC165 seriam 8 bits. Se usarmos dois Shift Registers podemos ler 8 * 2 = 16 bits, e assim sucessivamente.

Usar a ArduinoShiftIn para ler de Shift Register 74HC165

Se não quiser escrever o seu próprio código para controlar o Shift Register 74HC165, existe uma pequena biblioteca que o ajuda. Chama-se ArduinoShiftIn mas também funciona num ESP32 ou ESP8266. É especialmente útil quando encadeia vários Shift Registers 4HC165 e quer ler os dados de entrada para uma única variável.

Para instalar a biblioteca ArduinoShiftIn vá ao ArduinoShiftIn github repo , faça download do Zip file e depois adicione-a ao seu Arduino IDE via: Sketch > Include Library > Add .ZIP > selecione o ficheiro zip.

O exemplo de código seguinte é de um dos exemplos da ArduinoShiftIn e mostra como ler de dois Shift Registers 74HC165:

#include "ShiftIn.h"

ShiftIn<2> shift;  // 2 = two 74HC165 

void setup() {
  Serial.begin(9600);
  // pLoadPin, clockEnablePin, dataPin, clockPin
  shift.begin(8, 9, 11, 12);
}

void displayValues() {
  for(int i = 0; i < shift.getDataWidth(); i++)
    Serial.print(shift.state(i));
  Serial.println();
}

void loop() {
  if(shift.update()) 
    displayValues();
  delay(1);
}

Tem de especificar o número de Shift Registers 74HC165 encadeados ao declarar o objeto shift :

ShiftIn<2> shift;

Na função setup estabelecemos a comunicação série e definimos os pinos para controlar o Shift Register 74HC165.

void setup() {
  Serial.begin(9600);
  // pLoadPin, clockEnablePin, dataPin, clockPin
  shift.begin(8, 9, 11, 12);
}

Note que a biblioteca ArduinoShiftIn usa os quatro pinos, enquanto nos exemplos de código e circuito ligámos o CLK INH ao GND e não o usámos. Aqui tem de definir o clockEnablePin (= CLK INH) e tem de o ligar.

A função displayValues() , como o nome indica, mostra os valores de entrada lidos do v

void displayValues() {
  for(int i = 0; i < shift.getDataWidth(); i++)
    Serial.print(shift.state(i));
  Serial.println();
}

A função shift.getDataWidth() recebe o número de bits a ler. Não precisa de multiplicar o número de shift registers por 8 manualmente. E shift.state() devolve o estado da entrada número i .

Por fim, a função loop. Chama displayValues() , mas só se o estado de alguma das entradas tiver mudado, o que é sinalizado pela função shift.update() .

void loop() {
  if(shift.update()) 
    displayValues();
  delay(1);
}

Note, no entanto, que shift.update() não é orientada a eventos e simplesmente faz polling ao estado dos Shift Registers 74HC165 à velocidade do loop – neste exemplo com um atraso de 1 microssegundo.

A cablagem necessária é essencialmente a mesma de antes, com a diferença de que são usados pinos de controlo diferentes e que tem de ligar o CLK INH ao Arduino.

Wiring of two 74HC165 for the  ArduinoShiftIn library
Cablagem de dois 74HC165 para a biblioteca ArduinoShiftIn

Resumindo, a biblioteca ArduinoShiftIn simplifica o código para ler entradas de Shift Registers 74HC165 encadeados, mas tem a pequena desvantagem de ocupar mais um pino GPIO (CLK INH). No entanto, se encadear muitos (até 8) Shift Registers isso normalmente não é problema, pois terá bastantes entradas adicionais.

Conclusões

Neste tutorial aprendeu a usar o Shift Register 74HC165 para adicionar um número arbitrário de entradas digitais ao seu microcontrolador. O circuito e código apresentados usaram um Arduino, mas funcionam também num ESP32 e ESP8266.

Em contraste com GPIO expanders que pode ler e escrever entradas e saídas analógicas, o Shift Register 74HC165 está limitado apenas à leitura de entradas digitais. No entanto, o 74HC165 é geralmente muito mais barato do que uma placa expansora de GPIO.

Se também quiser escrever muitas saídas, veja o nosso tutorial More Arduino Outputs With 74HC595 Shift Register , que usa outro tipo de Shift Register para escrever dados em vez de os ler.

Se precisar de entradas e saídas analógicas, um expansor de GPIO como o MCP23017, por exemplo, é a melhor escolha. Veja o nosso tutorial Using GPIO Expander MCP23017 With Arduino , para mais informações sobre isto.

E agora, sinta-se à vontade para construir projetos com um número massivo de entradas e saídas ; )

Perguntas Frequentes

Aqui estão algumas perguntas frequentes sobre o uso do Shift Register 74HC165.

Q: O que é um shift register 74HC165?

R: O 74HC165 é um shift register de entrada paralela/saída série que permite expandir o número de entradas digitais no seu Arduino usando apenas três pinos.

Q: Quantas entradas pode o shift register 74HC165 suportar?

R: O shift register 74HC165 pode suportar até 8 entradas digitais, o que é útil para projetos que requerem múltiplos dispositivos de entrada.

Q: Como ligo o shift register 74HC165 ao meu Arduino?

R: Pode ligar o shift register 74HC165 ao seu Arduino ligando as entradas paralelas aos seus dispositivos de entrada e conectando o pino de saída série aos pinos digitais do Arduino.

Q: Posso encadear vários shift registers 74HC165 juntos?

R: Sim, pode encadear vários shift registers 74HC165 para expandir ainda mais o número de entradas, permitindo-lhe ligar mais dispositivos de entrada ao seu Arduino.

Q: Quais são as principais vantagens de usar o shift register 74HC165 em projetos Arduino?

R: As principais vantagens de usar o shift register 74HC165 incluem expandir o número de entradas sem ocupar todos os pinos do Arduino, simplificar a cablagem ao reduzir o número de ligações necessárias e permitir a ligação eficiente de múltiplos dispositivos de entrada.

Q: O shift register 74HC165 pode ser usado com outros microcontroladores além do Arduino?

R: Sim, o shift register 74HC165 pode ser usado com outros microcontroladores que suportem operações de entrada/saída digital.

Q: Posso usar o shift register 74HC165 em projetos que requerem monitorização de entradas em tempo real?

R: Sim, o shift register 74HC165 é adequado para projetos que requerem monitorização de entradas em tempo real, pois permite a leitura rápida de múltiplas entradas digitais.

Q: Existem dicas comuns de resolução de problemas ao trabalhar com o shift register 74HC165?

R: Dicas comuns de resolução de problemas ao trabalhar com o shift register 74HC165 incluem verificar cuidadosamente as ligações, garantir que os sinais de clock e latch estão corretos e confirmar que o formato dos dados de entrada no seu código corresponde à configuração do shift register.