LCD-Lauflicht

Die Tage ist mir mein alter C64 im Keller aufgefallen. Am User-Port hing noch eine selbstgebastelte 8-Bit-LED-Leiste. Ich kann mich noch gut an das Projekt erinnern. Ich wollte unbedingt ein Lauflicht programmieren. Und zwar das von K.I.T.T. Leider waren gerade keine acht gleiche LEDs vorhanden. Aber so etwas lässt sich auch mit einem Display lösen.
Virtuelles 8-Bit LED Lauflicht
Experimente mit 8-Bit
Neben einem Lauflicht lässt sich auch die Arbeitsweise eines Binärzählers besonders anschaulich mit ein paar Leuchtdioden darstellen. Ok in diesem Fall virtuell am Display. Die Darstellung aller Bits der Variable x ist in einer Funktion ausgelagert und kann zur Veranschaulichung verschiedener Bit-Operationen verwendet werden.
Die Anwendung vereint in diesem Fall drei Funktionen (bitte jeweils in der loop() auskommentieren). Lauflicht, Binärzähler und manueller Zähler (steuerbar über die beiden Displaytasten). Hier geht's zum Download.
#include "Display.h"
#include "SPI.h"

#define LCD_BUTTON_LEFT A4
#define LCD_BUTTON_RIGHT A5

const PROGMEM byte ledOn [] = {
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};
const PROGMEM byte ledOff [] = {
  0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF,
};

Display lcd = Display();
byte x = 0;

void setup() {
  lcd.init(20);
  pinMode(LCD_BUTTON_LEFT, INPUT_PULLUP);
  pinMode(LCD_BUTTON_RIGHT, INPUT_PULLUP);
  draw();
}

void loop() {
  //automaticCount();
  //count();
  kitt();
}

void automaticCount() {
  x++;
  draw();
  delay(200);
}

void count() {
  if (!digitalRead(LCD_BUTTON_LEFT)) {
    x--;
    draw();
    delay(200);
  } else if (!digitalRead(LCD_BUTTON_RIGHT)) {
    x++;
    draw();
    delay(200);
  }
}

void kitt() {
  for (byte i=0; i<8; i++) {
    x = 0b00000111<<i;
    draw();
    delay(100);
  }
  for (byte i=0; i<8; i++) {
    x = 0b11100000>>i;
    draw();
    delay(100);
  }
}

void draw() {
  lcd.clearVideoBuffer();
  for (byte i=0; i<8; i++) {
    if (x & (1<<i)) {
      lcd.drawBitmap(120 - (i*16), 20, 8, 8, ledOn);
    } else {
      lcd.drawBitmap(120 - (i*16), 20, 8, 8, ledOff);
    }
  }
  lcd.show();
}

Links und Referenzen: