Mini Farbdisplay ST7735

  • Hallo zusammen,

    auf der Suche nach einem kleinen Farbdisplay kam mir bei der bekannten Elektrobucht ein wirklich nettes LCD über den Weg:https://www.ebay.de/itm/1-44-Farb-…353.m2749.l2649

    Für unter 10 Euronen dachte ich mir, "da kannste nix falsch machen!". :P

    Leider war die versprochene CD mit Beispielcode nicht dabei, aber da ich sowieso keine Arduinoprogrammierung betreibe, habe ich den Code mittels Datenblatt und ein paar im Netz gefundener Konstanten selbst geschrieben. Wer für sein Projekt ein kleines feines Farbdisplay sucht, kann den natürlich gerne verwenden.Allerdings benötige ich für meinen Transceiver nur Textdarstellung, daher sind keine Grafikfunktionen (Rechtecke, Kreise etc.) enthalten. Dafür kann man die Textausgabe sowohl in X- als auch in Y-Richtung frei skalieren.

    Den C-Quellcode für einen ATMega328 habe ich als .txt-Datei angehängt, weil die "Code"-Funktion hier im Forum unschöne Ergebnisse produziert (zusätzliche Zeilenschaltungen am Ende jeder Zeile).

    Noch eine Anmerkung: Die Stromstärke beträgt mit eingeschalteter LED-Beleuchtung 38 mA. Das LCD ist für 3.3Vspezifiziert.
    vy 73 de Peter

  • Schönes Projekt,

    danke dafür.

    Auf die Schnelle einige Anmerkungen:

    Code
    #define BROWN        lcd_16bit_color(16, 16, 11);


    Das ";" ist zu viel.

    Da Du die Funktion lcd_16bit_color(r,g,b) nur mit Konstanten benutzt, würde ich sie anders implementieren.

    Als Macro, würde auch nur eine konstante Zahl herauskommen und kein Programmcode mehr aufgerufen werden müssen.

    Code
    // unsigned int lcd_16bit_color(int r, int g, int b)
    #define lcd_16bit_color(r, g, b) as (unsigned int)(((unsigned int)(r) << 11) + ((unsigned int)(g) << 5) + (unsigned int)(b))

    Für

    Code
    void lcd_putstring(int, int, char*, unsigned int, unsigned int, int, int);

    Kann man noch zum Speichern der Strings im Programmspeicher (Flash) eine weitere Funktion nutzen.

    Code
    void lcd_putstringPGM(int, int, const PROGMEM char *, unsigned int, unsigned int, int, int);

    https://www.nongnu.org/avr-libc/user-…__pgmspace.html

    Dann würde der String nicht automatisch aus dem Programmspeicher kopiert und einer (char *) zugewiesen werden müssen.

    73 de Uwe
    DC5PI

  • Hallo Uwe,
    Code ist korrigiert, ";" entfernt.

    Die Funktion benutze ich aber für Testzwecke nicht nur als Konstante. Ein Codeteil, den ich allerdings entfernt habe, hat, nachdem man einen der drei Pins PD0 bis PD2 auf GND zog, einen der Farbanteile rot, grün oder blau die Intensität geändert und die neue Farbe an einem ausgewählten Zeichen dargestellt. Auf diese Weise habe ich die Farbdaten ermitteln können, die dann als Konstanten benutzt wurden bzw. werden. Im nächsten Schritt werde ich dann die Farbwerte in eine Integerzahl überführen, aber das dauert noch. Im Moment arbeite ich nämlich noch an der Feinabstufung der Farben, da ist die Funktion recht praktisch.
    Edit: "PROGMEM" funktioniert bei meinem GNU C Compiler nicht unter Linux. Ich hatte das in alten Programmen, die unter WINAVR erstellt habe, benutzt, ein Compilieren schlug allerdings unter Linux fehl.

    73 de Peter

  • Hallo Peter,

    Danke für die Rückmeldung.

    Hast Du das notwendige Include eingefügt?

    Evtl. ist dein gcc schon "neuer" und die Libs nutzen das Schlüsselwort __flash anstatt.

    Siehe:
    https://gcc.gnu.org/onlinedocs/gcc…ess-Spaces.html

    Dann sollte

    Code
    #include <avr/pgmspace.h>


    helfen.

    Bei mir wird

    Zitat

    ~$ avr-gcc --version
    avr-gcc (GCC) 4.9.2
    Copyright (C) 2014 Free Software Foundation, Inc.


    angezeigt.

    73 de Uwe
    DC5PI

  • Hallo Uwe,
    ja, ich habe die gleiche Version vom avr-gcc wie Du und das Include-File ist auch im Code enthalten. Sehr eigenartig. Allerdings habe ich noch etwas Platz, bis der ATMgea328 an seine Grenzen kommt. Ich muss das Thema mal in einer ruhigen Minute eruieren, wo es denn da genau klemmt.
    Als nächstes steht erst einmal an, zu prüfen, wie dieses Mini-LCD sich im HF-Umfeld verhält. Oder genauer gesagt: Ob es mehr HF in die Schaltung entlässt als die OLEDs, die ich bis jetzt für die Minitransceiver benutzt habe.

    vy 73 de Peter

  • Ok Peter,

    ich habe mir gerade die 1,8" Variante bestellt.

    Und werde auch etwas damit spielen und in LunaAVR mit dem Graphics-Objekts Interface einsetzen.

    73 de Uwe
    DC5PI

  • Hi Uwe,

    dann mal viel Spaß mit dem Teil! Mir macht das immer Spaß neue Module zu entdecken und auszuprobieren. Und dieses LCD ist wirklich einfach zu programmieren, denn die Pixel ins LCD zu bekommen ist wesentlich einfacher als bei dem 12864 LCD, was ich davor in der Mache hatte.
    Problem bei diesem ST7735 war für mich indes, dass ich am Anfang einen sehr langsamen Bildschirmaufbau hatte, weil ich den Fehler gemacht hatte, jeden Pixel einzeln zu adressieren. Wenn man hingegen ein rechteckiges Fenster definiert und die Bytes da nacheinander seriell überträgt ohne die RAM-Adresse mit der Funktion set_pixel() für jden Punkt neu zu setzen, läuft das viel schneller (ungefähr Faktor 5 bis 10). In meinem neuen TRX-Projekt benutze ich als Controller eine ATMega644 mit 25 MHz Takt, da sollte man dann den Bildschirmaufbau nicht mehr sehen.

    LunaAVR


    So, den kannte ich noch nicht. Muss mal reinschauen, eventuell ist das was für mich...
    73 de Peter

  • Hallo Peter,

    Jürgen, DJ4JZ kann dir aus Sicht eines Anwenders viel Berichten.

    Ich bin als Mod. und Entwickler vielleicht etwas mehr ausgerichtet.

    73 de Uwe
    DC5PI

  • Hallo Peter,

    hast Du an einem Code weiter entwickelt?

    Und könntest Du ihn bitte hier wieder einstellen?

    PS. das 1.77 Zoll TFT 128x160 SPI mit ST7735 ist heute bei mir angekommen.

    73 de Uwe
    DC5PI

  • Hallo Uwe,

    hast Du an einem Code weiter entwickelt?

    Im Moment habe ich noch ein anderes Projekt "am Start" (ein Dual-DDS-VFO-LO-Board) so dass ich mit dem Farbdisplay nicht weiter gemacht habe. Es arbeitet ja soweit ganz gut und liegt daher erst einmal in der Wartepostion. Aber wenn Du magst, kannst den Code von mir gerne benutzen und auch gerne fortentwickeln.

    vy 73 de Peter