Continuando a falar sobre o uso do registrador de deslocamento 74hc164. A minha idéia em usar esse carinha é para ligar um display LCD HD4478 ao Arduino sem precisar de muitos pinos.
Um display LCD HD4478, por padrão precisaria de 11 pinos do microcontrolador para funcionar em modo 8-bits com todas as suas funcionalidades, mas com o uso do 74hc164 deu para fazer a ligação usando 4 pinos. Acho que é possível ligar com apenas 3 pinos, estava tentando fazer isso usando o display em modo 4-bits, mas não obtive bons resultados.
Usei o circuito feito pelo Frank Henriquez junto com algumas modificações no código publicado pelo calli no fórum do Arduino. Segue nos links abaixo o esquema e o código.
Esquema de montagem | Código para o Arduino
Esse código não chega nem perto de fazer tudo o que é possível com o LCD, mas aos poucos quero montar uma biblioteca para o Arduino e coloco as funcionalidades mais utilizadas.
O próximo passo agora é usar um botão direcional que comprei na Seeedstudio para controlar as informações que aparecem no display, fazer mudança de menus, selecionar itens, etc.
74hc164, Arduino, HD4478, LCD
Muitas vezes necessitamos de mais portas para nosso projeto do que o microcontrolador pode fornecer, casos de exemplo são matrizes de LEDs, matrizes de botões e displays LCD. Podemos usar um registrador de deslocamento com entrada serial e saída paralela para reduzir a quantidade de pinos usados, liberando os outros pinos para outras atividades. O CI 74hc164 é um registrador de deslocamento que converte a entrada no formato serial para a saída no formato paralelo, muito simples de usar.

Como exemplo, para controlar 8 LEDs ligados no 74hc164 com o Arduino faça as seguintes ligações nos pinos:
- A -> Arduino dataPin
- B -> 5V
- Qa .. Qh -> LEDs
- GND -> GND (duh)
- CLK -> Arduino clockPin
- CLR -> Arduino resetPin
- VCC -> 5V
Os pinos dataPin, clockPin e resetPin são configurados no programa escrito para o Arduino, como mostrado abaixo, e é através deles que vamos controlar o 74hc164. Nesse programa que escrevi, a função initShift inicializa os pinos de controle do 74hc164, o clock e deixa o ci no modo reset. A função sendShift envia um byte que indica quais leds estão ligados e desligados:
int resetPin = 6;
int clockPin = 7;
int dataPin = 5;
void setup() {
initShift(resetPin, clockPin, dataPin);
sendShift(B10101010);
}
void loop() {
}
void initShift(int resetPin, int clockPin, int dataPin) {
pinMode(resetPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
digitalWrite(resetPin, LOW);
digitalWrite(clockPin, LOW);
}
void sendShift(byte message) {
int i;
byte testByte = B00000001;
digitalWrite(resetPin, HIGH);
for(i=0; i <= 7; i++) {
digitalWrite(clockPin, LOW);
digitalWrite(dataPin, (message >> i) & testByte);
digitalWrite(clockPin, HIGH);
}
}
74hc164, Arduino, LCD