Ampfing
10.09.2006, 10:43
Hallo zusammen,
ich habe folgende Situation:
An einem ATMega8 sind insgesamt 10 LED's angeschlossen. Diese sind über alle drei Ports verteilt (PD2-PD5, PB4-PB5, PC0-PC3).
Jetzt möchte ich über die 10 LED's ein Lauflicht programmieren. Bis jetzt löse ich das Ganze, indem ich mitzähle bei welcher LED ich gerade bin und dann die entsprechend nächste LED per |= einschalte. Das schaut aber ehrlich gesagt nicht so wirklich toll aus
void Lauflicht1(void)
{
//schaltet das Lauflicht eine Position weiter
switch (zaehler)
{
case 0:
//->erste weiße LED ist an
PORTD &= 0xfb;
PORTD |= 0x8;
break;
case 1:
//->zweite weiße LED ist an
PORTD &= 0xf7;
PORTD |= 0x10;
break;
case 2:
//->dritte weiße LED ist an
PORTD &= 0xef;
PORTD |= 0x20;
break;
case 3:
//->vierte weiße LED ist an
PORTD &= 0xc3;
PORTB |= 0x10;
break;
case 4:
//->erste grüne LED ist an
PORTB &= 0xef;
PORTB |= 0x20;
break;
case 5:
//->zweite grüne LED ist an
PORTB &= 0xdf;
PORTC |= 0x1;
break;
case 6:
//->erste der weißen LED's ist an
PORTC &= 0xfe;
PORTC |= 0x2;
break;
case 7:
//->zweite der weißen LED's ist an
PORTC &= 0xfd;
PORTC |= 0x4;
break;
case 8:
//->dritte der weißen LED's ist an
PORTC &= 0xfb;
PORTC |= 0x8;
break;
case 9:
//->letzte der weißen LED's ist an->zurückgehen
PORTC &= 0xf0;
PORTC |= 0x4;
break;
case 10:
//->dritte der weißen LED's ist an
PORTC &= 0xfb;
PORTC |= 0x2;
break;
case 11:
//->zweite der weißen LED's ist an
PORTC &= 0xfd;
PORTC |= 0x1;
break;
case 12:
//->erste der weißen LED's ist an
PORTC &= 0xfe;
PORTB |= 0x20;
break;
case 13:
//->zweite der grünen LED's ist an
PORTB &= 0xdf;
PORTB |= 0x10;
break;
case 14:
//->erste der grünen LED's ist an
PORTB &= 0xef;
PORTD |= 0x20;
break;
case 15:
//->vierte der weißen LED's ist an
PORTD &= 0xdf;
PORTD |= 0x10;
break;
case 16:
//->dritte der weißen LED's ist an
PORTD &= 0xef;
PORTD |= 0x8;
break;
case 17:
//->zweite der weißen LED's ist an
PORTD &= 0xf7;
PORTD |= 0x4;
break;
}
if (zaehler < 17)
{
zaehler++;
}
else
{
zaehler = 0;
}
}
Den Code finde ich nicht besonders toll wenn ich ehrlich sein darf. Gibt es eine Möglichkeit das Ganze eleganter zu machen? Optimal wäre natürlich, wenn ich einfach nur mit links- bzw. rechtsshift arbeiten könnte...
Vielen Dank im voraus schonmal fürs lesen und viele Grüße
ich habe folgende Situation:
An einem ATMega8 sind insgesamt 10 LED's angeschlossen. Diese sind über alle drei Ports verteilt (PD2-PD5, PB4-PB5, PC0-PC3).
Jetzt möchte ich über die 10 LED's ein Lauflicht programmieren. Bis jetzt löse ich das Ganze, indem ich mitzähle bei welcher LED ich gerade bin und dann die entsprechend nächste LED per |= einschalte. Das schaut aber ehrlich gesagt nicht so wirklich toll aus
void Lauflicht1(void)
{
//schaltet das Lauflicht eine Position weiter
switch (zaehler)
{
case 0:
//->erste weiße LED ist an
PORTD &= 0xfb;
PORTD |= 0x8;
break;
case 1:
//->zweite weiße LED ist an
PORTD &= 0xf7;
PORTD |= 0x10;
break;
case 2:
//->dritte weiße LED ist an
PORTD &= 0xef;
PORTD |= 0x20;
break;
case 3:
//->vierte weiße LED ist an
PORTD &= 0xc3;
PORTB |= 0x10;
break;
case 4:
//->erste grüne LED ist an
PORTB &= 0xef;
PORTB |= 0x20;
break;
case 5:
//->zweite grüne LED ist an
PORTB &= 0xdf;
PORTC |= 0x1;
break;
case 6:
//->erste der weißen LED's ist an
PORTC &= 0xfe;
PORTC |= 0x2;
break;
case 7:
//->zweite der weißen LED's ist an
PORTC &= 0xfd;
PORTC |= 0x4;
break;
case 8:
//->dritte der weißen LED's ist an
PORTC &= 0xfb;
PORTC |= 0x8;
break;
case 9:
//->letzte der weißen LED's ist an->zurückgehen
PORTC &= 0xf0;
PORTC |= 0x4;
break;
case 10:
//->dritte der weißen LED's ist an
PORTC &= 0xfb;
PORTC |= 0x2;
break;
case 11:
//->zweite der weißen LED's ist an
PORTC &= 0xfd;
PORTC |= 0x1;
break;
case 12:
//->erste der weißen LED's ist an
PORTC &= 0xfe;
PORTB |= 0x20;
break;
case 13:
//->zweite der grünen LED's ist an
PORTB &= 0xdf;
PORTB |= 0x10;
break;
case 14:
//->erste der grünen LED's ist an
PORTB &= 0xef;
PORTD |= 0x20;
break;
case 15:
//->vierte der weißen LED's ist an
PORTD &= 0xdf;
PORTD |= 0x10;
break;
case 16:
//->dritte der weißen LED's ist an
PORTD &= 0xef;
PORTD |= 0x8;
break;
case 17:
//->zweite der weißen LED's ist an
PORTD &= 0xf7;
PORTD |= 0x4;
break;
}
if (zaehler < 17)
{
zaehler++;
}
else
{
zaehler = 0;
}
}
Den Code finde ich nicht besonders toll wenn ich ehrlich sein darf. Gibt es eine Möglichkeit das Ganze eleganter zu machen? Optimal wäre natürlich, wenn ich einfach nur mit links- bzw. rechtsshift arbeiten könnte...
Vielen Dank im voraus schonmal fürs lesen und viele Grüße