Geht, geht halb, geht nicht - das könnte auch ein "Wackler" auf einer der Portleitungen sein oder ein Lotrest/Drahtfitzelchen von der Fertigung oder von Basteltisch.
Oder der C-Compiler optimiert die nichtsnützige Warteschleife einfach weg. Mach den Schleifenzähler y lieber static volatile (bin noch nicht fit in C; irgendwas in der Richtung, was die Wegoptimierung verbietet.)
Allerdings:
1) Meine LCDs haben wohl ein High-aktives Enable (anders als das oft in der diskreten Logik war), hab's jetzt nicht im Code nachgeprüft. Stammt deine LOW-Aktivität aus dem Datenblatt des LCD? Mir scheint das der kritische Punkt zu sein (bei meinem ersten LCD-Code hatte ich jedenfalls genau diesen Polaritätsfehler gemacht)
2) Ich sehe in deiner lcd_init() keine Wartezeiten. Die LCD-Controller wollen besonders bei der Initialisierung Pausen, z.T. bis zu 15 ms oder mehr. Ok, das enable() macht etwas Wartezeit. Mach diese Zeit ruhig mal 100ms lang, dann bist du fürs Erste zwar langsam, solltest aber auf der sicheren Seite sein. Danach kannst du die Initialisierungsphase noch anhand des Datenblattes tunen.
Lesezeichen