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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.