This page is also available in 3 other languages

shiftOut()

[I/O Avanzato]

Descrizione

Fa "scorrere" un byte di dati, inviandolo dall’arduino ad un dispositivo esterno, un bit alla volta. Può partire sia dal bit più significativo ( il primo a sinistra ) che dal meno significativo ( l’ultimo a destra ). Ogni bit viene assegnato a turno al pin specificato, dopo di che viene generato un impulso sul pin di clock ( portato prima nello stato HIGH, poi LOW ) per indicare che il bit è disponibile.

Se ti stai interfacciando con un dispositivo che è controllato dalle transizioni crescenti del segnale di clock ( LOW → HIGH ), dovrai assicurarti che il pin di clock sia nello stato LOW prima di effettuare la prima chiamata a shiftIn(), ad esempio con una chiamata a digitalWrite(clockPin, LOW).

NOTA: questa è un’implementazione software; Arduino fornisce anche una libreria SPI che usa l’implementazione hardware, che è piu veloce ma funziona solo su pin specifici.

Sintassi

shiftOut(dataPin, clockPin, bitOrder, dati)

Parametri

dataPin: il pin al quale inviare i dati (int)

clockPin: il pin che invia l’impulso dopo che il dataPin è stato impostato al valore corretto (int)

bitOrder: l’ordine in cui far "scorrere" i bit; può essere MSBFIRST oppure LSBFIRST. ( Prima i bit più significativi, oppure, Prima i bit meno significativi )

dati: i dati da inviare. (byte)

Restituisce

Nulla

Codice di esempio

Per il circuito di accompagnamento, vedi il tutorial su come controllare un registro a scorrimento 74HC595.

//**************************************************************//
//  Nome    : shiftOutCode, Hello World                         //
//  Autore  : Carlyn Maw,Tom Igoe                               //
//  Data    : 25 Oct, 2006                                      //
//  Versione: 1.0                                               //
//  Note    : Codice per usare un registro a scorrimento        //
//          : 74HC595 per contare da 0 a 255                    //
//          :                                                   //
//          : 2017-11-13                                        //
//          : Tradotto da Giuseppe Masino ( qub1750ul )         //
//****************************************************************

//Pin di arduino connesso al pin ST_CP del 74HC595
int latchPin = 8;
//Pin di arduino connesso al pin SH_CP del 74HC595
int clockPin = 12;
//Pin di arduino connesso al pin DS del 74HC595
int dataPin = 11;

void setup() {
  //Imposta i pin come output poichè sono usati nel loop principale
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  //routine di conteggio
  for (int j = 0; j < 256; j++) {
    //manda a massa latchPin e mantienilo così mentre trasmetti
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, j);
    //imposta latchPin a HIGH per segnalare al chip
    //che può smettere di rimanere in ascolto per altre informazioni
    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
}

Note e Avvertimenti

dataPin e clockPin devono essere gia configurati come output attraverso una chiamata a pinMode().

shiftOut attualmente è scritto per mandare in uscita 1 byte ( 8 bit ) per cui richiede un’operazione a due fasi per valori più grandi di 255.

// Fai questo per MSBFIRST
int data = 500;
// manda in uscita i bit più significativi
shiftOut(dataPin, clock, MSBFIRST, (dati >> 8));
// manda in uscita i bit meno significativi
shiftOut(dataPin, clock, MSBFIRST, dati);

// Oppure questo per LSBFIRST
data = 500;
// manda in uscita i bit meno significativi
shiftOut(dataPin, clock, LSBFIRST, dati);
// manda in uscita i bit più significativi
shiftOut(dataPin, clock, LSBFIRST, (dati >> 8));