Haupsache uist, daß er funktionert

Was mir auffällt ist, daß E_AKT und E_ALT nicht verwendet werden.

Es werden recht viele Variablen gebraucht. Da viele Variablen nur ein Flag sind (also "wahr" oder "falsch" merken), könnte man die Flags zusammenfassen und den Code (d.h. was an Asm rauskommt) deutlich verkürzen.

Dazu fasst man erst mal die Flags in einem Bitfield zusammen. Da die einzelnen Felder nur 1 Bit groß sind, kann für deren Zugriff/Abfrage sehr kurzer Code erzeugt werden, da das in einer einzigen Maschinen-Instruktion geht, und es werden weniger Register gebraucht, was Platz und Zeit beim Sichern der Register spart.

Ausserdem wird der Wert von PINC in eine Variable gemerkt. Dadurch muss nicht 3* PINC gelesen werden, sondern man macht einen Schnappschuss und wertet den aus. Die Änderungen ergeben sich durch ein XOR, in wechsel steht eine 1 für jedes geänderte Bit.

Der Vorschlag könnte dann so aussehen, wobei der C-Code länger wird, weil man noch eine Flag-Struktur definieren muss:
Code:
	struct
	{
		unsigned char a:1;
		unsigned char b:1;
		unsigned char way1:1;
		unsigned char way2:1;
	} flags = {.a=0, .b=0, .way1=0, .way2=0};
	
	uint8_t pin_alt = PINC;
	int x = 0;
	
	while (1)
	{
		uint8_t pin_neu = PINC;
		uint8_t wechsel = pin_neu ^ pin_alt;
		
		flags.way2 = flags.way1 = 0;
		
		if (wechsel & (1 << PINC0))
		{
			if (flags.b)	flags.way1 = 1;	else	flags.a = 1; 
		}
		
		if (wechsel & (1 << PINC1))
		{
			if (flags.a)	flags.way2 = 1;	else	flags.b = 1; 
		}
		
		pin_alt = pin_neu;
		
		if (flags.way1) { flags.b = 0; x--; LCD_Write_ZAHL (40, x); }
		if (flags.way2) { flags.a = 0; x++; LCD_Write_ZAHL (40, x); }
	}
Am Ablauf hat sich nichts geändert (ausser Kleinigkeiten, etwa daß der neue Zustand von PINC immer gemerkt wird, etc), ansonsten ist's einfach ne Anregung zur Optimierung.

Wenn man so proggt, kann man C-Code schreiben wie Heu, aber die kleinen AVRs werden einfach nicht voll...