Willkommen in unserer Community

Werde Teil unserer Community und registriere dich jetzt kostenlos ...

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

C GLCD -> Logo anzeigen..

Dieses Thema im Forum "LED + LCD" wurde erstellt von Janiiix3, 17. Mai 2017.

  1. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    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 und 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 und 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 und 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:

    • lcd.c
      Dateigröße:
      3,7 KB
      Aufrufe:
      5
    #1 Janiiix3, 17. Mai 2017
    Zuletzt bearbeitet: 17. Mai 2017
  2. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    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 und 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:
     
  3. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    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:

    #3 Janiiix3, 17. Mai 2017
    Zuletzt bearbeitet: 17. Mai 2017
  4. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Ja ebenfalls ein ST7565R Controller, Display nur mit 32 Zeilen Höhe, also 4 Pages.

    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:

    Prinzipiell so ...
    Mit lcd_gotoxy(uint8_t y, uint8_t x) die entsprechende Position adressieren und dann mit


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

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

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Was genau sind die Pages? Wie groß ist eine Page ? 8x?
     
  6. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Eine Page ist eine Zeile mit einer Höhe von 8Bit.
    Das 128x32 Display hat 4 Pages, also 8Bit x 4 Pages = 32Bit = 32 Zeilen.
     
  7. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    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?
     
  8. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    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/
     
    #8 Dirk, 17. Mai 2017
    Zuletzt bearbeitet: 17. Mai 2017
  9. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    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?
     
  10. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    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.
     
  11. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Ich kann aber 128 Bit auf jeweils eine Page malen oder nicht ?

    Page 0 : 0-127
    ....
    Page 3 : 0-127
     
  12. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Ja, Breite sind 128 Pixel
     
  13. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Also muss ich nach 128 Bit auf die nächste Page wechseln, richtig?
     
  14. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Ja.

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


    CodeBox C und 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
           }
    
       }
    }
    
     
  15. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Danke @Dirk.
    Werde es morgen mal versuchen. Schönen Abend dir noch.
     
  16. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Ps.

    Warum sendest du zum Schluss noch mal "0x00" ?
     
  17. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Meinst du hier?


    CodeBox C und C++
    lcd_sendcmd(0x10); // Spalte 0
    lcd_sendcmd(0x00); // Spalte 0
    
     
  18. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    ja genau.
    Was bezweckt das 0x00?
     
  19. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    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 und 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 :)
     
  20. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    909
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    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?
     

Diese Seite empfehlen

  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)