shiftOut()

[Advanced I/O]

Beschreibung

Shiftet ein Byte von Daten hinaus, ein Bit pro Zeiteinheit. Beginnt entweder mit dem most significant bit (linkestes Bit) oder dem least significant bit (rechtestes Bit). Für jedes Bit wird der clock pin HIGH geschalten. Anschließend wird das nächste Bit gelesen und der clock pin auf LOW gesetzt.

Wenn du mit einem Gerät arbeitest, das bei steigender Flanke die clock auslöst, musst du darauf achten, dass der clock pin LOW ist, bevor das erste Mal shiftIn() aufgerufen wird. Das ist z.B. möglich mit einem Aufruf von digitalWrite(clockPin, LOW).

Bemerkung: Das ist eine Softwareimplementierung; Arduino bietet auch eine SPI-Bibliothek an, die eine Hardwareimplementierung benutzt. Diese ist zwar schneller, funktioniert aber nur mit spezifischen Pins.

Syntax

shiftOut(dataPin, clockPin, bitOrder, value)

Parameter

dataPin: Der Pin, auf dem jedes Bit ausgegeben wird. Erlaubte Datentypen: int.
clockPin: Der Pin, auf dem das Signal gesetzt wird, um den dataPin zu lesen. Erlaubte Datentypen: int.
bitOrder: Welche Ordnung verwendet werden soll, um zu shiften. Entweder ist dies MSBFIRST oder LSBFIRST. (Most Significant Bit First oder Least Significant Bit First)
value: Die Daten, die hinausgeshiftet werden sollen. Erlaubte Datentypen: byte.

Rückgabewert

Nichts.

Beispielcode

Für eingebaute Schaltkreise beachte das Tutorial, wie man ein 74HC595 Shift-Register verwendet.

//**************************************************************//
//  Name    : shiftOutCode, Hello World, Auf Deutsch übersetzt  //
//  Author  : Carlyn Maw,Tom Igoe                               //
//  Date    : 25 Oct, 2006                                      //
//  Version : 1.0                                               //
//  Notes   : Code, um mit einem 74HC595 Shift Register         //
//          : von 0 to 255 zu zählen                            //
//****************************************************************

//Pin verbunden mit ST_CP des 74HC595
int latchPin = 8;
//Pin verbunden mit SH_CP des 74HC595
int clockPin = 12;
////Pin verbunden mit DS des 74HC595
int dataPin = 11;

void setup() {
  //Pins auf output setzen, weil diese im loop() verwendet werden
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  //Zähler-Routine
  for (int j = 0; j < 256; j++) {
	//Register pin grounden und low halten, solange übertragen wird
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, j);
	//Register pin auf high setzen, um dem Chip zu signalisieren, dass
	//er nicht mehr länger Informationen lesen muss
    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
}

Anmerkungen und Warnungen

Der dataPin und der clockPin müssen vorher als Outputs konfiguriert sein. Dies wird mit dem Aufruf von pinMode() erreicht.

shiftOut shiftet aktuell maximal 1 Byte (8 bits) hinaus. Wenn Werte größer 255 hinausgeshiftet werden sollen, benötigt das Register 2 Schritte.

// Beispiel für MSBFIRST:
int data = 500;
// High byte hinausshiften
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
// Low byte hinausshiften
shiftOut(dataPin, clock, MSBFIRST, data);

// Beispiel für LSBFIRST:
data = 500;
// Low byte hinausshiften
shiftOut(dataPin, clock, LSBFIRST, data);
// Low byte hinausshiften
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));

Siehe auch