shiftOut()

[Entradas e Saídas Avançadas]

Descrição

Transfere um byte de dados um bit de cada vez. Começa com ou o bit mais significante (o mais à esquerda) ou o menos significante (mais à direita). Cada bit é escrito em sequência em um pino data, logo após o pino clock é pulsado (colocado em HIGH, depois LOW) para indicar que aquele bit está disponível.

Nota - se você está conectando um dispositivo que é sincronizado pela borda de subida do clock, irá precisar fazer com que o pino clock seja low antes de chamar shiftOut(), ex. com digitalWrite(clockPin, LOW).

Essa é uma implementação por software; O Arduino também provê uma biblioteca SPI que faz a implementação em hardware, que é mais rápida, mas apenas funciona em pinos específicos.

Sintaxe

shiftOut(dataPin, clockPin, bitOrder, value)

Parâmetros

dataPin: o pino no qual transferir cada bit (int)

clockPin: o pino a ser pulsado uma vez que o pino data estiver com o bit a ser trasnferido (int)

bitOrder: em que ordem receber os bits; pode ser MSBFIRST ou LSBFIRST. Respectivamente, primeiro o bit mais significativo (Most Significant Bit First), ou o primeiro o bit menos significativo (Least Significant Bit First)

value: o valor a ser transferido. (byte)

Retorna

Nada

Código de Exemplo

//**************************************************************//
//  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 a ST_CP no 74HC595
int latchPin = 8;
//Pino conectado a SH_CP no 74HC595
int clockPin = 12;
//Pino conectado a DS no 74HC595
int dataPin = 11;

void setup() {
  //configura os pinos usados no loop principal como saídas
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  //rotina de contagem de 0 até 255
  for (int j = 0; j < 256; j++) {
    //coloca e mantém o pino latch em low enquanto ocorre a transmissão
    digitalWrite(latchPin, LOW);

    //transmite o valor de j, a começar pelo bit menos significativo
    shiftOut(dataPin, clockPin, LSBFIRST, j);

    //retorna o pino latch para high para sinalizar ao chip
    //que esse não precisa mais esperar por informação
    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
}

Notas e Advertências

Os pinos data e clock devem ser configurados como saídas com uma chamada de pinMode().

A função shiftOut() atualmente funciona para transferir apenas 1 byte (8 bits) então requer uma operação em dois passos para transferir valores maiores que 255.

// Para serial MSBFIRST, faça:
int data = 500;
// transfere o byte mais significativo
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
// trasnfere o byte menos significativo
shiftOut(dataPin, clock, MSBFIRST, data);

// Para serial LSBFIRST, faça:
data = 500;
// transfere o byte menos significativo
shiftOut(dataPin, clock, LSBFIRST, data);
// transfere o byte mais significativo
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));

Ver Também

  • LANGUAGE noTone()

  • LANGUAGE pulseIn()

  • LANGUAGE pulseInLong()

  • LANGUAGE shiftIn()

  • LANGUAGE tone()