C GLCD -> Logo anzeigen..

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
Halli Hallo,

Ich mal wieder..!
Irgendwie habe ich glaube ich noch ein Verständnisproblem.

Auf meinem GLCD, kann ich wunderbar Texte anzeigen lassen (Font erstellt von @Dirk erstellt.
Auch kann ich sagen wo der Text stehen soll (Der Font ist 8x6 HxB)..

Nur bekomme ich es nicht hin, mein Logo auf das GLCD zu schieben.
Das Logo ist soweit in einem 2D Array verpackt


CodeBox C
char Logo[32][16];


Aber wenn ich es versuche, mit zwei "for" Schleifen rüber zu schaufeln, wird nur murks angezeigt..

Hier ist irgendein Logo


CodeBox C
    char test [32][16] = {
   {0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xF8, 0x7C, 0x3C, 0x1E, 0x1E, 0x1F, 0x0F, 0x0F, 0x0F},
   {0x0F, 0x0F, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1E, 0x1E, 0x3E, 0x3C, 0x7C, 0xF8, 0xF0},
   {0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},
   {0xC0, 0xE0, 0xF0, 0xF8, 0x7C, 0x7C, 0x3E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07},
   {0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1E, 0x1E, 0x3E, 0x7C, 0x7C, 0xF8, 0xF0, 0xE0, 0xC0, 0x80},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0},
   {0xF8, 0x7C, 0x3C, 0x3E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x0F, 0x0F, 0x0F},
   {0x0F, 0x0F, 0x1F, 0x1E, 0x1E, 0x3C, 0x7C, 0xF8, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0xFC},
   {0xFE, 0xFF, 0xFF, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07},
   {0x7F, 0xFF, 0xFF, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF},
   {0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0xFF, 0xFF, 0xFF},
   {0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x01, 0x00},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0F, 0xFF, 0xFF, 0xFE, 0xFC, 0x1F, 0x3F},
   {0xFF, 0xFF, 0xF8, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xFF},
   {0xFF, 0x7F, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1F, 0x7F, 0xFF, 0xFF, 0xF8},
   {0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF8, 0xFF, 0xFF, 0x7F, 0x1F},
   {0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3F, 0x7F, 0xFF, 0xFF, 0xF0, 0xC0, 0x80, 0x00},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8, 0xFF, 0xFF, 0x3F, 0x1F, 0x00, 0x00, 0x00},
   {0x01, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x1E, 0x3C, 0x3C, 0x7C, 0x78, 0x78, 0x78, 0x78, 0x78, 0x70},
   {0x70, 0x78, 0x78, 0x78, 0x78, 0x78, 0x3C, 0x3C, 0x3E, 0x1E, 0x1F, 0x0F, 0x07, 0x07, 0x03, 0x01},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07},
   {0x0F, 0x1F, 0x1F, 0x3E, 0x3C, 0x3C, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x70, 0x70, 0x78, 0x78},
   {0x78, 0x78, 0x78, 0x3C, 0x3C, 0x3E, 0x1F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00},
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x0F, 0x1F, 0x1E},
   {0x3E, 0x3C, 0x3C, 0x78, 0x78, 0x78, 0x78, 0x78, 0x70, 0x70, 0x78, 0x78},
};


Und hier die Versuchung, dass Logo zu übertragen..


CodeBox C
       for (uint8_t y = 0 ; y < 32 ; y++)
       {
           for (uint8_t x = 0 ; x < 16 ; x++)
           {
               lcd_senddata(test[y][x]);
           }
           lcd_goto_(a++,y);
           _delay_ms(100);
       }


Vermutlich hat es irgendwas mit den Zeilen und Reihen zu tun... Quasie mein "lcd_goto_"
Die Library habe ich mal mit beigefügt.


Hat jemand einen Rat?
 

Anhänge

  • 3,7 KB Aufrufe: 5
Zuletzt bearbeitet:

Dirk

Administrator
Teammitglied
28 Jan 2007
4.299
146
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Hallo Janiiix,

so richtig kann ich dir wahrscheinlich nicht helfen.

Einige Hinweise habe ich, vielleicht helfen diese weiter.

Wahrscheinlich passt der Aufbau des Bilder nicht (schau dir das Array an, ich denke mal da fehlen auch ein paar Werte). :hmmmm:

Dein Code ...


CodeBox C
for (uint8_t y = 0 ; y < 32 ; y++)
{
    for (uint8_t x = 0 ; x < 16 ; x++)
    {
        lcd_senddata(test[y][x]);
    }
    lcd_goto_(a++,y);
    _delay_ms(100);
}

Bei
lcd_goto_(a++,y)
ist wahrscheinlich x und y vertauscht. Das "a++" verstehe ich nicht.

Ich vermute, du kannst bei deinem Display nur die Page adressieren. Du verwendest wahrscheinlich ein 128x32 Display. Das wären dann 4 Pages. Jede Page ist 1 Byte hoch. Mit deinem lcd_goto möchtest du das Bit adressieren?

In der angehängten lcd.c:
Das lcd_goto_(uint8_t y, uint8_t x) welches du verwendest ist mir nicht klar,
das void lcd_gotoxy(uint8_t y, uint8_t x) ist mir klar.

Da ich nicht weiß, wie das Bild aufgebaut ist, kann ich leider nicht direkt weiter helfen.

Dirk :ciao:
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
Da ich nicht weiß, wie das Bild aufgebaut ist, kann ich leider nicht direkt weiter helfen.
Was musst du denn da kennen? Das Bild habe ich in ein Tool gehauen und das hat mir daraus dann ein Array gemacht.
Dort musste ich die größe angeben in h Höhe und Breite.
Okay.. Er hat mir ein Eindimensionales Array erzeugt, habe daraus dann ein Zweidimensionales gemacht, dachte es wäre dann einfacher damit umzugehen.

Wie muss ich vorgehen, wenn ich eine gerade Linie nach unten zeichnen möchte?

Anbei mal ein Datenblatt vom Display.
 

Anhänge

Zuletzt bearbeitet:

Dirk

Administrator
Teammitglied
28 Jan 2007
4.299
146
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Anbei mal ein Datenblatt vom Display.
Ja ebenfalls ein ST7565R Controller, Display nur mit 32 Zeilen Höhe, also 4 Pages.

Was musst du denn da kennen? Das Bild habe ich in ein Tool gehauen und das hat mir daraus dann ein Array gemacht.
Dort musste ich die größe angeben in h Höhe und Breite.
Okay.. Er hat mir ein Eindimensionales Array erzeugt, habe daraus dann ein Zweidimensionales gemacht, dachte es wäre dann einfacher damit umzugehen.
Es gibt x Möglichkeiten, wie die Daten angeordnet sein können, nur eine passt. Du musst schauen, was dieses Tool erzeugt. Und du kannst nicht einfach das eindimensionale Array in ein zweidimensionales Array "umwandeln", wenn du nicht weißt, wie die Daten im eindimensionalen Array angeordnet sind. Neben den x Möglichkeiten hast du somit zusätzliche weitere n Möglichkeiten die Daten falsch zum Display zu senden. :confused:

Wie muss ich vorgehen, wenn ich eine gerade Linie nach unten zeichnen möchte?
Prinzipiell so ...
Mit lcd_gotoxy(uint8_t y, uint8_t x) die entsprechende Position adressieren und dann mit


CodeBox C
lcd_sendcmd(0x10);
lcd_sendcmd(0x00);
lcd_senddata(0xFF);

Daten senden (Pixel an). und das für 4 Pages y = 0..3
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
Was genau sind die Pages? Wie groß ist eine Page ? 8x?
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.299
146
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
Du hast zum Beispiel bei deinem Image.h was du öffentlich gemacht hast, ein Eindimensionales Array genommen mit x Einträgen.
Woher weiß ich, wann ich ein \n (Newline) ans Display senden muss? Wenn ich 16 x Bytes übertragen habe?
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.299
146
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Du hast zum Beispiel bei deinem Image.h was du öffentlich gemacht hast, ein Eindimensionales Array genommen mit x Einträgen.
Woher weiß ich, wann ich ein \n (Newline) ans Display senden muss? Wenn ich 16 x Bytes übertragen habe?
In meinem Beispiel Image Array stehen am Anfang zwei Werte (du hattest mich ja hier schon per Unterhaltung gefragt). Das sind Werte für Breite und Höhe. Die Ausgabe-Funktion weiß somit wie die Dimension des Bildes ist. Außerdem weiß die Ausgabe-Funktion, wie die Pixeldaten im Array angeordnet sind.

Also bei dir ist zunächt mal der Aufbau der Bilddaten im Array wichtig, ansonsten "... Heuhaufen".

Übrigens überträgt die Ausgabe-Funktion das Bild nicht zum Display, sondern in ein RAM Bereich im Mikrocontroller, der den Grafikspeicher des Displays nachbildet. Das ist vorteilhaft, da ich hier beliebig Pixel setzen kann ... zum Beispiel einen Text über zwei Pages und dies auch mit OR, EXOR, AND Verknüpfung mit den zuvor vorhandenen Grafikdaten.

EDIT:
Diesen Text kann ich zum Beispiel zeilenweise locaten, er muss nicht in einer Page liegen.
(Das Video war für ein Thema im Forum einmal eine Hilfestellung)

EDIT:
Das war ja ein Thema von dir :D
https://www.makerconnect.de/index.php?threads/lauftschrift-auf-einem-lcd-2-x-20.3819/
 
Zuletzt bearbeitet:

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
Ja okay.
Also vom Prinzip her ist es doch so in meinem Fall, das ich in Page "0" 128 Bit übertrage (quasie die erste Linie vom Bild) ist das erledigt, kommt Page 2...4, sehe ich das richtig ?

Das heißt, ein Bild müsste 512 Byte haben oder?
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.299
146
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Also vom Prinzip her ist es doch so in meinem Fall, das ich in Page "0" 128 Bit übertrage (quasie die erste Linie vom Bild) ist das erledigt, kommt Page 2...4, sehe ich das richtig ?
Nein, die Page hat eine Höhe von 8bit. Wenn du zum Beispiel in die erste Page bei Adresspointer = 0, ein 0xFF schreibst, dann erhältst du eine senkrechte Linie mit 8 Pixel Höhe.

Deshalb ist die Anordnung der Bilddaten im Array wichtig. Am besten sind die Daten so vorhanden, dass du nur Page setzen und Daten übertragen musst.

Nach der Page 0 kommt Page 1, 2, 3. Page 4 gibts bei deinem Display nicht.
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
Ich kann aber 128 Bit auf jeweils eine Page malen oder nicht ?

Page 0 : 0-127
....
Page 3 : 0-127
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.299
146
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
Also muss ich nach 128 Bit auf die nächste Page wechseln, richtig?
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.299
146
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Also muss ich nach 128 Bit auf die nächste Page wechseln, richtig?
Ja.

Diese Routine setzt alle Pixel des Displays (vielleicht wird dir jetzt einiges klarer)


CodeBox C
void lcd_fill(void)
{
   for (uint8_t page=0; page<4; page++)
   {
       lcd_sendcmd( page | 0xB0 ); // Page 0..3
       lcd_sendcmd(0x10); // Spalte 0
       lcd_sendcmd(0x00); // Spalte 0
       for (uint8_t col=0; col<128; col++)
       {
           lcd_senddata(0xFF); // senkrecht 8 Pixel an in der Page. Der Adresspointer erhöht sich automatisch
       }

   }
}
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
Danke @Dirk.
Werde es morgen mal versuchen. Schönen Abend dir noch.
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
Ps.

Warum sendest du zum Schluss noch mal "0x00" ?
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.299
146
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
ja genau.
Was bezweckt das 0x00?
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.299
146
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
ja genau.
Was bezweckt das 0x00?
Setzen der Spaltenadresse (Column) erfolgt durch zwei Kommandos.
Das eine für HighNibble, das andere für LowNibble
Bei Adresse 0 sind beide Nibble 0.



CodeBox C
lcd_sendcmd(0x10); // High Nibble
lcd_sendcmd(0x00); // Low Nibble


Siehe markierten Bereich ...
upload_2017-5-17_20-45-52.png

Ebenfalls noch einen schönen Abend :)
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.329
10
38
Hannover
Sprachen
ANSI C, C#
Moin Moin,

ich glaube ich weiß jetzt wo meine Probleme liegen.
Wenn ich das Bild durch einen Converter haue, baut er mir daraus ja ein char Array. Ich weiß jedoch nicht wie der Converter genau das Array damit befüllt (Das ist wahrscheinlich auch ein Problem mit..)

Habe mir gestern Abend noch mal schnell einen VRAM gebastelt test[4][128]
Wenn ich jetzt ...

{0b10000000,..}
{0b10000000,..}

Wenn ich jetzt das erste Byte raushole "lcd_sendcmd(test[0][x]" knallt er mir das ins RAM vom Display... So das wird jetzt aber nicht längs gezeichnet sondern nach unten weg... sprich senkrecht. Das kann schon ein Darstellungsproblem sein.


Wenn ich jetzt einzeln ein paar "Lines" nach unten gehen möchte, klappt das zwar auch "lcd_sendcmd(1<<6|x)" nur alles was danach kommt ist undefiniert, sprich Pixelschmutz.. Mache ich da was falsch?
 

Ü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)