EA DOG-M LCD-Treiber für Codevision gesucht

Gast #337422
Lesenswert?

Da ist die Lib.

Ich hatte ein 3x16 LCD, und habe folgende Sonderfunktionen
hinzugefügt.
Außerdem die Initialisierung geändert.

Hiermit lassen sich aus 2 Zeilen eine hohe Zeile machen.

// DOGM Double High Funktion 1,2,3
void lcd_high (char high);

Hiermit kannst du den Kontrast in 15 Schritten ändern.

// DOGM Contrsat Set 1,2,...,10 - 15
void lcd_contrast (char contrast);

Bei Fragen, kannst dich gerne melden.

void lcd_high (char high)
{
switch (high) {
    case 1:
        //3 Zeienbetrieb
        //_lcd_ready(); // RS=0
        //_lcd_write_data(0x29);
        //Zurück zur Tabelle 0:1
        _lcd_ready(); // RS=0
        _lcd_write_data(0X28);
    break;
    case 2:
        //unteren beiden Zeilen Zusammen
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2E);  //Table2
        _lcd_ready(); // RS=0
        _lcd_write_data(0x10);  //UD auf 1
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2C);  //DH auf 1
    break;
    case 3:
         //oberen beiden Zeilen Zusammen
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2E);  //Table2
        _lcd_ready(); // RS=0
        _lcd_write_data(0x18);  //UD auf 0
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2C);  //DH auf 1
    break;
    };
     //Zurück zur Tabelle 0:1
    //_lcd_ready(); // RS=0
    //_lcd_write_data(0X28);
}

void lcd_contrast (char contrast)
{
switch (contrast) {
    case 1:
        _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x71);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 2:
        _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x72);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 3:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x73);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 4:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x74);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 5:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x75);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 6:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x76);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 7:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x77);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 8:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x78);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 9:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x79);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 10:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7A);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 11:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7B);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 12:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7C);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 13:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7D);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 14:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7E);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    case 15:
         _lcd_ready(); // RS=0
        _lcd_write_data(0x29);  //Function set Tabelle 1,0
         _lcd_ready(); // RS=0
        _lcd_write_data(0x7F);
         _lcd_ready(); // RS=0
        _lcd_write_data(0x51);
    break;
    };
    // Zurück zur Tabelle 0:1
    _lcd_ready(); // RS=0
    _lcd_write_data(0X28);
}

Gruß Toby
Angehängte Dateien:
Gast #337423
Lesenswert?

Was mir noch eigefallen ist,

wenn Du irgendwelche Einstellungen vornimmst, z.B. den Kontrast ändern
oder die Zeilenhöhe,
mußt Du beim nächsten Schreibvorgang darauf achten, in welcher
Funktionstabelle du dich befindest.

Falls Du Änderungen vornimmst, sage es mir bitte, da ich diese bestimmt
auch verwenden kann.

Gruß Toby
Gast #337424
Lesenswert?

Danke Toby für deine Antwort.

Ich habe deinen Code auch gleich mal ausprobiert.

...

lcd_init(16);
lcd_contrast (15);
lcd_high (0);
lcd_clear();
lcd_gotoxy(0,0);
  lcd_putsf("ABCDEFGHIJklmnop");
lcd_gotoxy(0,1);
  lcd_putsf("1234567890");

...

aber leider sehe ich die zweite Zeile nicht.

Habe ich noch etwas vergessen?
Gast #337425
Lesenswert?

Hallo,

so sieht die Init bei mir aus:

// LCD module initialization
    lcd_init(16);
    lcd_clear();
    // Setze LCD Kontrast Zurück zur Tabelle 0:1
    lcd_contrast(15);

    lcd_enable = 0;

    lcd_clear();

    lcd_high(1);

Aber wenigstens geht die 1. Zeile schonmal!

Hier liegt dein Fehler:
lcd_high(0);

Du mußt 1,2 oder 3 übergeben.

Gruß Toby
Gast #337427
Lesenswert?

"Hier liegt dein Fehler:
lcd_high(0);"

Das war nur ein kleiner Test von mir. Mit lcd_high(1) kam das gleiche
heraus-
Du hast wahrscheinlich die Version DOGM163, während ich ein
zweizeiliges Display (DOGM162) habe. Da sind dann bestimmt die
Initialsierungsbefehle anders.
Gast #337431
Lesenswert?

Hallo,

wenn du in die 3. Zeile schreibst, oder wann?

Ich dachte, die Anfangsadressen sind gleich, da es der gleiche
Controller ist.
Wenn es so ist, mußt Du diese Startadressen der einzelnen Zeilen in der
Lib ändern:

// initialize the LCD controller
unsigned char lcd_init(unsigned char lcd_columns)
{
#asm
    cbi   __lcd_port,__lcd_enable ;EN=0
    cbi   __lcd_port,__lcd_rs     ;RS=0
#endasm
_lcd_maxx=lcd_columns;
_base_y[2]=lcd_columns+0x90; // hier kannst Du die Adresse der 1.Zeile
ändern
_base_y[3]=lcd_columns+0xA0; // hier die der 2. Zeile

Gruß Toby
Gast #337433
Lesenswert?

Ach,

bitte lese im original Datenblatt der Controllers nach der Init.
Mit der auf dem PDF von EA kam ich auch nicht klar.

Es gibt ein Bit, N3 und N.

Bei 3 Zeilen ist es N3=1, N=1.
Bei 2 Zeilen muß es N3=0, N=1 heißen.
Dann hast Du 2 Zeilen initianilisiert.

Ein 2 Zeilen LCD hat ja nur eine Zeile mit 2x 40 Zeichen.
Startadresse 1. ist 00
Startadresse 2. ist 40.

Beim 3 Zeiligen hat man eigentlich 4x20 Zeichen.
Startadresse 1. 00
Startadresse 2. 10
Startadresse 3. 20

Die Startadressen stimmen so, lt. Datenblatt.
Mit den Zeilen bei den Displays kann ich mich auch täuschen.

Gruß Toby

Gruß Toby
Gast #337435
Lesenswert?

Hallo nochmal,

ich habe nun ein DOGM 163 W, mit Amber Beleuchtung.

Laut EA Homepage soll der Hintergrung weiß, und die Schrift schwarz
sein.

Bei mir ist er aber eher durchsichtig.

Kann mir das mal wer erklären?

Gruß Toby
Gast #337436
Lesenswert?

Hallo, ich mach den Thread nochmal auf, weil ich grad an einem DOG 162,
also nur mit zwei Zeilen dransitze und die Lib nicht zum Laufen bekomme
(4 Bit, 5V Vcc, Anschaltung laut EA DB und CodeVision).

Die lcd_init(16); gibt immer "nicht erkannt" zurück.

Also meine Frage: Hat vielleicht schonmal jemand obige Lib mit einem
162er getestet und laufen gehabt? Weil ich doch meine,
Verdrahtungs-fehler ausschließen zu können.

Und falls nein, hat schon mal jemand eine Init für das 162er
geschieben?

Grüße,
Christoph
Gast #337437
Lesenswert?

Hallo Christoph,

für das 162 mußt du die Init ändern, es wird anders Initialisiert.
ich habe leider immer noch kein 162, nur ein 163, sonst könnte ich Dir
weiterhelfen, in dem ich es selber teste.

Gruß Toby
Gast #337438
Lesenswert?

Hi *,

Also Deine Lib geht auch mit dem 162er. Einzig und allein müßte ganz
oben die Zeile mit 0x80,0x90 etc. auf 0x80, 0xC0 geändert werden fürs
162er. Auch unten in der lcd_init ändern. Dann tuts einwandfrei.

Ich hatte den Reset auf Masse gelegt. Darum gings nicht :) Es lebe
Kupferlackfädeldraht.

Viele Grüße,
Christoph
Gast #337439
Lesenswert?

Hallo Christoph,

das ist ja mal eine tolle Resonanz, Danke dafür!

Gruß Toby

Ach ja, irgendwas stimmt noch nichzt mit der Zeilenhöhe bzw. den User
Chars.

Wenn man User Chars erstellen will, bin ich irgendwie in der falschen
Tabelle.
Dann muß ich erst von 3 auf 2 Zeilenbetrieb (DoubleHigh) umschalten,
und wieder zurück.
Dann gehts.

Vielleicht findest Du ja was raus.

Gruß nochmal!

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