Hallo,
damit ihr einmal seht was ich treibe - eine Spielerei.
Alps Led Animation Alps Led Animation - YouTube
Serenifly:
Für mich ist da leider nichts offensichtlich. Tut mir leid. Wenn ich nur byte verwende wo soll dann int herkommen. Du hast das nun versucht zu erklären. Ich nehme das zur Kenntnis. Verstanden habe ich das Problem noch nicht wirklich. Aber ein klein wenig.
combie:
Ich habe versucht alles in eine Struktur zu packen was zusammengehört wie von Serenifly seit Jahren gefordet. Für mich ist das eine Punktmatrix. Die sprechenden Namen für Segmente und Digits sind besser lesbar als irgendwelche Zahlen. Deswegen habe ich das angelegt und angewendet.
Mit dem LED Array kann ich der Reihenfolge nach über einen Index auf alle nacheinander zugreifen.
Die Codeduplikate sind mir schon länger im Weg. Ich dachte ein Umbau von vielen if auf switch case lässt mich das Offensichtliche besser erkennen. Aber dann kam das Zugriffsproblem dazwischen. Womit erstmal Experimente mit enum oder constexpr angesagt waren.
Aktuell sieht der Aufbau so aus. Was sollte ich ändern?
struct t_setup
{
const byte CLK = 24;
const byte CS = 25;
const byte MOSI = 26;
enum seg {
DP = 128, // Bit.7 - Datenblatt Tabelle 6
A = 64,
B = 32,
C = 16,
D = 8,
E = 4,
F = 2,
G = 1 // Bit.0
};
enum digit {
D0 = 0x01,
D1 = 0x02,
D2 = 0x03,
D3 = 0x04
};
void shift_out( byte adresse, byte daten )
{ // Bits rausschieben, MSB first
uint16_t data = 0;
data = (data | adresse) << 8;
data = data | daten;
digitalWrite(CS, LOW);
for (uint8_t i = 0; i < 16; i++) {
if (data & 0x8000) { // nur oberstes Bit betrachten
digitalWrite(MOSI, HIGH); // und Datenleitung entsprechend setzen
}
else {
digitalWrite(MOSI, LOW);
}
digitalWrite(CLK, HIGH); // Takt erzeugen
data = data << 1; // nächstes Bit links schieben
digitalWrite(CLK, LOW);
}
digitalWrite(CS, HIGH);
}
void clear_all ()
{
shift_out(digit::D0, 0);
shift_out(digit::D1, 0);
shift_out(digit::D2, 0);
shift_out(digit::D3, 0);
}
} MAX7221;
struct t_led
{
const byte digit;
const byte segment;
};
const t_led LED[] = {
{MAX7221.digit::D0, MAX7221.seg::A}, // LED 1
{MAX7221.digit::D1, MAX7221.seg::A},
{MAX7221.digit::D2, MAX7221.seg::A},
{MAX7221.digit::D3, MAX7221.seg::A},
{MAX7221.digit::D0, MAX7221.seg::B}, // LED 5
{MAX7221.digit::D1, MAX7221.seg::B},
{MAX7221.digit::D2, MAX7221.seg::B},
{MAX7221.digit::D3, MAX7221.seg::B},
{MAX7221.digit::D0, MAX7221.seg::C},
{MAX7221.digit::D1, MAX7221.seg::C}, // LED 10
{MAX7221.digit::D2, MAX7221.seg::C},
{MAX7221.digit::D3, MAX7221.seg::C},
{MAX7221.digit::D0, MAX7221.seg::D},
{MAX7221.digit::D1, MAX7221.seg::D},
{MAX7221.digit::D2, MAX7221.seg::D}, // LED 15
{MAX7221.digit::D3, MAX7221.seg::D},
{MAX7221.digit::D0, MAX7221.seg::E},
{MAX7221.digit::D1, MAX7221.seg::E},
{MAX7221.digit::D2, MAX7221.seg::E},
{MAX7221.digit::D3, MAX7221.seg::E}, // LED 20
{MAX7221.digit::D0, MAX7221.seg::F},
{MAX7221.digit::D1, MAX7221.seg::F},
{MAX7221.digit::D2, MAX7221.seg::F},
{MAX7221.digit::D3, MAX7221.seg::F},
{MAX7221.digit::D0, MAX7221.seg::G}, // LED 25
{MAX7221.digit::D1, MAX7221.seg::G},
{MAX7221.digit::D2, MAX7221.seg::G},
{MAX7221.digit::D3, MAX7221.seg::G},
{MAX7221.digit::D0, MAX7221.seg::DP},
{MAX7221.digit::D1, MAX7221.seg::DP}, // LED 30
{MAX7221.digit::D2, MAX7221.seg::DP} // LED 31
};
const byte ANZAHL_LED = sizeof(LED) / sizeof(t_led);
