Guten Abend, da ich dieses Forum häufig nutze wenn ich Fragen zur uC Programmierung habe, dachte ich es ist an der Zeit auch mal etwas zurückzugeben... Also stelle ich jetzt mal meine LCDroutinen vor. Hintergrund: Das LCD Display EA DIP204-4 hat mir leichte Kopfschmerzen bereitet. Ich habe schon diverse andere LCDs zum laufen gebracht, aber bei diesem hatte ich Schwierigkeiten mit der Initialisierung. Da offenbar auch andere Nutzer dieses Forums schon Probleme mit diesem LCD hatten, poste ich mal meine Lösung zum Init. Das Display verwendet den Controller KS0073. Dieser ist zwar nahezu 100% HD44780 kompatibel(laut Datenblatt), aber auch nur nahezu... Denn die Initialisierung läuft anders ab als beim HD44780. Hierzu eine Passage aus den Datenblatt es KS0073: 1) Clear Display 2) Set Functions instruction 3) Control Display ON/OFF instruction 4) Set Entry Mode instruction 5) Set Extension Function instruction 6) Enable Scroll/Shift instruction 7) Set scroll Quantity instruction danach muss unter umständen wieder Clear Display ausgeführt werden. Die passenden Kommandos für eine 4x20 Zeichen initialisierung bitte dem Dateianhang entnehmen. mfg Neurotoxer
sers, hat vielleicht die initialisierung jemand auch für assembler??? gru?
hab ein ea dip204-4 mit ks0073 kontroller
Hier mein code: (Leider funktioniert er nicht, alles wie im tutorial,
nur init anders:)
.include "m8def.inc"
.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten
RAM-Adresse
out SPL, temp1
ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten
RAM-Adresse
out SPH, temp1
ldi temp1, 0xFF ; Port D = Ausgang
out DDRD, temp1
rcall lcd_init ; Display initialisieren
rcall lcd_clear ; Display löschen
ldi temp1, 'T' ; Zeichen anzeigen
rcall lcd_data
ldi temp1, 'e' ; Zeichen anzeigen
rcall lcd_data
ldi temp1, 's' ; Zeichen anzeigen
rcall lcd_data
ldi temp1, 't' ; Zeichen anzeigen
rcall lcd_data
loop:
rjmp loop
;.include "lcd-routines.asm" ; LCD-Routinen werden hier
eingefügt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LCD-Routinen ;;
;; ============ ;;
;; (c)andreas-s@web.de ;;
;; ;;
;; 4bit-Interface ;;
;; DB4-DB7: PD0-PD3 ;;
;; RS: PD4 ;;
;; E: PD5 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;sendet ein Datenbyte an das LCD
lcd_data:
mov temp2, temp1 ; "Sicherungskopie" für
; die Übertragung des 2.Nibbles
swap temp1 ; Vertauschen
andi temp1, 0b00001111 ; oberes Nibble auf Null setzen
sbr temp1, 1<<4 ; entspricht 0b00010000
out PORTD, temp1 ; ausgeben
rcall lcd_enable ; Enable-Routine aufrufen
; 2. Nibble, kein swap da es
schon
; an der richtigen stelle ist
andi temp2, 0b00001111 ; obere Hälfte auf Null setzen
sbr temp2, 1<<4 ; entspricht 0b00010000
out PORTD, temp2 ; ausgeben
rcall lcd_enable ; Enable-Routine aufrufen
rcall delay50us ; Delay-Routine aufrufen
ret ; zurück zum Hauptprogramm
; sendet einen Befehl an das LCD
lcd_command: ; wie lcd_data, nur RS=0
mov temp2, temp1
swap temp1
andi temp1, 0b00001111
out PORTD, temp1
rcall lcd_enable
andi temp2, 0b00001111
out PORTD, temp2
rcall lcd_enable
rcall delay50us
ret
; erzeugt den Enable-Puls
;
; Bei höherem Takt (>= 8 MHz) kann es notwendig sein,
; vor dem Enable High 1-2 Wartetakte (nop) einzufügen.
; Siehe dazu Beitrag "Re: Bitte helft mir. Schon wieder AtMega16"
lcd_enable:
sbi PORTD, 5 ; Enable high
nop ; 3 Taktzyklen warten
nop
nop
cbi PORTD, 5 ; Enable wieder low
ret ; Und wieder zurück
; Pause nach jeder Übertragung
delay50us: ; 50us Pause
ldi temp1, $42
delay50us_:dec temp1
brne delay50us_
ret ; wieder zurück
; Längere Pause für manche Befehle
delay5ms: ; 5ms Pause
ldi temp1, $21
WGLOOP0: ldi temp2, $C9
WGLOOP1: dec temp2
brne WGLOOP1
dec temp1
brne WGLOOP0
ret ; wieder zurück
; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
ldi temp3,50
powerupwait:
rcall delay5ms
dec temp3
brne powerupwait
ldi temp1, 0b00100100 ;
out PORTD, temp1 ;
rcall lcd_enable ;
rcall delay5ms
ldi temp1, 0b00001001 ; 4bit-Modus einstellen
out PORTD, temp1
rcall lcd_enable
rcall delay5ms
ldi temp1, 0b00100000 ; 4Bit
rcall lcd_command
ldi temp1, 0b00001100 ; Display ein Cursor aus
kein Blinken
rcall lcd_command
ldi temp1, 0b00000110 ; inkrement / kein Scrollen
rcall lcd_command
ret
; Sendet den Befehl zur Löschung des Displays
lcd_clear:
ldi temp1, 0b00000001 ; Display löschen
rcall lcd_command
rcall delay5ms
ret
; Sendet den Befehl: Cursor Home
lcd_home:
ldi temp1, 0b00000010 ; Cursor Home
rcall lcd_command
rcall delay5ms
ret
bitte um hilfe
Servus,
versuchs mal mit dieser Init-Routine:
lcd_init:
ldi temp3,50
powerupwait:
rcall delay5ms
dec temp3
brne powerupwait
rcall lcd_clear
ldi temp1, 0b00100100
rcall lcd_command
ldi temp1, 0b00001100
rcall lcd_command
ldi temp1, 0b00100000
rcall lcd_command
ldi temp1, 0b00000110
rcall lcd_command
ldi temp1, 0b00100100
rcall lcd_command
ldi temp1, 0b00001001
rcall lcd_command
ldi temp1, 0b00100000
rcall lcd_command
rcall lcd_clear
ret
Auf die Reihenfolge der Kommandos achten! Sonst streikt das Display.
mfg Neurotoxer
super, danke. werde es testen und hoffentlich mal was auf meinem display sehen
@Jochen Ich habe deine Lib oben benutzt. Leider klappt es bei mir trotzdem nicht :( Das Display zeigt mir nur alle Felder als weiße Kästchen an. Kann es zu Problemen führen wenn man die Leitungen zu lang hat? Hab ca. 40cm Kabel bis zum LCD. mfg andy
Codesammlung ?
Gast
#733643
Alle Felder als weisse Kästchen? Kontrast-Spannung?
Gast
#733648
> Das Display zeigt mir nur alle Felder als weiße Kästchen an.
Standardfrage: Weiße Kästen kommen beim DIP-204 auch wenn die
Kontrastspannung nicht stimmt, schon mal geprüft?
Gast
#733712
Deine Initialisierung für 4-Bit ist nicht korrekt: Nimm mal diese:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Damit läuft Dein Programm bei mir mit Anpassung auf einen 8051er und DIP204-4.
Hab meinen Fehler gefunden :) Ich hatte den RES(reset) auf LOW gelegt. Jetzt klappts wunderbar, auch mit der Routine von Peter Fleury. Andy http://i207.photobucket.com/albums/bb49/higedigdag/IMG_2521.jpg
sers, das mit dem reset ist so ne sache, im datenblatt steht doch bei reset L. warum muss das dann auf high liegen wenn es gehen soll??
ja das versteh ich auch nicht... aber ich glaub es ist eher so, dass es nur auf low gelegt wird wenn der reset gemacht werden soll. ich hab ihn jetzt einfach nicht angeschlossen(auch nicht auf high gelegt) weil im datenblatt bei mir steht L und nicht L/H also geh ich davon aus das man es nicht auf high legen muss... es klappt ja jetzt super :) mfg andy
kannst du mal deine routine posten, die weißen kästchen stehen bei mir wie ne eins, langsam weiß ich nicht mehr was ich ncoh machen kann
also ich habe diese genommen: http://homepage.hispeed.ch/peterfleury/avr-software.html#libs du musst in der lcd.h nur den controller umstellen auf den KS0073 und dann deine ports und so anpassen. dann sollte es gehen
endlich, vielen dank an alle, es war letztendlich auch nur der resetanschluss, oh man, obwohl es im datenblatt so steht jetzt kann ich endlich mal anfangen mit dem lcd zu spielen
Servus. Da es eine Nachfrage wegen der Pinbelegung des Displays gab, habe ich diese mal als pdf angehängt.
Ich bin irgentwie am verzweifeln wenn ich das display mit einem pic16f690 initialisiere dann klappt alles wunderbar aber wenn ich die gleiche routine benutze um es mit einem 16F887 zu initialisieren geht fast nix ausser das alle segmente schwarz werden. wenn das display bei der init eingeschaltet wird. was könnte das sein? ich habe es schon nen halbes dutzend mal auf meinem steckbrett aufgebaut und auch bestimmt 100 mal die belegung nachgeschaut aber es will einfach nicht wie gesagt mit dem 16f690 kein problem.
Gast
#858493
ADCON auf digital IO umgeschaltet ? Ansonsten kann man ohne Code und/oder Schaltung nicht viel sagen.
ja ANSEL und ANSELH sind beider auf 0 gesetzt. zur schaltung Steckbrett mit 5V Festspannungsregler dann das Display "normal" angeschlossen PORTC sind die 8 Datenleitungen und auf PORTA habe ich die 3 Steuerleitungen. also nichts spektakuläres habe sowas schon nen paar dutzend mal auf nem Steckbrett aufgebaut und es funktionierte alles bestens sogar mit 8MHz INTOSC beim PIC16F690. Ich habe inzwichen sogar beim 16F887 den LFINTOSC mit 32khz genommen und die Ausgänge überprüft und ja die tun wie se sollen. bin langsam ratlos habe mir sogar schonmal angeschaut wie das bei dme controller mit spi abläuft und festgestellt um 1Byte daten an das ding zu senden muss man 3 byte über den bus schieben und das bei maximal 50kHz SPI CLK
Was für viele selbstverständlich ist, war für mich zuerst nicht ganz klar. Habe alles so angeschlossen wie im dislplay.h beschrieben. Die Pins für den 4Bit-Modus werden vom DIP204 Pin 11 bis 14 benötigt. Durch andere Beiträge, habe ich auch gesehen, dass jemand vergessen hat R/W (SID) auf GND zu schalten. Habe dies gemacht und es funktioniert wunderbar!!! Danke für das Hinaufstellen der Initialisierung. Gruss Alain
Hey, also ich habe einen PIC18F4550. Habe folgenden Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
Ich habe die AVR include oben rausgeschmissen, weil ich nen PIC habe. Habe alles nach Bild angeschlossen. Beim Compilen bekomme ich folgenden Fehler: C:\MCC18\h\display.h:52:Error: syntax error Ich habe deine display.h in den normalen .h Ordner gezogen, und von da meint er einen Fehler in der Zeile 53. Das ist da wo asm volatile("nop"); beginnt. Hat das was damit zu tun weil ich einen PIC habe ? Und was muss ich umschreiben ? Oder habe ich etwas einfaches übersehen ? lg Tim
Hier noch eine funktionierende Version einer Initialisierung für das LCD EA DIP204-4 (NLED), welches an PORTB (=LCD_PORT) angeschlossen ist. PB0 bis PB5: D4, D5, D6, D7, RS, E. R/W auf Masse! RES offen! µC: ATmega 8L, 8MHz Im 4 Zeilen Modus können die Zeilen mit der entsprechenden Adresse angesprochen werden. Die wait-Warteschleifen funktionieren für 8MHz-Taktfrequenz und müssen evtl. bei anderen Frequeunzen angepasst werden. Bitte ausprobieren! Gruß Thomas ;######################################## LCD_INITIALISIERUNG_KS0073: rcall wait_100ms ;Warteschleife 100ms, nur wenn nötig ldi temp,0b00000011 ;muss 3mal hintereinander gesendet out PORTB,temp ;werden zur Initialisierung rcall lcd_enable ;1x rcall wait5ms rcall lcd_enable ;2x rcall wait5ms rcall lcd_enable ;und 3x! rcall wait5ms ldi temp,0b00000010 ;4bit-Modus einstellen out PORTB,temp rcall lcd_enable rcall wait5ms ldi temp,0b00100100 ;4-bit RE=1 rcall lcd_command ldi temp,0b00001001 ; 4 Zeilen-Modus rcall lcd_command ldi temp,0b00100000 ; 4-bit RE=0 rcall lcd_command ldi temp,0b00001100 ;Display ON, Cursor OFF rcall lcd_command ldi temp,0b00000001 ; LCD_CLEAR rcall lcd_command ldi temp,0b00000110 ;Cursor Auto-Inc rcall lcd_command ret ;############################################ ;############################################ LCD_ENABLE: sbi PORTB,LCD_E ; Enable high rcall wait50us ; kurze PAUSE cbi PORTB,LCD_E ; Enable low rcall wait50us ; kurze PAUSE ret ;############################################ ;############################################ ; CURSOR Sprung in ZEILE! LCD_ZEILE1: ldi temp,0b00000010 ;Cursor at home rcall lcd_command ret ;############################################# ; CURSOR Sprung in ZEILE2 LCD_ZEILE2: ldi temp,0b10100000 rcall lcd_command ret ;############################################# ; CURSOR Sprung in ZEILE3 LCD_ZEILE3: ldi temp,0b11000000 rcall lcd_command ret ;############################################# ; CURSOR Sprung in ZEILE4 LCD_ZEILE4: ldi temp,0b11100000 rcall lcd_command ret ;############################################# ;############################################# ; sendet ein Datenbyte an das LCD ; INPUT: temp ; rcall LCD_DATA ; DATENBYTE an LCD inp: temp ; LCD_DATA: push temp ; "Sicherungskopie" push temp ; "Sicherungskopie" swap temp ; Vertauschen andi temp,0b00001111 ; oberes Nibble auf Null setzen out LCD_PORT,temp ; ausgeben sbi LCD_PORT,LCD_RS ; RS ein (high) rcall lcd_enable ; Enable-Routine aufrufen pop temp ; Kopie wieder laden andi temp,0b00001111 ; oberes Nibble auf Null setzen out LCD_PORT,temp ; ausgeben sbi LCD_PORT,LCD_RS ; RS ein (high) rcall lcd_enable ; Enable-Routine aufrufen pop temp ; Kopie wieder laden ret ;############################################# ;sendet einen Befehl an das LCD;wie lcd_data, nur ohne RS zu setzen ; INPUT: temp LCD_COMMAND: push temp ; "Sicherungskopie" swap temp ; Vertauschen andi temp,0b00001111 ; oberes Nibble auf Null setzen out LCD_PORT,temp ; ausgeben cbi LCD_PORT,LCD_RS ; RS aus (low) rcall lcd_enable ; Enable-Routine aufrufen pop temp ; Kopie wieder laden andi temp,0b00001111 ; oberes Nibble auf Null setzen out LCD_PORT,temp ; ausgeben cbi LCD_PORT,LCD_RS ; RS aus (low) rcall lcd_enable ; Enable-Routine aufrufen rcall wait5ms ; Pause (wichtig) ret ;############################################# ;############################################# ;5ms Pause (Werte anpassen an CPU-Takt) wait5ms: push temp1 ; temp1 auf dem Stack sichern push temp2 ; temp2 auf dem Stack sichern ;------------ ldi temp1,50 clr temp2 wait5ms_: dec temp2 brne wait5ms_ dec temp1 brne wait5ms_ ;------------ pop temp2 ; temp2 wiederherstellen pop temp1 ; temp1 wiederherstellen ret ;############################################# ;############################################# ;Pause nach jeder Übertragung;50us Pause ;(Werte anpassen an CPU-Takt) wait50us: push temp ; temp auf dem Stack sichern ldi temp,130 wait50us_: dec temp brne wait50us_ pop temp ; temp wiederherstellen ret
Gast
#2472063
hallo zusammen! wie muss der reset pin jetzt beschalten sein? es handelt sich um den 4bit modus und ich bekomme nichts raus. controller ist ein LPC
Gast
#2473645
Der Reset-Pin bleibt unbeschaltet, offen! Gruß Thomas
Gast
#2473670
Hallo zusammen, Ich habe vor längerer Zeit das Ea-Dip204-4 seriell angeschlossen. Das bedeutet, dass es etwas langsamer geht, dafür braucht man aber nur 2 Leitungen. Kann ja manchmal auch ganz hilfreich sein. Wenn's interessiert, genaueres findet ihr hier. Ich hatte das damals als Treiber für das Ethernut Board implementiert. Aber das eigentlich Interessante kann jeder dort auch für andere Umgebungen herauslesen http://www.tklinux.de/ks0073.html
Hallo, auch wenn dieser Thread schon älter ist: Ich bin gerade dabei das LCD Modul "EA DIP203B-4NLW" ans laufen zu bekommen. Zur Hardware: Ich verwende den Atmega2560. Im Anhang die Pinbeleung. Scheinbar gibt es Probleme mit der Initalisierung. Es leuchten einfach irgnedwelche Zeichen. Habe ein kleines Testprogramm. Die Funktion "display_clear();" scheint aufjedenfall mal zu funktionieren. Vielen Dank schonmal vorab für eure Hilfe. Hauptprogramm:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
Display.h
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 | |
167 | |
168 | |
169 | |
170 | |
171 | |
172 | |
173 | |
174 | |
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
