Eigene Zeichen im CGRAM des KS0070B definieren funktioniert nur teilweise

OP #3273409
Lesenswert?

Hallo zusammen,

wie der Titel schon sagt, ich würde gerne selbst definierte Zeichen auf 
meinem 2x16er LCD darstellen, in meinem Fall ein Glockensymbol, einmal 
hohl, und einmal ausgefüllt.

Das übertragen und Darstellen eines einzelnen Zeichens klappt wunderbar, 
ich kann das Zeichen auch auf dem Display darstellen.

Wenn ich jedoch ein zweites und drittes selbstdefiniertes Zeichen an's 
Display sende, kommt am LCD nur Müll raus, beispielsweise zwei 
senkrechte Striche und Punkte, statt einer Glocke.

Hier mal meine entsprechenden Teile des Quellcodes:


Arrays für die beiden Glockensymbole:
1
// Zeichen für den CG RAM definieren
2
// ---------------------------------
3
uint8_t cgramsymbol_glocke_leer[8] =
4
{
5
  0b00000100,
6
  0b00001010,
7
  0b00001010,
8
  0b00001010,
9
  0b00010001,
10
  0b00011111,
11
  0b00000100,
12
  0b00000000,
13
};
14

15
uint8_t cgramsymbol_glocke_voll[8] =
16
{
17
  0b00000100,
18
  0b00001110,
19
  0b00001110,
20
  0b00001110,
21
  0b00011111,
22
  0b00011111,
23
  0b00000100,
24
  0b00000000,
25
};


Übertragen der Bitmuster in den CGRAM:
1
// Leeres Glockensymbol in CG RAM übertragen
2
  LCD_RS(0);
3
  LCD_RW(0);
4
  LCD_DATA(0b01000000);    
5
  LCD_EN();  
6
  
7
  for(uint8_t n=0; n<8; n++) LCD_CHAR(cgramsymbol_glocke_leer[n]);
8
  
9
// Volles Glockensymbol in CG RAM übertragen
10
  LCD_RS(0);
11
  LCD_RW(0);
12
  LCD_DATA(0b01000001);
13
  LCD_EN();
14
  
15
  for(uint8_t n=0; n<8; n++) LCD_CHAR(cgramsymbol_glocke_voll[n]);
16
  
17
// Cursorposition festlegen
18
LCD_LOCATE(1, 1);


...und dann noch die Darstellung auf dem Display:
1
// Leeres Glockensymbol darstellen
2
LCD_LOCATE(1, 16);
3
LCD_CHAR(0b00000000);  
4

5
// Volles Glockensymbol darstellen
6
LCD_LOCATE(1, 15);
7
LCD_CHAR(0b00000001);



Die Darstellung der leeren Glocke in Spalte 16 klappt wunderbar (nur 
wenn ich ein einzelnes Zeichen definiere und übertrage), aber die volle 
Glocke in Spalte 15 will nicht so, wie sie soll (wenn ich zwei oder mehr 
Zeichen definiere), da stehen nur Striche durcheinander...

Nur warum? Ich komm nicht drauf.

Grüße, Christian
Gast #3273420
Lesenswert?

Versuchs mal so:
1
// Volles Glockensymbol in CG RAM übertragen
2
  LCD_RS(0);
3
  LCD_RW(0);
4
  LCD_DATA(0b01001000);
5
  LCD_EN();

Dein zweites Zeichen beginnt an CG-RAM Adresse 8 und nicht 1.
Dein drittes Zeichen beginnt an CG-RAM Adresse 16 und nicht 2.
Gast #3273431
Lesenswert?

Bevor ich es vergesse.

Diese Ausgabe ist dann trotzdem richtig:
1
// Leeres Glockensymbol darstellen
2
LCD_LOCATE(1, 16);
3
LCD_CHAR(0b00000000);  
4

5
// Volles Glockensymbol darstellen
6
LCD_LOCATE(1, 15);
7
LCD_CHAR(0b00000001);
OP #3273434
Lesenswert?

holger schrieb:
> Bevor ich es vergesse.
>
> Diese Ausgabe ist dann trotzdem richtig:
>
>
1
> // Leeres Glockensymbol darstellen
2
> LCD_LOCATE(1, 16);
3
> LCD_CHAR(0b00000000);
4
> 
5
> // Volles Glockensymbol darstellen
6
> LCD_LOCATE(1, 15);
7
> LCD_CHAR(0b00000001);
8
>
Ich weiß. Hab's grade bemerkt ;)

Nur komischerweise steht von der CGRAM-Adressierung nix detailliertes im 
mitgelieferten Datenblatt. Da hätt ich lange suchen und basteln 
können...

Christian
Gast #3273491
Lesenswert?

Hi

> Wär ich ehrlichgesagt nicht drauf gekommen
>dass der Controllerchip auf dem Display ein extra Datenblatt hat.

Ja, da gibt es eigene Datenblätter. Und die sind meist wichtiger als das 
eigentliche Displaydatenblett.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren