Initialisierung für 4-Bit Modus eines HD44780 LCDs

Gast #485187
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.
Angehängte Dateien:
Gast #485229
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
Gast #485260
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren