O registrador de deslocamento (shift register) é um circuito integrado composto por circuitos lógicos em série que permitem salvar estados altos ou baixos na memória. Ele pode ser usado para controlar LEDs ou para obter o estado de vários sensores.
Material
- Computador
- Arduino UNO
- Cabo USB A Macho/B Macho
- Registrador de deslocamento 74HC595
Princípio de funcionamento
O registrador de deslocamento é um componente eletrônico que contém flip-flops síncronos. Estes são circuitos lógicos que guardam na memória um estado alto ou baixo (como um bit), ligados pelo mesmo relógio.
No caso do registrador de deslocamento 74HC595, as saídas paralelas fornecem uma tensão de 5V no estado alto e 0V no estado baixo.
Esquema
O registrador de deslocamento requer 3 pinos de saída de um microcontrolador. É possível gerir vários registradores ligados em série.
- GND ligado à terra do circuito integrado;
- Pino de alimentação Vcc. Normalmente ligado a 5V;
- SH_CP ou RCLK shift register clock input. O sinal do relógio do registrador que determina salvar na memória ou não;
- ST_CP ou SRCLK storage register clock input. O sinal do relógio de armazenamento que define em qual memória escrever ou qual memória ler;
- DS ou SER serial data input. Sinal contendo os dados a serem registrados (UP ou DOWN);
- Q0-Q7 parallel data output. Pinos de saída do registrador de deslocamento;
- OE Output enable ativa o LOW. Pino ligado ao GND para ativar as saída;
- MR Master reset, ativa o LOW. Pino de reinicialização. Ligado a 5V;
- Q7′ serial data output (pino utilizado apenas se vários registradores estiverem ligados em série).
Código
Para comunicar com o registrador de deslocamento, faremos um pequeno malabarismo com os seus pinos de entrada. A fim de escrever no registro, precisamos colocar o pino RCLK em baixo. Para escrever nos flip-flops, temos de passar o relógio de armazenamento para baixo A cada pulsação do relógio, passamos para o flip-flop seguinte. Para simplificar o nosso código, vamos definir este procedimento na função writeRegister().
Para mostrar o princípio de um registrador de deslocamento, um exemplo comum é conectar LEDs às suas saídas e fazê-los piscar um após o outro.
//Constants #define number_of_74hc595s 1 #define numOfRegisterPins number_of_74hc595s * 8 #define SER_Pin D1 #define RCLK_Pin D2 #define SRCLK_Pin D3 //Variables boolean registers [numOfRegisterPins] ={0, 0, 0}; void setup(){ //Init Serial USB Serial.begin(115200); Serial.println(F("Initialize System")); //Init register pinMode(SER_Pin, OUTPUT); pinMode(RCLK_Pin, OUTPUT); pinMode(SRCLK_Pin, OUTPUT); } void loop(){ writeGrpled(); } void clearRegisters(){/* function clearRegisters */ //// Clear registers variables for(int i = numOfRegisterPins-1; i >= 0; i--){ registers[i] = LOW; }} void writeRegisters(){/* function writeRegisters */ //// Write register after being set digitalWrite(RCLK_Pin, LOW); for(int i = numOfRegisterPins-1; i >= 0; i--){ digitalWrite(SRCLK_Pin, LOW); int val = registers[i]; digitalWrite(SER_Pin, val); digitalWrite(SRCLK_Pin, HIGH); } digitalWrite(RCLK_Pin, HIGH); } void setRegisterPin(int index,int value){/* function setRegisterPin */ ////Set register variable to HIGH or LOW registers[index] = value; } void writeGrpled(){/* function writeGrpled */ //// blink leds for(int i = numOfRegisterPins-1; i >= 0; i--){ Serial.print(F("LED "));Serial.print(i);Serial.println(F(" HIGH")); setRegisterPin(i, HIGH); writeRegisters(); delay(200); Serial.print(F("LED "));Serial.print(i);Serial.println(F(" LOW")); setRegisterPin(i, LOW); writeRegisters(); } }
Resultados
Aplicações
- Gerir até 8 LEDs ou sensores usando três pinos de um microcontrolador
- Gerir um display de 7 segmentos ou mais
Fontes
- https://fr.wikipedia.org/wiki/Registre_%C3%A0_d%C3%A9calage
- https://fr.wikipedia.org/wiki/Bascule_(circuit_logique)
- Aprenda a programar com o Arduino
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie