CGRAM eines HD44780

OP Persönliche Seite #3166066
Lesenswert?

Hi,

hab mir aus der Bucht das hier gekauft:
http://www.ebay.de/itm/380630838372?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649

Wie üblich bei Artikeln aus Fernost ohne Datenblatt.

Habe mich jedoch an folgende beiden Links gehalten und konnte es mit 
Leichtigkeit innerhalb weniger Minuten ansteuern. (Hab einen Teensy++ 
2.0 genutzt)

http://www.mikrocontroller.net/attachment/64073/lcd.pdf
http://www.geocities.com/dinceraydin/lcd/custom.htm

Nun wollte ich noch schnell die 8 benutzerdefinierten Zeichen 
programmieren und kam dabei auf einen Nebeneffekt.

Ich brauchte einen ansteigenden Balken zur Visualisierung verschiedener 
Datensätze.

Folgendes habe ich probiert:
1
void define_lcd_bars()
2
{
3
  lcd_sendcmd(0b01000000);//An die Speicheradresse 64 springen (UserDef)
4
  lcd_sendchar(0b00000000);//oberste Matrixzeile schreiben
5
  lcd_sendchar(0b00000000);
6
  lcd_sendchar(0b00000000);
7
  lcd_sendchar(0b00000000);
8
  lcd_sendchar(0b00000000);
9
  lcd_sendchar(0b00000000);
10
  lcd_sendchar(0b00000000);
11
  lcd_sendchar(0b00011111);//unterste Matrixzeile schreiben
12
  lcd_sendcmd(0b10000000);//An die Adresse 128 springen (normale Ausgabe)
13
        ...
14
}

Scheint soweit auch zu funktionieren, da ich mit "lcd_sendchar(0);" dann 
ein Zeichen erhalte, welches genau wie das definierte ausschaut.

Nun habe ich den Code erweitert:
1
void define_lcd_bars()
2
{
3
  lcd_sendcmd(0b01000000);//An die Speicheradresse 64 springen (UserDef)
4
  lcd_sendchar(0b00000000);//oberste Matrixzeile schreiben
5
  lcd_sendchar(0b00000000);
6
  lcd_sendchar(0b00000000);
7
  lcd_sendchar(0b00000000);
8
  lcd_sendchar(0b00000000);
9
  lcd_sendchar(0b00000000);
10
  lcd_sendchar(0b00000000);
11
  lcd_sendchar(0b00011111);//unterste Matrixzeile schreiben
12
  lcd_sendcmd(0b10000000);//An die Adresse 128 springen (normale Ausgabe)
13
  lcd_sendcmd(0b01001000);//An die Speicheradresse 72 springen (UserDef)
14
  lcd_sendchar(0b00000000);//oberste Matrixzeile schreiben
15
  lcd_sendchar(0b00000000);
16
  lcd_sendchar(0b00000000);
17
  lcd_sendchar(0b00000000);
18
  lcd_sendchar(0b00000000);
19
  lcd_sendchar(0b00000000);
20
  lcd_sendchar(0b00011111);
21
  lcd_sendchar(0b00011111);//unterste Matrixzeile schreiben
22
  lcd_sendcmd(0b10000000);//An die Adresse 128 springen (normale Ausgabe)
23
        ...usw.
24
}

und bekomme mit:
1
lcd_sendchar(0);
2
lcd_sendchar(1);
3
lcd_sendchar(2);
4
lcd_sendchar(3);
5
lcd_sendchar(4);
6
lcd_sendchar(5);
7
lcd_sendchar(6);
8
lcd_sendchar(7);

Wie erwartet die richtigen Zeichen.

So weit alles gut. Nun habe ich beim Testen versehenlich mal nicht binär 
incrementiert sondern decimal. (Also das 2. Zeichen in Adresse 
0b01000001 statt 0b01001000 geschrieben; 65 statt 72 usw.)

Das führte dazu, dass die erste Zeile von meinen 2x16 Zeichen Display 
"weiß hinterlegt" war. Also nicht weiß überschrieben, wie es der Curser 
macht, sondern so als ob ich den Kontrast nur für die erste Zeile 
einzelnd einstellen könnte und dieser verstellt wäre.

Nun zur eigentlichen Frage:
Was habe ich dort verstellt und gibt es eine Tabelle mit den Parametern 
für die Adressen 65-126 (ohne 72; 80, 88, 96; 104; 112; 120)

Grüße Oekel
Gast #3166089
Lesenswert?

Hi

>  lcd_sendcmd(0b01000000);//An die Speicheradresse 64 springen (UserDef)

Damit adressierst du nicht 'Speicheradresse 64' des CGRAMs sondern die 
Adresse 0. 0b01xxxxxx ist der Befehl 'Set CGRAM Address'. Bit5...Bit0 
sind die Adresse.

>  lcd_sendcmd(0b10000000);//An die Adresse 128 springen (normale Ausgabe)
>  lcd_sendcmd(0b01001000);//An die Speicheradresse 72 springen (UserDef)

Ist überflüssig. Weglassen und nächstes Zeichen schreiben.

>Was habe ich dort verstellt und gibt es eine Tabelle mit den Parametern
>für die Adressen 65-126 (ohne 72; 80, 88, 96; 104; 112; 120)

Du bringst Befehl und Adresse durcheinander. Befehl ist 0b01xxxxxx und 
Adresse geht von 0 bis 63.

MfG Spess
Gast #3166142
Lesenswert?

D a v i d K. schrieb:>

> Nun zur eigentlichen Frage:
> Was habe ich dort verstellt und gibt es eine Tabelle mit den Parametern
> für die Adressen 65-126 (ohne 72; 80, 88, 96; 104; 112; 120)

Das steht leider nicht im Datenblatt. Die RAM-Adressen jenseits des 
CGRAM verwendet der Controller intern. Du hast gerade die Statemachine 
für das Multiplexing durcheinandergebracht, daher die Kontraständerung.

Mit solchen Aktionen kann man das Panel auch beschädigen, die mögen 
keinen DC-Offset.

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