Na Gut, mein Vorschlag für die LED-Animation:
Nix vor und zurückzählen, sondern ein Array mit den Bitmustern der
einzuschaltenden LEDs verwenden, und dann ein Byte nach dem anderen auf
den Port mit den LEDs ausgeben.
Das Array kann auf 256 Bitmuster erweitert werden, wenn's größer werden
soll, dann uint16_t für lr verwenden (bis zu 32767 = max. Arraygröße).
1 | //
|
2 | uint8_t lr = 0; // "Statusmerker" Leds rot
|
3 | uint8_t lg = 0; // "Statusmerker" Leds grün
|
4 | uint8_t lt = 0; // ein Led-"Timer"
|
5 |
|
6 | // ..auch Konstanten sind variabel ;-)
|
7 | uint8_t const lpattern[] PROGMEM = {
|
8 | 0b10000000,
|
9 | 0b11000000,
|
10 | 0b01100000,
|
11 | 0b00110000,
|
12 | 0b00011000,
|
13 | 0b00001100,
|
14 | 0b00000100,
|
15 | 0b00001100,
|
16 | 0b00011000,
|
17 | 0b00110000,
|
18 | 0b01100000,
|
19 | 0b11000000,
|
20 | 0b10000000
|
21 | };
|
22 | // Anzahl der Einträge im Array lpattern
|
23 | #define LPATTERN (uint8_t)(sizeof(lpattern)/sizeof(lpattern[0]))
|
24 |
|
25 |
|
26 | // die Bitmuster aus lpattern[] an die roten Leds vorne ausgeben
|
27 | // Diese Funktion jenach gewünschter Geschwindigkeit alle 10..200ms
|
28 | // aus der main_loop heraus aufrufen
|
29 | void led_player() {
|
30 | LED_RD_PORT = pgm_read_byte(&lpattern[lr]);
|
31 | if (++lr >= LPATTERN) {
|
32 | lr = 0;
|
33 | }
|
34 | }
|