Forum: Mikrocontroller und Digitale Elektronik Problem mit der Ansteuerung LCD (HD44780)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Juergen B. (jbaben)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem bei der Anzeige von Text auf einem LC-Display 
(HD44780, 2x8).
Es soll folgender Text ausgegeben werden: Zeile 1: "CIRCUIT ", Zeile 2: 
"DIGEST  ".
Der Text wird aber nicht richtig angezeigt.
Z.B. nach einem Reset: "CCCCCCCC" und dann weiter Zeichen auf beiden 
Zeilen.
Meine Hardware:
Mikrocontroller: AT89C51RC2 mit Quarz 10MHz
LCD: HD44780 mit 2x8 Zeichen.
Übertragung mit Flip (Microchip, ATMEL)

Ich habe schon mehrere Beispiele ausprobiert (auch Assembler), aber 
sobald ich mehrere Zeichen ausgebe werden diese mehrfach ausgegeben.
Hier mein Programm Code (Keil C).
1
// Program for LCD Interfacing with 8051 Microcontroller (AT89S52) 
2
// https://circuitdigest.com/microcontroller-projects/lcd-interfacing-with-8051-microcontroller-89s52
3
4
#include<reg51.h>
5
#define display_port P2      //Data pins connected to port 2 on microcontroller
6
sbit rs = P0^0;  // RS pin connected to pin 1 of port 0
7
sbit rw = P0^2;  // RW pin connected to pin 3 of port 0
8
sbit e =  P0^1;  // E pin connected to pin 2 of port 0
9
10
void msdelay(unsigned int time)  // Function for creating delay in milliseconds.
11
{
12
    unsigned i,j ;
13
    for(i=0;i<time;i++)    
14
    for(j=0;j<1275;j++);
15
}
16
void lcd_cmd(unsigned char command)  //Function to send command instruction to LCD
17
{
18
    display_port = command;
19
    rs= 0;
20
    rw=0;
21
    e=1;
22
    msdelay(5);
23
    e=0;
24
}
25
26
void lcd_data(unsigned char disp_data)  //Function to send display data to LCD
27
{
28
    display_port = disp_data;
29
    rs= 1;
30
    rw=0;
31
    e=1;
32
    msdelay(5);
33
    e=0;
34
}
35
36
 void lcd_init()    //Function to prepare the LCD  and get it ready
37
{
38
    lcd_cmd(0x38);  // for using 2 lines and 5X7 matrix of LCD
39
    msdelay(10);
40
    lcd_cmd(0x38);
41
    msdelay(10);
42
    lcd_cmd(0x38);
43
    msdelay(10); 
44
    lcd_cmd(0x0C);  // turn display ON, cursor blinking 0x0F
45
    msdelay(10);
46
    lcd_cmd(0x01);  //clear screen 0x01
47
    msdelay(10);
48
    lcd_cmd(0x02);  // cursor home
49
    msdelay(10);
50
    lcd_cmd(0x80);  // bring cursor to position 1 of line 1
51
    msdelay(10);
52
}
53
void main()
54
{
55
    unsigned char a1[8]="CIRCUIT ";    //string of 8 characters with a null terminator.
56
    unsigned char a2[8]="DIGEST  "; 
57
    int l=0;
58
    lcd_init();
59
    while(a1[l] != '\0') // searching the null terminator in the sentence
60
    {
61
        lcd_data(a1[l]);
62
        l++;
63
        msdelay(50);
64
    }
65
    l=0;
66
    lcd_cmd(0xC0);        // bring cursor to position 1 of line 2
67
    msdelay(10);
68
     while(a2[l] != '\0') // searching the null terminator in the sentence
69
    {
70
        lcd_data(a2[l]);
71
        l++;
72
        msdelay(50);
73
    }
74
}
Bei dem Beispiel wird als Mikrocontroller AT89S52 angegeben ich werwende 
aber AT89C51.
Ist das ein Problem ?

Woran könnte mein Problem liegen ?

MfG
Juergen B.

: Verschoben durch Moderator
von Mr. Claudius (Gast)


Bewertung
1 lesenswert
nicht lesenswert
P0 ist open-drain, fehlen vielleicht externe Pullup-Widerstände?

von Heinz (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Juergen B. schrieb:
> unsigned char a1[8]="CIRCUIT ";    //string of 8 characters with a null
> terminator.
>     unsigned char a2[8]="DIGEST  ";

Mit den Leerzeichen am Ende sind Deine Strings schon 8 Zeichen lang und 
der Platz für den "Null Terminator" fehlt. Entweder Leerzeichen 
wegmachen oder Strings längermachen.

von Juergen B. (jbaben)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank für die schnellen Antworten.
Der Hinweis auf die fehlenden Pullup-Widerstände hat geholfen.
Ich habe die drei Ausgänge (RS, E, RW) mit einem Widerstand 10K gegen 
+5V verbunden, jetzt funktioniert die Textausgabe.
Den Hinweis auf den Port 0 habe ich wohl im Datenblatt vom AT89C51RC2 
übersehen.

MfG

Juergen B.

von Astro (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Den Hinweis von Heinz, daß deine Arrays zu klein sind, solltest du aber 
nicht auch noch übersehen.

von Juergen B. (jbaben)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe ich auch nicht.

MfG

Juergen B.

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]
  • [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.

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