mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik HD44780 Display


Autor: Mirko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,
hier ist ein Stück eines Programmes die ich verstehen will aber
schwierigkeiten habe. Mein Problem liegt daran, ich verstehe nicht
warum er für die Funktionen clear_display: P0=0x01, shift_links:
P0=0x10, shift_recht: P0=0x14, return_home: P0=0x02 und ausgabe: P0=aus
hinschreibt?


void init_display(void)      // Display initialisieren
{
   char i=0;      // Hilfsvariable
  // Array für Grundeinstellung
  unsigned char array[7]={0x30,0x30,0x30,0x30,0x0e,0x01,0x06};
  pause(1500);      // Warten >15ms
  for(i=0;i<7;i++)    // Schleife für Initialisierung
  {
    P2_7=1;      // Enable auf 1 setzen
    P2_5=0;      // RS auf Code Input
    P2_6=0;      // R/W auf Write
    pause(500);    // Warten >4.1ms
    P0=array[i];    // Daten an LCD anlegen
    pause(120);    // Warten >450ns
    P2_7=0;      // Enable auf 0 setzen
    pause(120);    // Warten >450ns
  }
}




void intro (void)    // Intro schreiben
{
  unsigned char i;  // Hilfsvariable

  unsigned char intro[16]={"Arbeit"} @ xdata;
  for(i=0;i<16;i++)
  ausgabe (intro[i]);  // Ausgabe Intro
         pause(150000);    // Pause für Intro-Anzeige
}




void clear_display (void)  // Display löschen
{
  P2_7=1;      // Enable auf 1 setzen
  P2_5=0;      // RS auf Code Input
  P2_6=0;      // R/W auf Write
  P0=0x01;    // Default (Clear Display)
  pause(120);    // Warten >450ns
  P2_7=0;      // Enable auf 0 setzen
  pause(120);    // Warten >450ns
}




void clear_zeichen(void)         // Zeichen löschen
{
  shift_links();    // Cursor nach links verschieben
  ausgabe(0xa0);    // Ausgabe Leerzeichen
}




void shift_links (void)    // Cursor nach links verschieben
{
  P2_7=1;      // Enable auf 1 setzen
  P2_5=0;      // RS auf Code Input
  P2_6=0;      // R/W auf Write
  P0=0x10;    // Shift links
  pause(120);    // Warten >450ns
  P2_7=0;      // Enable auf 0 setzen
  pause(120);    // Warten >450ns
}




void shift_rechts (void)  // Cursor nach rechts verschieben
{
  P2_7=1;      // Enable auf 1 setzen
  P2_5=0;      // RS auf Code Input
  P2_6=0;      // R/W auf Write
  P0=0x14;    // Shift rechts
  pause(120);    // Warten >450ns
  P2_7=0;      // Enable auf 0 setzen
  pause(120);    // Warten >450ns
}




void return_home(void)    // Dispaly zum Zeilenanfang
{
  P2_7=1;      // Enable auf 1 setzen
  P2_5=0;      // RS auf Code Input
  P2_6=0;      // R/W auf Write
  P0=0x02;    // Zeilenanfang
  pause(120);    // Warten >450ns
  P2_7=0;      // Enable auf 0 setzen
  pause(120);    // Warten >450ns
}




void bf_display(void)    // Busy-Flag abfragen
{
  unsigned char a;  // Hilfsvariable
  do      // Warteschleife
  {
    P2_7=1;    // Enable auf 1 setzen
    P2_5=0;    // RS auf Code Input
    P2_6=1;    // R/W auf Read
    pause(120);  // Warten >450ns
    P2_7=0;    // Enable auf 0 setzen
    pause(120);  // Warten >450ns
    a=P0_7;    // Busy-Flag abfragen
  }while(a!=0);    // Warteschleife
}




void ausgabe(unsigned char aus)  // Daten auf Display ausgeben
{
         bf_display();    // Busy-Flag Abfrage
  P2_7=1;      // Enable auf 1 setzen
  P2_5=1;      // RS auf Data Input
  P2_6=0;      // R/W auf Write
  P0=aus;      // Daten an LCD anlegen
  pause(120);    // Warten >450ns
  P2_7=0;      // Enable auf 0 setzen
  pause(120);    // Warten >450ns
  P0=0;      // Datenbits zurücksetzen
}




void pause(unsigned long warten)  // Delay
{
  unsigned long i=0;    // Hilfsvariable
  for(i=0;i<=warten;i++);    // Warteschleife
}



void send_char(char C)            // Senden über die UART
{
  while(!TI);
  TI = 0;
  SBUF = C;
}

Autor: remo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das liegt an den Befehlen, die der Controller im LCD Display versteht.
Wenn man ihm z.B. am Datenport (und der ist offensichtlich mit dem Port
P0 des Mikrocontrollers verbunden) den Hexwert 01 schickt, dann wird das
>Display gelöscht.
Analoges gilt für die Schiftbefehlt.
Im Falle ausgabe, wird die Variable, die der Routine als Parameter
übergeben wirdan den datenport gelegt.
Du mußt die, um das zu verstehen entwerder das datenbaltt des LCD
Controllers (schwere Kost) oder das LCD Tutorial auf dieser Site
ansehen. Wenn du verstanden hast, wie das Display angesteuert wird,
dann ist das verständnis des C-Programms einfach.

Viel Glück
Remo

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich habe mir heute auch ein display gekauft und ("als 4 bit
variante") angeschlossen. Nachdem ich einfach mal so eingeschaltet
hab, zeigt mein 2x16 Display nur in der unteren Zeile ausgefüllte
Felder, in der oberen nichts. Kann das sein, oder ist es defekt?

Autor: Mirko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Remo!

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enable auf 1 setzen?

Hallo erstmal. Was mir auffällt: Ein HD44780 hat kein Enable-Eingang.
Der E-Pin wird beschrieben als "Starts data read/write". Somit fällt
die Prozedur folgendermaßen aus:

1. E = 0
2. Anlegen der Daten/Steuerleitungen, d.h. RS, R/W und mindestens DB4
bis DB7 ausgeben; im 8-bit-Betrieb natürlich DB0 bis DB7
3. E = 1
4. mind. 450 ns warten
5. E = 0
6. Befehlausführungsende abwarten. Entweder pollen, oder stupide
warten

Gruß
Marco
-

Autor: mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich verwende die Peter Fleury's LCD-Library, allerdings steht bei
mir alles aufr dem Kopf, hab ich das Display falschrum eingebaut oder
ist das eine Softwaresache?!
Im Moment steht die Beschriftung des Displays (z.B. Pinning) aufm Kopf,
in Bezug auf die Displayausgabe. Muss das nicht gleich sein?!

Autor: see4far (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich sollte nicht die Beschriftung der Platine, sondern die
Anzeige auf dem Display maßgeblich sein. Die ASCII-Zeichen sind ja
ohnehin in den Controller auf der Platine einprogrammiert, somit kann
es  eigentlich keine "Softwaresache" sein. Man sagt dem Controller ja
nur "Zeige Zeichen XX an!". Deshalb sollte man vielleicht doch besser
vorm Einbau mal ausprobieren, wie rum es richtig ist!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.