C Grafik LCD Display Probleme 0.o

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo Freunde,


Es gab hier schon mal einen Beitrag zum Thema "GLCD 128 x 64
Darstellungsproblem)

Das gleiche Problem habe ich jetzt auch... Wenn ich Zahlen darstellen
möchte, werden die vorher gesetzten Piexel nicht gelöscht...

Ich benutze die GLCD Library für den "KS0108" von Peter Fleury...

Hat jemand das gleiche Problem schon mal gelöst bekommen?
 

Anhänge

  • 2014-01-25 14-17-27.306.jpg
    2014-01-25 14-17-27.306.jpg
    247,6 KB · Aufrufe: 22
Hallo Janiiix,

das sieht für mich aus, als wenn die aktuelle Ausgabe mit dem aktuellen Inhalt im Displayram "verodert" wird.

Ich habe mir das Projekt angesehen (ich hatte es von der letzten Frage noch auf meinem Rechner, du solltest es hier noch einmal verlinken oder anhängen, damit es auch andere User schneller finden).

Soweit ich auf den ersten Blick sehen konnte, liegt die Ursache in der Funktion ks0108WriteData(uint8_t data). Wenn hier die y-Koordinate nicht ein vielfaches von 8 ist, liegt das Zeichen, welches ausgegeben wird in zwei Pages (eine Page ist 8Bit hoch) und füllt nicht die volltändige Höhe der Page aus. Damit die Daten über und unter dem Zeichen erhalten bleiben, wird hier immer der Inhalt des Grafikspeichers gelesen, mit einem Teil der aktuell auszugebenden Daten "verodert" und wieder ausgegeben. Das Problem ist, dass sich die Zeichen bei der nächsten Ausgabe ebenfalls verodern. Du müsstest dafür sorgen, dass im Zeichenbereich nicht "verodert" wird, also die Funktion oben ändern, oder vor Ausgabe des Zeichens einen entsprechenden Bereich des Displayrams mit einem gefüllten Rechteck überschreiben.

Ob es tatsächlich daran liegt, kannst du austesten, indem du die y-Koordinate auf ein vielfaches von 8 setzt, dann müsste der Effekt nämlich weg sein.
Dirk :ciao:


Code:
void ks0108WriteData(uint8_t data) {
    uint8_t displayData, yOffset, cmdPort;

#ifdef DEBUGGING                                    // Künstliche Verlangsamung der Datenausgabe
    volatile uint16_t i;                            // Kann zur Anpassung verwendet werden, falls Ausgabe
    for(i=0; i<50; i++);                            // keine Harmonie mit Display herstellen kann
#endif

    if(ks0108Coord.x >= 128)
        return;

    if(ks0108Coord.x < 64) {
        LCD_CMD_PORT &= ~(0x01 << CSEL2);            // deselect chip 2
        LCD_CMD_PORT |= 0x01 << CSEL1;                // select chip 1
    } else if(ks0108Coord.x >= 64) {
        LCD_CMD_PORT &= ~(0x01 << CSEL1);            // deselect chip 1
        LCD_CMD_PORT |= 0x01 << CSEL2;                // select chip 2
    }
    if(ks0108Coord.x == 64)                            // chip2 X-address = 0
        ks0108WriteCommand(LCD_SET_ADD, CHIP2);
    
    LCD_CMD_PORT |= 0x01 << D_I;                    // D/I = 1
    LCD_CMD_PORT &= ~(0x01 << R_W);                    // R/W = 0
    LCD_DATA_DIR = 0xFF;                            // data port is output
    
    
    yOffset = ks0108Coord.y%8;
    if(yOffset != 0) {
        // first page
        cmdPort = LCD_CMD_PORT;                        // save command port
        displayData = ks0108ReadData();
        
        LCD_CMD_PORT = cmdPort;                        // restore command port
        LCD_DATA_DIR = 0xFF;                        // data port is output
        
        displayData |= data << yOffset;
        if(ks0108Inverted)
            displayData = ~displayData;
        LCD_DATA_OUT = displayData;                    // write data
        ks0108Enable();                                // enable
        
        // second page
        ks0108GotoXY(ks0108Coord.x, ks0108Coord.y+8);
        
        displayData = ks0108ReadData();
        
        LCD_CMD_PORT = cmdPort;                        // restore command port
        LCD_DATA_DIR = 0xFF;                        // data port is output
        
        displayData |= data >> (8-yOffset);
        if(ks0108Inverted)
            displayData = ~displayData;
        LCD_DATA_OUT = displayData;                    // write data
        ks0108Enable();                                // enable
        
        ks0108GotoXY(ks0108Coord.x+1, ks0108Coord.y-8);
    } else {
        if(ks0108Inverted)
            data = ~data;
        LCD_DATA_OUT = data;                        // write data
        ks0108Enable();                                // enable
        ks0108Coord.x++;
    }
    LCD_DATA_OUT = 0x00;

}
 
Da ich meinen Rechner jetzt aus mache und dann nur noch mobil online bin, habe ich schnell einmal eine Änderung an der Funktion ks0108WriteData(uint8_t data) vorgenommen.

Dies kannst du mal austesten.

1.
suche
displayData |= data << yOffset;
ersetze durch
displayData &= ~(0xFF << yOffset);
displayData |= data << yOffset;


2.
suche
displayData |= data >> (8-yOffset);
ersetze durch
displayData &= ~(0xFF >> (8-yOffset));
displayData |= data >> (8-yOffset);
 
Hallo Dirk,


Ich habe die stellen, die du hier gepostet hast nun ersetzt und siehe da.... alles so wie es sein soll!
besten dank !Dann ist das wohl ein Fehler oder Bug in der Lib...
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)