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.