Forum: Mikrocontroller und Digitale Elektronik HD44780 Display


von Mirko (Gast)


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;
}

von remo (Gast)


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

von stefan (Gast)


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?

von Mirko (Gast)


Lesenswert?

Danke Remo!

von Marco S (Gast)


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
-

von mark (Gast)


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?!

von see4far (Gast)


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!

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.