//**************************************************************//
//  Name    : shiftOutCode, Hello World                         //
//  Author  : Carlyn Maw,Tom Igoe                               //
//  Date    : 25 Oct, 2006                                      //
//  Version : 1.0                                               //
//  Notes   : Code for using a 74HC595 Shift Register           //
//          : to count from 0 to 255                            //
//****************************************************************

// Pino conectado ao ST_CP do 74HC595
int latchPin = 8;
// Pino conectado ao SH_CP do 74HC595
int clockPin = 12;
// Pino conectado ao DS do 74HC595
int dataPin = 11;

void setup() {
  // configura pinos como saída pois são endereçados no loop()
  pinMode(latchPin, OUTPUT);
}

void loop() {
  // rotina de contagem
  for (int j = 0; j < 256; j++) {
    // aterre latchPin e mantenha por todo o tempo de transmissão
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, j);   
    // retorna o latchPin para HIGH, para sinalizar 
    // que não é preciso mais escutar a linha
    digitalWrite(latchPin, 1);
    delay(1000);
  }
}

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  // Esta função desloca 8 bits (bit mais significativo primeiro) 
  // na subida do clock
  // O clock quando em LOW está pausado

  // função de configuração interna
  int i = 0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

  // apaga tudo para preparar o registrador
  // para os deslocamentos
  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  // para cada bit no byte myDataOut
  // VEJA QUE a contagem é REGRESSIVA no nosso laço for
  // Quer dizer que %00000001 ou "1" vai atravessar o chip
  // e que o pino Q0 é o que vai acender. 
  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);

    //se o valor passado ao myDataOut e a máscara de bits resultar 
    // verdadeiro então... isto é, se estamos em i=6 e nosso valor é
    // %11010100, o código compara-o com %01000000 
    // e segue a atribuir 1 a pinState.
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else {	
      pinState= 0;
    }

    // Ajusta pino para HIGH ou LOW dependendo de pinState
    digitalWrite(myDataPin, pinState);
    // Registrador desloca os bits na subida do clock
    digitalWrite(myClockPin, 1);
    // Zera o pino de dados após deslocar, para prevenir vazamento
    digitalWrite(myDataPin, 0);
  }

  //pare o deslocamento
  digitalWrite(myClockPin, 0);
} 

Share