Wahhh! Deine Ausdrucksweise ist ganz fürchterlich, sorry.
Den Code finde ich ziemlich chaotisch, mal ein paar allgemeine Hinweise
(was mir - "fortgeschrittener Anfänger" - beim schnellen Durchlesen so
auffällt):
>#define LED_AN(LED) (PORTD |= (1<<(LED)))
Ich würde LED durch _led oder so ersetzen, es ist allgemein üblich das
Wörter in Großbuchstaben Präprozessormakros sind. Wenn jemand nicht
genau liest könnte er denken LED ist irgendwo definiert und wird
ersetzt.
Besser: #define LED_AN(_led) (PORTD|=(1<<_led))
>char i[]="Druecke \0"; // Definiere Nullterminierten String "\0"
>unbedingt mit angeben
Die Null macht der Compiler automatisch mit rein, "Druecke" reicht hier
aus.
>char f=0x0; // Definiere byte mit dem wert 255
0x0 ist Null, nicht 255.
>while (1) // Schleife um den Controller zu fangen
Da kommt der µP wie du selber sagst nie wieder raus...
>return 0;
und wenn doch würde das das Programm sofort beenden.
Der gesamte Block
>DDRB &= ~(1<<TASTER); // Port B: Eingang für Taster
wird also NIEMALS ausgeführt!!!
Ganz wichtig: Vernünftig einrücken!
>while(2)
Was soll die 2 da? Es ist nicht falls (alles was nicht 0 ist ist wahr),
aber normalerweise schreibt man 1.
>lcdcall(56,1); // Systemeinstellungen
Keine Zahlen im Quellcode nutzen, keiner weiss was da gemeint ist.
Besser sowas wie (1<<CONFIGMODUS)|(1<<LCD_AN)|(1<<CURSOR_AN) nutzen
(Präprozessor!).
>PORTB=b-1; // Enable wieder null setzen
Uhhhh!!!! Das geht (wenn überhaupt) nur wenn Enable=LSB. Du hast oben
doch angefangen Makros zu schreiben um deine LEDs zu tooglen, warum
diese nicht verallgemeinern und für Enable nutzen?
> char l=(c*16);
> l=l/16;
Was soll das bringen (außer einem Überlauf)?
lcdwritedec hab ich mir nicht angeschaut.