Forum: Mikrocontroller und Digitale Elektronik Initialisierung für 4-Bit Modus eines HD44780 LCDs


von Joachim Rodler (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe eine Problem bei der Initialisierung des HD44780 kompatiblen 
LCDs.

Ich wollte die Assembler Routine

http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

als C-Code schreiben. Allerdings funktiniert das bei mir nicht.

Habe im angang mal meinen Code angehängt.

Beim rumsurven habe ich entdeckt, dass es einige .h Files gibt, die mir 
diesen Vorgang abnehmen. Könnte mir da bitte jemand welche empfehlen.

von Hannes (Gast)


Lesenswert?

Die C-Freaks benutzen die LCD-Routinen von Peter Fleury.

...

von Michael U. (Gast)


Lesenswert?

Hallo,

vorweg: C ist überhaupt nicht mein Ding, Assembler ja...

Trotzdem schau ich oft in solche C-Fragen rein, kann ja sein, ich nutze 
doch mal C... ;)

void toggle_E()
{
  PORTB=(1<<5);lcd_delay(500);       // E=1
  PORTB=(0<<5);lcd_delay(500);        // E=0
}

Wenn ich C wenigstens richtig lesen kann, setzt die erste Zeile
PORTB auf 0b00100000

Die zweite Zeile schiebt sinnlos eine 0 durch die Gegend (schon oft 
genug diskutiert), setzt also letztlich
PORTB auf 0b00000000

void lcd_init()
{
  DDRB=0xFF;                      Port B alles auf Ausgang
  lcd_delay(1000);                und warten (worauf eigentlich?)
  PORTB=(0<<4);                   PORTB auf 0b00000000 (????)
  lcd_delay(500);                 warten (worauf?)
  PORTB=0b00000011;toggle_E();    PORTB auf 0b00000011, dann PORTB auf 
0b00100000, nur nutzen jetzt obiges setzen auf 0b00000011 nichts mehr...
  PORTB=0b00000000;toggle_E();
  toggle_E();
  toggle_E();
  PORTB=0b00000010;toggle_E();
  PORTB=0b00000000;toggle_E();

  lcd_cls();
}

Da Du ja auch nicht verraten hast, was am Port B wo dranhängt...

So zumindest wird das meiner Meinung nach nichts.

Versuche zu verstehen, was der ASM-Code mit dem Display eigentlich 
macht, Datenblatt des HD44780 liegt im Netz.

Gruß aus Berlin
Michael

von Karl H. (kbuchegg)


Lesenswert?

> C ist überhaupt nicht mein Ding,

Dafür ist deine Analyse aber erstklassig.
Respekt.

von Joe (Gast)


Lesenswert?

Ohne jetzt näher auf den Code einzugehen, wie ein Display vom Ablauf her 
initialisiert werden soll, sollte dir zumindestens geläufig sein. 
Fremden Code einfach übernehmen oder von ASM -> C zu übersetzen macht 
nie wirklich Sinn.

> lcd_delay(1000);                und warten (worauf eigentlich?)

Na ja, nachdem Einschalten 15 mSec. warten vermute ich mal, denn das ist 
der erste Schritt. Das läßt sich an deinem Delay aber nicht erkennen.

Dann z.B. 3x38H (entry mode increment + shift), wait 4,1 mSec.
Dann Clear Display 0x01, wait 4,1 mSec.

RS und ENABLE BIT noch beachten und die Initialisierung sollte 
abgeschlossen sein.

Nun kannst du Zeichen Ausgeben.

Mach dir also einen Ablaufplan und kommentier deinen Code mal 
entsprechend. Dann ists leichter zu helfen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.