Forum: Mikrocontroller und Digitale Elektronik CGRAM eines HD44780


von D a v i d K. (oekel) Benutzerseite


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

von spess53 (Gast)


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

von Soul E. (Gast)


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.

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
Noch kein Account? Hier anmelden.