Hallo, ich habe mir gestern ein LCD-Display vom Typ Displaytech 162 gekauft. (Datenblatt als Anlage). Wenn ich das Display nun wie in etlichen Tutorials beschriben anschliesse, dann geht das Display und die Hintergrundbeleuchtung an, aber das Display zeigt in der oberen Reihe nur schwarze Felder an und unten gar nichts. Nun habe ich zwei fragen: 1. Ist das normal? 2. Und warum gibt es nicht das aus, was es eigentlich sollte? Quelltext ist aus dem LCD Tutorial hier auf der Seite. Gruß, der Horst.
Sorry hier das Datenblatt und meine Pinnbelegung. 1 VSS -> +5V 2 VDD -> GND 3 VO -> GND 4 RS -> PD4 5 R/W -> GND 6 E -> PD5 7-10 not connected 11 DB4 -> PD0 12 DB5 -> PD1 13 DB6 -> PD2 14 DB7 -> PD3
>1 VSS -> +5V >2 VDD -> GND Die sind vertauscht ! 1 VSS -> GND 2 VDD -> +5V Wahrscheinlich nur Tippfehler. Tu uns allen einen Gefallen und überprüfe deine Schaltung noch mal Leitung für Leitung. Häufig sind Leitungen einfach nicht richtig angeschlossen gewesen, oder es waren Kurzschlüsse vorhanden. Ein Kontrastregler an VO könnte auch nicht schaden.
Wenn ich VSS und VDD Tausche erhalte ich einen Kurzschluss. Daran kanns schonmal nicht liegen und ausserdem steht es ja auch so in dem Tutorial: Anschluss an den Controller Jetzt da wir wissen, welche Anschlüsse das LCDs benötigt, können wir das LCD mit dem Mikrocontroller verbinden: Pin #-LCD Bezeichnung-LCD Pin-µC 1 Vss GND 2 Vcc 5V 3 Vee GND oder Poti (siehe oben) 4 RS PD4 am AVR 5 RW GND 6 E PD5 am AVR 7 DB0 offen 8 DB1 offen 9 DB2 offen 10 DB3 offen 11 DB4 PD0 am AVR 12 DB5 PD1 am AVR 13 DB6 PD2 am AVR 14 DB7 PD3 am AVR
Hallo, Kontrast gehört an ein Poti. Einfach deshalb, weil die tatsächlich nötige Vee recht stark vom Displayhersteller abhängt und man bei zu hohem Kontrast durchaus auch ausgegebene Zeichen übersehen kann, die in der ersten Zeile sein sollen. Wenn es keine Verdrahtungsfehler gibt, eben das übliche: Wartezeiten lang genug (wie schnell ist der AVR getaktet?) Display hat wirklich einen HD44780 drauf und nicht einen kompatiblen? Den Begriff "kompatibel" definieren Display-Hersteller gern so: hat etwa genausoviel Anschlüsse wie ein Standard-Display, die sind auch so etwa wie dort belegt und der Chip kann, wenn man ihn richtig ansteuert, auch etwa das, was ein HD44780 kann. Ist zumindest meine Erfahrung... Anschlüsse: Original-Datenblatt des Displays, dort sollte auch der Controllertyp drinstehen. Init-Sequence mit dem Original-Datenblatt vergleichen, speziell nötige Mindestzeit für E H-Zeit und die maximale Zeit für Befehlsausführung. Beim Init sind meist Mindestwartezeiten gefordert. Vor Beginn der Init-Sequence lange genug warten, bis das Display mit seiner PowerOn-Sequence fertig ist. Alle Zeiten können durchaus länger sein. Nach dem AVR-Reset: warte ich meist 150ms, bis Init aufgerufen wird. 5ms reichen sicher eigentlich für Befehle außer Clear. E-Clock setze ich nach anlegen aller gültigen Signale und Daten mit einem NOP zwischen L/H und H/L, bei 8MHz sind 2, bei 16MHz meist schon 4 nötig. Das hängt auch stark vom Aufbau und den Leitungslängehn zum Display ab. Auf dem Steckbrett und mit 20cm Flachbandkabel zum Display bin ich da eher großzügig... Gruß aus Berlin Michael
Hallo, Kontrast hängt mittlkerweile an nem Poti und Funktioniert auch, dahinter versteckt sich kein Text. ;) Auszug aus dem GCC-Tutorial von hier: Das LCD und sein Controller Die meisten Text-LCDs verwenden den Controller HD44780 oder einen kompatiblen (z.B. KS0070) und haben 14 oder 16 Pins. Die Pinbelegung an der LCD-Controller-Platine ist praktisch immer gleich. Und genau einen solchen KS0070 ist bei dem Display verbaut. Meine Flachbandkabellänge ist ungefähr 5cm. So und das ist mein Quelltext:
1 | #include <avr/io.h> |
2 | #include "lcd-routines.h" |
3 | #include <util/delay.h> |
4 | |
5 | // sendet ein Datenbyte an das LCD
|
6 | |
7 | void lcd_data(unsigned char temp1) |
8 | {
|
9 | unsigned char temp2 = temp1; |
10 | |
11 | LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen |
12 | |
13 | temp1 = temp1 >> 4; |
14 | temp1 = temp1 & 0x0F; |
15 | LCD_PORT &= 0xF0; |
16 | LCD_PORT |= temp1; // setzen |
17 | lcd_enable(); |
18 | |
19 | temp2 = temp2 & 0x0F; |
20 | LCD_PORT &= 0xF0; |
21 | LCD_PORT |= temp2; // setzen |
22 | lcd_enable(); |
23 | |
24 | _delay_us(45); |
25 | }
|
26 | |
27 | // sendet einen Befehl an das LCD
|
28 | |
29 | void lcd_command(unsigned char temp1) |
30 | {
|
31 | unsigned char temp2 = temp1; |
32 | |
33 | LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen |
34 | |
35 | temp1 = temp1 >> 4; // oberes Nibble holen |
36 | temp1 = temp1 & 0x0F; // maskieren |
37 | LCD_PORT &= 0xF0; |
38 | LCD_PORT |= temp1; // setzen |
39 | lcd_enable(); |
40 | |
41 | temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren |
42 | LCD_PORT &= 0xF0; |
43 | LCD_PORT |= temp2; // setzen |
44 | lcd_enable(); |
45 | |
46 | _delay_us(45); |
47 | }
|
48 | |
49 | // erzeugt den Enable-Puls
|
50 | void lcd_enable(void) |
51 | {
|
52 | LCD_PORT |= (1<<LCD_EN); |
53 | _delay_us(10); // kurze Pause |
54 | LCD_PORT &= ~(1<<LCD_EN); |
55 | }
|
56 | |
57 | // Initialisierung:
|
58 | // Muss ganz am Anfang des Programms aufgerufen werden.
|
59 | |
60 | void lcd_init(void) |
61 | {
|
62 | LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN); // Port auf Ausgang schalten |
63 | |
64 | // muss 3mal hintereinander gesendet werden zur Initialisierung
|
65 | |
66 | _delay_ms(150); |
67 | LCD_PORT &= 0xF0; |
68 | LCD_PORT |= 0x03; |
69 | LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 |
70 | lcd_enable(); |
71 | |
72 | _delay_ms(150); |
73 | lcd_enable(); |
74 | |
75 | _delay_ms(150); |
76 | lcd_enable(); |
77 | _delay_ms(150); |
78 | |
79 | // 4 Bit Modus aktivieren
|
80 | LCD_PORT &= 0xF0; |
81 | LCD_PORT |= 0x02; |
82 | lcd_enable(); |
83 | _delay_ms(150); |
84 | |
85 | // 4Bit / 2 Zeilen / 5x7
|
86 | lcd_command(0x28); |
87 | |
88 | // Display ein / Cursor aus / kein Blinken
|
89 | lcd_command(0x0C); |
90 | |
91 | // inkrement / kein Scrollen
|
92 | lcd_command(0x06); |
93 | |
94 | lcd_clear(); |
95 | }
|
96 | |
97 | // Sendet den Befehl zur Löschung des Displays
|
98 | |
99 | void lcd_clear(void) |
100 | {
|
101 | lcd_command(CLEAR_DISPLAY); |
102 | _delay_ms(50); |
103 | }
|
104 | |
105 | // Sendet den Befehl: Cursor Home
|
106 | |
107 | void lcd_home(void) |
108 | {
|
109 | lcd_command(CURSOR_HOME); |
110 | _delay_ms(50); |
111 | }
|
112 | |
113 | // setzt den Cursor in Zeile y (1..4) Spalte x (0..15)
|
114 | |
115 | void set_cursor(uint8_t x, uint8_t y) |
116 | {
|
117 | uint8_t tmp; |
118 | |
119 | switch (y) { |
120 | case 1: tmp=0x80+0x00+x; break; // 1. Zeile |
121 | case 2: tmp=0x80+0x40+x; break; // 2. Zeile |
122 | }
|
123 | lcd_command(tmp); |
124 | }
|
125 | |
126 | // Schreibt einen String auf das LCD
|
127 | |
128 | void lcd_string(char *data) |
129 | {
|
130 | while(*data) { |
131 | lcd_data(*data); |
132 | data++; |
133 | }
|
134 | }
|
135 | int main(void) |
136 | {
|
137 | _delay_ms(250); |
138 | lcd_init(); |
139 | |
140 | lcd_data('T'); |
141 | lcd_data('e'); |
142 | |
143 | set_cursor(0,2); |
144 | |
145 | lcd_string("Hello World!"); |
146 | |
147 | while(1) |
148 | {
|
149 | }
|
150 | |
151 | return 0; |
152 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.