Es geht zwar, aber es ist nicht optimal, weil es dem Compiler jegliche
Chance auf Optimierung raubt.
1 | struct Led
|
2 | {
|
3 | volatile uint8_t* pPort;
|
4 | uint8_t Bit;
|
5 | };
|
6 |
|
7 | struct Led myLeds[] =
|
8 | {
|
9 | { &PORTA, 0 },
|
10 | { &PORTB, 5 },
|
11 | { &PORTA, 2 },
|
12 | ...
|
13 | };
|
14 |
|
15 | #define NR_LEDS (sizeof(myLeds)/sizeof(myLeds[0]))
|
16 |
|
17 |
|
18 | ISR( ... )
|
19 | {
|
20 | ..
|
21 | for( i = 0; i < NR_LEDS; i++ )
|
22 | {
|
23 | if( LedData[i] )
|
24 | *(myLeds[i].pPort) |= ( 1 << myLeds[i].Bit );
|
25 | else
|
26 | *(myLeds[i].pPort) &= ~( 1 << myLeds[i].Bit );
|
27 | }
|
28 | }
|
natürlich kannst du die Port und Bitangabe auch zu deinen Led-Daten noch
mit dazunehmen, wenn das vernünftig ist, bzw. die LedData noch mit in
die Struktur integrieren.