Hallo,
Ich will ein 4-Zeiliges Display mit der Artikelbezeichnung EA W164B-NLW
ansteuern. Verkabelt etc ist schon alles, es funktioniert auch schon.
Habe dazu eine Library die ich für 2 zeilige Displays verwende
verwendet. Darum funktionieren auch nur die ersten 2 Zeilen des
Displays.
Habe schon probiert die Library auf 4 Zeilig umzumodifizieren, da aber
meine C-Künste im Keller liegen funktionierts aber leider nicht.
Die Koordinaten für den Curser werden im C-Code mit lcd_gotoxy(x,y)
angegeben. y sind die Zeilen.
Hier die Original-Library für 2-zeilige Displays:
structlcd_pin_mapconstLCD_WRITE={0,0,0,0,0};// For write mode all pins are out
110
structlcd_pin_mapconstLCD_READ={0,0,0,0,15};// For read mode data pins are in
111
112
113
114
BYTElcd_read_byte(){
115
BYTElow,high;
116
set_tris_lcd(LCD_READ);
117
lcd.rw=1;
118
delay_cycles(1);
119
lcd.enable=1;
120
delay_cycles(1);
121
high=lcd.data;
122
lcd.enable=0;
123
delay_cycles(1);
124
lcd.enable=1;
125
delay_us(1);
126
low=lcd.data;
127
lcd.enable=0;
128
set_tris_lcd(LCD_WRITE);
129
return((high<<4)|low);
130
}
131
132
133
voidlcd_send_nibble(BYTEn){
134
lcd.data=n;
135
delay_cycles(1);
136
lcd.enable=1;
137
delay_us(2);
138
lcd.enable=0;
139
}
140
141
142
voidlcd_send_byte(BYTEaddress,BYTEn){
143
144
lcd.rs=0;
145
while(bit_test(lcd_read_byte(),7));
146
lcd.rs=address;
147
delay_cycles(1);
148
lcd.rw=0;
149
delay_cycles(1);
150
lcd.enable=0;
151
lcd_send_nibble(n>>4);
152
lcd_send_nibble(n&0xf);
153
}
154
155
156
157
voidlcd_init(){
158
BYTEi;
159
set_tris_lcd(LCD_WRITE);
160
lcd.rs=0;
161
lcd.rw=0;
162
lcd.enable=0;
163
delay_ms(15);
164
for(i=1;i<=3;++i){
165
lcd_send_nibble(3);
166
delay_ms(5);
167
}
168
lcd_send_nibble(2);
169
for(i=0;i<=3;++i)
170
lcd_send_byte(0,LCD_INIT_STRING[i]);
171
}
172
173
174
voidlcd_gotoxy(BYTEx,BYTEy){
175
BYTEaddress;
176
177
if(y=1)
178
address=lcd_line_one;
179
elseif(y=2)
180
address=lcd_line_two;
181
elseif(y=3)
182
address=lcd_line_three;
183
elseif(y=4)
184
address=lcd_line_four;
185
else
186
address=0;
187
address+=x-1;
188
lcd_send_byte(0,0x80|address);
189
}
190
191
voidlcd_putc(charc){
192
switch(c){
193
case'\f':lcd_send_byte(0,1);
194
delay_ms(2);
195
break;
196
case'\n':lcd_gotoxy(1,2);break;
197
case'\b':lcd_send_byte(0,0x10);break;
198
default:lcd_send_byte(1,c);break;
199
}
200
}
201
202
charlcd_getc(BYTEx,BYTEy){
203
charvalue;
204
205
lcd_gotoxy(x,y);
206
while(bit_test(lcd_read_byte(),7));// wait until busy flag is low
207
lcd.rs=1;
208
value=lcd_read_byte();
209
lcd.rs=0;
210
return(value);
211
}
212
213
/* lcd_set_CG() Set User-defineable Characters: Standard-Displays have up to 8 different Characters (max. 8x8=64 Byte, CG means Custom-Graphics)
214
input: ChNum: Custom-Graphics Ram Address (0 .. 7), can be used e.g. by printf("%c", 0); for 1st CG or printf("\1"); for 2nd CG-Character
215
Buffer: Address of a 8-Byte-Buffer containing the Pixel-Information: 1st Byte: Top Line (only 1st 5 Bits = Bit0..4 used)
216
usage: unsigned char UserChar[8] = {0x00,0x00,0x00,0x1F,0x11,0x15,0x11,0x1F }; // 8 Bytes Pixel-Data: e.g. a square with a dot inside
217
lcd_set_CG(3, UserChar); // set 4th CG-Ram to Pixel-Definition (8 user-defineable Characters possible (0 .. 7))
218
printf(lcd_putc, "Hallo \3"); // printf 3rd char
219
*/
220
voidlcd_set_CG(BYTEChNum,BYTE*Buffer)
221
{
222
BYTEb;
223
lcd_send_byte(0,0x40|((chnum&0x07)<<3));// Set CG-Address
224
for(b=0;b<=7;b++)
225
lcd_send_byte(1,Buffer[b]);// Set 8 Bytes of Character-Data
226
}
227
228
/* lcd_cursor() Enable / Disable Cursor
229
inputs: On: 1: enable Cursor: lower 5 Pixel (='Underline') at current Cursor-Pos is always on
230
Blink: 1: Character at current Cursor-Pos blinks: all Pixels ON (5x8) alternate with current Character
231
*/
232
voidlcd_cursor(int1On,int1Blink)
233
{
234
BYTECursorCmd=0x0C;// Display on/off control: 0x08, + Display always ON: 0x04
235
if(Blink)
236
CursorCmd|=0x01;// Character Blinks at Cursor-Pos
237
if(On)
238
CursorCmd|=0x02;// Cursor ON
239
lcd_send_byte(0,CursorCmd);// Set Cursor-Command
240
}
Die Adressen für die Zeilen des Displays sind laut Datenblatt für
Zeile1 $00-$0F
Zeile2 $40-$4F
Zeile3 $10-$1F
Zeile4 $50-$5F
, was ich auch am Anfang für lcd_line_one, etc. definiert habe.
Ich vermute dass in der Funktion lcd_gotoxy der Programmierfehler von
mir liegt.
Kann mir wer helfen?
Danke!
MfG Emanuel
Hi
>Weiß denn sonst keiner eine passende Lösung?
Erzähle erst mal, was genau nicht geht. Ein Datenblatt von deinem
Display wäre auch nicht schlecht.
MfG Spess
Emanuel J. schrieb:> This source code may only be distributed to other ////> //// licensed users of the CCS C compiler.
OT: Was mir so aufgefallen ist, das Forum hier ist ein "licensed user of
the CCS C compiler"?
Edit: Soll nur ein freundlich gemeinter Hinweis sein. Nicht das du evtl.
Ärger bekommst.
Ok, danke für eure Antworten.
Obwohl ich kein guter C-Programmierer bin ist mir selbst das mit der
Zuweisung und Abfrage in einer IF-Schleife ziemlich peinlich xD, sowas
passiert mir nicht allzu oft...
Leider funktionierts aber noch immer nicht, also wenn ich im Programm
goto_xy(1,3) schreibe, schreibts mir die Schrift immer in die 2. statt
in die 3. Zeile. Jedoch wenn ich mehr als 16 Zeichen schreibe, also die
maximale "länge" des Displays, wird der Satz oder was auch immer in der
3. Zeile fortgesetzt.
Was mir noch aufgefallen ist:
1
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
und das kann bei 4 zeilen dann wohl nicht mehr stimmen.
Verwendet wird lcd_type bei
Hi
>Was mir noch aufgefallen ist:>#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines>und das kann bei 4 zeilen dann wohl nicht mehr stimmen.
Doch. Die Einstellung 1/2-zeilig im Controller hat nur sehr bedingt
etwas mit der Anzahl der Displayzeilen zu tun. Es gibt 1x16 Displays,
die 2-Zeilig initialisiert werden müssen und bei denen die Zeichen o..7
eine Zeile und 8..15 die zweite Zeile sind.
Bei vierzeiligen Displays sind die Displayzeilen 0 und 2 die erste und 1
und 3 die zweite Zeile.
>BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};>änder das mal auf folgende Zeile>BYTE const LCD_INIT_STRING[4] = {0x28, 0xc, 1, 6};
kommt aus gleiche heraus:
0x20| 0x10<<2 = 00101000 = $28
MfG Spess
Blöde Frage -
Du hast nicht zufällt ein \n vor Deinem Text stehen ?
Ich meine nur, weil in Deiner lcd_putc routine noch fest zeile 2 bei \n
angesprungen wird ?
( case '\n' : lcd_gotoxy(1,2); break; )
Das mit den 4 Zeilen funktioniert nun, danke an alle (bes. Spess)
NurEinGast schrieb:> Blöde Frage ->> Du hast nicht zufällt ein \n vor Deinem Text stehen ?>> Ich meine nur, weil in Deiner lcd_putc routine noch fest zeile 2 bei \n> angesprungen wird ?>> ( case '\n' : lcd_gotoxy(1,2); break; )
Jap das hab ich mir auch schon gedacht, hatte ich aber nicht stehen. Und
dass wird das nächste..
wie kann ich das mit dem Zeilenumbruch nun mit 4 zeilen machen?
Am besten die Curserposition abfragen und je nach dem in die richtige
Zeile setzen oder?
danke & mfg