Hallo zusammen! Hat schon jemand das Diplay EA DIP122-5 von Lcd-Module.de zum laufen gebracht? Irgendwie werd ich weder aus SED1520 Datenblatt noch aus dem lcd-module Datenblatt schlau wie das ganze anzusteuern ist, bzw. wann der SED Daten übernimme (EN Signal!?) Wäre sehr dankbar für Hilfe und Tipps!
@Berti Guten Morgen! Am Anfang hatte ich die gleichen Probleme. Das Display benötigt für die Kontrast einstellung -4V sonst siehste da nix. Die Ansteuerung ist nicht so Zeitkritisch wie bei einem normalen LCD aber die Ausgabe von Zeichen ist schon etwas Aufwendiger. Beim Initialisriern sollte der RW Pin auf VSS bzw. GND liegen damit wird der 68MPU Modus eingestellt. Zudem hat es zwei Display hälften die mit E1 und E2 gesteuert werden. Um das Display zu löschen oder Zeichen darauf auszugeben musst Du dir eine Routine überlegen die die Umschaltung auf die zweite Displayhälfte ab der 61 Spalte macht. Gruß norad
@Berti Da der EA DIP122-5 keinen Zeichensatz hat, musst Du dir den selber erstellen oder Du nimmst den aus dem Anhang. >Irgendwie werd ich weder aus SED1520 Datenblatt noch aus dem lcd-module >Datenblatt schlau wie das ganze anzusteuern ist, bzw. wann der SED Daten >übernimme (EN Signal!?) Ganz einfach: Daten am Datenport Anlegen und mit der fallender Flanke von E1 oder E2 werden die Daten übernommen. Wenn Du E1 und E2 gleichzeitg fallen lässt, wird das Zeichen auf beiden Displayhälften Angezeigt. Zum LCD löschen mach ich das so ;) Viel Spass noch beim Proggn norad
Schuld war die Low Flanke an den EN Signalen und die Low Flanke für das Reset an /RES jetzt funktioniert alles
Bei mir geht gar nix :-( Es werden einfach keine Pixel angezeigt! Zum Verzweifeln!!! Habt ihr den RES auf HIGH gezogen? (Mein RES "hängt" einfach frei) die einzige Idee, die ich noch nicht versucht habe. Bin für jeden Tipp dankbar! Grüße, Tim
Hallo Tim! Anbei wie ich es damals Angeschlossen habe. Ich hoffe es hilft dir weiter.
RES liegt üblicher Weise auf H und kann zum RESET kurzzeitig auf L gezogen werden. Normalerweise wird damit die Betriebsart des SED1520 eingestellt. Bei dauerhaften H ergibt sich die übliche Ansteuerung, wie von Textdisplays her bekannt ist (mit E, RW, A0) VEE Pin 3, sollte über ein Poti eingespeist werden. Die reale Kontrastspannung liegt bei ca. -4V, bei -5V dürfte nicht mehr viel zu erkennen sein. @Tim Poste mal Dein Programm/Schaltung.
Hier meine Schaltung: JP1: LCD Pin01...Pin09 JP2: LCD Pin10...Pin18 JP3: E2 E1 RW / A0 JP5: D0...D7 GND +5V Grüße, Tim
Erstmal fehlt Pin 3 Beschaltung: Da muß eine negative Spannung von ca. -4V dran, sonst siehst Du überhaupt nichts. Die -4V mußt Du falls nicht vorhanden, irgendwie erzeugen, dazu findest Du im Forum viele Möglichkeiten, braucht nicht viel Strom. Auch sollte zur optimalen Einstellung ein Einstellregler (Wert ca. 4.7k) dazwischen geschaltet werden. Dann ist der Vorwiderstand für die Hintergrundbeleuchtung mit 1k wesentlich zu groß. Würde, je nach genauen Displaytyp erstmal ca. 47 Ohm zum probieren nehmen. Warum die Diode in Serie zu Pin 2? Sehe keinen Sinn darin.
Hallo Matthias, danke für deine schnelle Antwort! LED-Beleuchtungs Vorwiderstand soll nur (Testboard zum Programmieren) die Beleuchtung testen - außerdem auch für die anderen LCD Typen reichen. Die Diode ist einfach ein Verpolungsschutz bei fliegender Verdrahtung. Und die Kontrastspannung... tja, die Kontrastspannung: Ich habe im Datenblatt meines LCD Typs (DIP122-5LED) "automatische Kontrastanpassung" gelesen; Kontrastspannung hatte ich so verstanden, dass sie NUR für LCD Typen OHNE automatische Anpassung nötig wäre. Werde ich jetzt sofort ausprobieren! (Ergebniss gibt's gleich... :-) Noch mal Danke + Grüße, Tim
So, trotz richtiger Kontrastspannung geht's nicht. Ich werde noch einmal alles von vorne prüfen! (Ich hoffe, mein LCD ist nicht defekt) Bis dann! Grüße, Tim
Ich habe in der Codesammlung meinen Funktionierenden Quellcode reingestellt...
@Berti welche Bibliotheken braucht's denn alle für dein Progi? (Habe Fehler beim Compilieren) Hast du vielleicht noch so ein Mini-Test-Prog? Einfach "LCD Reset" und einen Bytemuster ausgeben. Wäre ja schon froh, wenn das bei mir gehen würde... ;-) Danke!
Probiers mal so. Das Programm schreibt ein Schrachbrettmuster ober rechts auf das DIP-122. (Könnte sein das weitere Pixel zufällig gesetzt sind, da das DIP-122 keinen CLEAR-Befehl kennt, man müsste am Anfang den kompletten Speicher mit 0 füllen, wollte ich der Einfachheit hier weglassen.) Initialisierung braucht das DIP-122 nicht, nur das Command "Display ON" nicht vergessen und die -4V für den Kontrast einregeln. Progr. ist für 8051, musst es halt für AVR anpassen. Die Delays sind extrem bemessen, es würde mit BUSY-Flag Nutzung wesetlich schneller gehen.
1 | // ********************************************************************
|
2 | // Demoprogramm (Minimaltest)
|
3 | // Inhalt: LCD (DIP122-5 122x32 Pixel mit 2xSED1520 Controller) ansteuern
|
4 | // LCD-Controller: SED1520 S-MOS Sytems(2x) kompatibel
|
5 | // 1 (linke Displayhälfte E1)
|
6 | // 2 (rechte Displayhälfte E2)
|
7 | // ********************************************************************
|
8 | |
9 | #include "at89c51ed2.h" // Register des AT89C51ED2 |
10 | |
11 | // Hardware Definebereich
|
12 | #define LCD_ON P1_4
|
13 | #define LCD_E1 P3_5
|
14 | #define LCD_E2 P1_2
|
15 | #define LCD_A0 P3_7
|
16 | #define LCD_RW P3_6
|
17 | #define LCD_RES P1_0
|
18 | #define LCD_DATA P2
|
19 | |
20 | // ********************************************************************
|
21 | // Verzögerungsschleife für kurze Zeit
|
22 | // Zeit: Wartezeit in [zeit]
|
23 | // 1 = 20us
|
24 | // 2 = 28us
|
25 | // 3 = 36us u.s.w. (gilt für 11.0952MHz)
|
26 | // 255 = ca. 2ms
|
27 | // ********************************************************************
|
28 | void delay_us(unsigned char zeit) { |
29 | unsigned char zaehler; |
30 | for ( zaehler = zeit; zaehler; zaehler-- ) { |
31 | _asm nop; _endasm; |
32 | }
|
33 | }
|
34 | |
35 | // ********************************************************************
|
36 | // Verzögerungsschleife für lange Zeit
|
37 | // Zeit: Wartezeit in [zeit]
|
38 | // 1 = ca. 10ms
|
39 | // 2 = ca. 20ms
|
40 | // 3 = ca. 30ms u.s.w.
|
41 | // 255 = ca. 2,5s (gilt für 11.0952MHz)
|
42 | // ********************************************************************
|
43 | void delay(unsigned char zeit) { |
44 | unsigned char zaehler; |
45 | for (zaehler = zeit; zaehler; zaehler--) { |
46 | delay_us(255); // dauert ca. 2ms |
47 | delay_us(255); // dauert ca. 2ms |
48 | delay_us(255); // dauert ca. 2ms |
49 | delay_us(255); // dauert ca. 2ms |
50 | delay_us(255); // dauert ca. 2ms |
51 | }
|
52 | }
|
53 | |
54 | // ***********************************************************************
|
55 | // Schreiben eines Zeichens (Steuerzeichen) das LCD-Modul
|
56 | // Übergabe: lcd_byte : Auszugebendes Steuerzeichen
|
57 | // lcd_teil : 0 - linke Displayhälfte
|
58 | // 1 - rechte Displayhälfte
|
59 | // ***********************************************************************
|
60 | void write_lcd_command(unsigned char lcd_byte, unsigned char lcd_teil) { |
61 | unsigned char lcd_busy = 1; |
62 | delay(2); // Wartezeit, später hier das BUSY-Flag abfragen |
63 | LCD_DATA = lcd_byte; // Byte ausgeben |
64 | LCD_RW = 0; |
65 | LCD_A0 = 0; |
66 | if (!lcd_teil) LCD_E1 = 1; else LCD_E2 = 1; |
67 | delay_us(1); // Impulsverzögerung |
68 | if (!lcd_teil) LCD_E1 = 0; else LCD_E2 = 0; |
69 | }
|
70 | |
71 | // ***********************************************************************
|
72 | // Schreiben eines Zeichens (Daten) das LCD-Modul
|
73 | // Übergabe: lcd_byte : Auszugebendes Datenbyte
|
74 | // lcd_teil : 0 - linke Displayhälfte
|
75 | // 1 - rechte Displayhälfte
|
76 | // ***********************************************************************
|
77 | void write_lcd_data(unsigned char lcd_byte, unsigned char lcd_teil) { |
78 | unsigned char lcd_busy = 1; |
79 | delay(2); // Wartezeit, später hier das BUSY-Flag abfragen |
80 | LCD_DATA = lcd_byte; // Byte ausgeben |
81 | LCD_RW = 0; |
82 | LCD_A0 = 1; |
83 | if (!lcd_teil) LCD_E1 = 1; else LCD_E2 = 1; |
84 | delay_us(1); // Impulsverzögerung |
85 | if (!lcd_teil) LCD_E1 = 0; else LCD_E2 = 0; |
86 | }
|
87 | |
88 | // ********************************************************************
|
89 | // Hauptprogramm
|
90 | // ********************************************************************
|
91 | void main (void) { |
92 | delay(100); // Wartezeit nach POWER-ON bis VCC stabil ist ca. 100ms |
93 | write_lcd_command(0xAF,0); // 1010 1111 (Display on linke Hälfte) |
94 | write_lcd_command(0xAF,1); // 1010 1111 (Display on rechte Hälfte) |
95 | write_lcd_data(0x55,0); // schreibt Schachbrettmuster auf DIP-122 oben rechts |
96 | write_lcd_data(0xAA,0); |
97 | write_lcd_data(0x55,0); |
98 | write_lcd_data(0xAA,0); |
99 | write_lcd_data(0x55,0); |
100 | write_lcd_data(0xAA,0); |
101 | write_lcd_data(0x55,0); |
102 | write_lcd_data(0xAA,0); |
103 | while(1); |
104 | }
|
Hi, dieser Beitrag hat mich echt weiter gebracht! Ich habe das Programm vom Matthias mal an einen Mega32 und das Pollin Display "DG-12232" (für 2,95€) Angepasst, eventuell kann es ja jemanden weiterhelfen!
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.