Lauf­licht Schieberegister

int BitsSchieben = 8;
int AusgabePin = 9;
int EingangPin = 10;

// Array LEDs leuchten von außen nach innen und zurück
byte AussenNachInnen[] =
{
  B10000001, B01000010, B00100100, B00011000,
  B00100100, B01000010, B10000001
};

void setup()
{
  pinMode(BitsSchieben, OUTPUT);
  pinMode(AusgabePin, OUTPUT);
  pinMode(EingangPin, OUTPUT);
}

void loop()
{
  /*
    Lauflicht vorwärts
    LSBFIRST Bits von rechts ins Register schieben
    dann jeweils 1 Bit nach rechts schieben
    Startpunkt hängt davon ab, an welchen Pins die
    1. Led und die weiteren LEDs gesteckt sind
  */
  byte LED = B10000000;

  // die letzte LED bleibt an
  for (int i = 0; i <= 6; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // Bits von rechts in das Register schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 1 Bit nach rechts schieben
    LED = LED >> 1;
  }

  /*
    durch die Verschiebung ist der aktuelle Stand:
    LED = B00000001
    Lauflicht rückwärts -> 1 Bit nach links schieben
  */
  for (int i = 0; i <= 7; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // Bits von rechts in das Register schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 1 Bit nach links schieben
    LED = LED << 1;
  }

  // Lauflicht 2 LEDs vorwärts
  LED = B11000000;

  for (int i = 0; i <= 2; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // LSBFIRST -> Bits von rechts in das Register schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 2 Bits nach rechts schieben
    LED = LED >> 2;
  }

  // Lauflicht 2 LEDs rückwärts
  for (int i = 0; i <= 3; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // Bits von links in das Register schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 2 Bits nach links schieben
    LED = LED << 2;
  }

  // Lauflicht -> LEDs gehen nach und nach aus
  // LSBFIRST -> Bits von rechts in das Register schieben
  LED = B11111111;

  for (int i = 0; i <= 7; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // Bits in das Schiebregister schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 1 Bit nach rechts schieben
    LED = LED >> 1;
  }

  // LSBFIRST -> Bits von rechts in das Register schieben
  LED = B11111111;
  for (int i = 0; i <= 7; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // Bits in das Schiebregister schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 1 Bit nach links schieben
    LED = LED << 1;
  }

  // LEDS leuchten von außen nach innen und zurück
  // Array AussenNachInnen
  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(AusgabePin, 0);
    shiftOut(EingangPin, BitsSchieben, MSBFIRST, AussenNachInnen[i]);
    digitalWrite(AusgabePin, 1);
    delay(200);
  }

  // alle LEDs blinken
  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(AusgabePin, 0);
    shiftOut(EingangPin, BitsSchieben, MSBFIRST, LED);
    digitalWrite(AusgabePin, 1);
    delay(200);

    // alle Werte umkehren
    LED = ~ LED;
  }

  // MSBFIRST -> Bits von links in das Register schieben
  // jede zweite LED im Wechsel
  LED = B10101010;

  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(AusgabePin, 0);
    shiftOut(EingangPin, BitsSchieben, MSBFIRST, LED);
    digitalWrite(AusgabePin, 1);
    delay(200);

    // alle Werte umkehren
    LED = ! LED;
  }

  // jeweils 2 LEDs im Wechsel
  LED = B11001100;

  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(AusgabePin, 0);
    shiftOut(EingangPin, BitsSchieben, MSBFIRST, LED);
    digitalWrite(AusgabePin, 1);
    delay(200);

    // alle Werte umkehren
    LED = ~ LED;
  }

  // äußere LEDs/innere LEDs im Wechsel
  LED = B11000011;

  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(AusgabePin, 0);
    shiftOut(EingangPin, BitsSchieben, MSBFIRST, LED);
    digitalWrite(AusgabePin, 1);
    delay(200);

    // alle Werte umkehren
    LED = ~ LED;
  }
}

Letzte Aktualisierung: 25. Jul 2023 @ 18:59