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


von Juergen B. (jbaben)


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)


Lesenswert?

P0 ist open-drain, fehlen vielleicht externe Pullup-Widerstände?

von Heinz (Gast)


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)


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)


Lesenswert?

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

von Juergen B. (jbaben)


Lesenswert?

Hallo,

habe ich auch nicht.

MfG

Juergen B.

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.