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
Code:
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