Hier der komplette Sketch.
// Laufschrift
// PINs am PCB Board Leiste 1 (LED 4x4 Feld)
// GND
// (leer)
// 11 SH Shift
// 12 ST Store
// 13 DS Date
// (leer)
// VCC
//Pin verbunden mit dem ST_CP vom 74HC595
const byte latchPin = 12;
//Pin verbunden mit dem SH_CP vom 74HC595
const byte clockPin = 11;
//Pin verbunden mit dem DS vom 74HC595
const byte dataPin = 13;
const char zeichenvorrat[] = " ACDFHILOTU!.";
const char anzeigetext[] = " HALLO DU! ";
const byte textlaenge = strlen(anzeigetext);
byte starter = 0;
const byte zeichen[][4] =
{
{B0000, B0000, B0000, B0000}, // Leerzeichen
{B1110, B1010, B1110, B1010}, // A
{B1110, B1000, B1000, B1110}, // C
{B1100, B1010, B1010, B1100}, // D
{B1110, B1000, B1100, B1000}, // F
{B1010, B1010, B1110, B1010}, // H
{B0010, B0010, B0010, B0010}, // I
{B1000, B1000, B1000, B1110}, // L
{B0100, B1010, B1010, B0100}, // O
{B1110, B0100, B0100, B0100}, // T
{B1010, B1010, B1010, B1110}, // U
{B0100, B0100, B0000, B0100}, // !
{B0000, B0000, B0000, B0100} // .
};
void Ausgabe(byte wert)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, wert);
digitalWrite(latchPin, HIGH);
}
void setup() {
// Pins für den 595 setzen
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void multiplexen(char symbol[])
{
byte ausgabe;
byte counter;
for (int i = 0; i < 40; i++)
{
for (byte zeile = 0; zeile < 4; zeile++)
{
if ( zeile == 0 ) counter = B1000;
ausgabe = symbol[zeile];
for (byte led = 0; led < 4; led++)
{
byte pin;
if ( led == 0 ) pin = B0001;
Ausgabe(counter << 4 | (ausgabe & pin));
delayMicroseconds(200);
pin = pin << 1;
}
counter = counter >> 1;
}
}
}
void loop() {
char zeichen1[4] = {0, 0, 0, 0};
char zeichen2[4] = {0, 0, 0, 0};
byte pZeichen = strchr(zeichenvorrat, anzeigetext[starter]) - zeichenvorrat;
if ( pZeichen )
{
for (byte n = 0; n < 4; n++)
{
zeichen1[n] = zeichen[pZeichen][n];
}
}
else
{
for (byte n = 0; n < 4; n++)
{
zeichen1[n] = zeichen[0][n];
}
}
pZeichen = strchr(zeichenvorrat, anzeigetext[starter + 1]) - zeichenvorrat ;
if ( pZeichen )
{
for (byte n = 0; n < 4; n++)
{
zeichen2[n] = zeichen[pZeichen][n];
}
}
else
{
for (byte n = 0; n < 4; n++)
{
zeichen2[n] = zeichen[0][n];
}
}
starter++;
if (starter + 1 == textlaenge) starter = 0;
byte ausgabefeld[4];
for (byte i = 0; i < 4; i++)
{
ausgabefeld[i] = ( zeichen1[i] << 4 ) | zeichen2[i];
}
for (byte i = 0; i < 4; i ++)
{
char plexfeld[4];
for (byte zeile = 0; zeile < 4; zeile++)
{
byte wert = ausgabefeld[zeile];
wert = wert << i;
wert = wert >> 4;
plexfeld[zeile] = wert;
}
multiplexen(plexfeld);
}
}
Das Prinzip ist leicht skalierbar. Sinnvoll lassen sich Lauftexte erst mit 5 Zeilen realisieren. In einer 4*4 Matrix ist z.B. ein „E“ nicht darstellbar. Ich baue gerade einen „Display“ mit 5 Zeichen á 5*3 Pixeln. Dieses soll als Zwischenanzeige für meine ALU fungieren.
Seiten: 1 2