Bascom LCD mit ST7920 (ähnlich HD44780) mit Bascom ansteuern

riesen

Mitglied
10. Sep. 2010
108
1
16
Hallo LCD-Freaks

Per Zufall stiess ich auf LCD's mit einem ST7920 Controller, welcher dem HD44780 sehr ähnlich sein soll. Das
Display bietet neben dem Text-Mode auch einen Grafikmode. Im Text-Mode werden die Zeichen sehr schön
in einer 8x16 Matrix dargestellt, auch mit Unterlängen.

Das Display kann von Bascom mit der LCD4.LIB angesteuert werden. Leider stimmen die Cursor-Positionen
nicht, so wollte ich selber eine eigene Ansteuerung in Bascom schreiben. Es klappt auch recht gut, nur
leider wird das Dislpay nicht immer sauber initialisiert. Es scheint ein Timing-Problem zu geben. Mit dem
Pollin-Display für EUR 2.95 klappt es fast zu 100%, mit dem andern Chinesen-Teil leider nicht.

Meine Dislpays:
http://www.pollin.de/shop/dt/NTAzOTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_DataVision_DG_14032.html
http://www.ebay.com/itm/ws/eBayISAPI.dll?ViewItem&item=261034188078&ssPageName=ADME:X:RTQ:US:1123

Unten mein Code als Download. Ein paar Bemerkungen:

Der Code ist noch in absoluter Rohform.

Funktion
--------
Die Routine LCD4_INIT enthält die Initialisierung des LCD's im 4Bit-Modus. Hier muss wahrscheinlich auch
irgendwo ein Fehler sein, sonst würden alle LCD's, wie mit der Bascom-LCD4.LIB, sauber nitialisiert.

Die Cursor-Steuerung ist speziell beim ST7920. Der Controller ist eigentlich in 16x16 Pixel Zeichen
organisiert. Das wird für die vielen integrierten chinesischen Zeichen auch benötigt. Usere westlichen
Zeichen werden im 8x16 Pixel-Format dargestellt. Es haben somit zwei Zeichen in einer DDRAM-Position
(Display-RAM) Platz. Beim Schreiben managed dies der Controller selber und schreibt automatisch zwei
Zeichen pro DDRAM-Position. Für die Anzeige kann der Cursor nur pro DDRAM-Position gesetzt werden.
Leider kann dann so nur jede zweite LCD-Anzeigeposition per DDRAM-Position angesteuert weden. Ich
habe das Problem so gelöst, dass ich für jede Zeile einen String definiert habe. So schreibt z.B der
Befehl LCDA 1, 2, "Test" mit dem MID-Befehl auf der Position 2 in den String ZL1. Anschliessend wird
immer die ganze Zeile ZL1 angezeigt, immer von Position 1 der Zeile aus.


Fragen
-------
Wieso wird das Display nicht immer sauber initialisiert? Wer hat hier eine korrekte Init-Routine?

Hat jemand auch schon Erfahrung, wie dann der erweiterte Befehlssatz angewendet wird, mit dem
Pixel gesetzt und somit Grafik dargestellt werden kann?

Vielen Dank schon mal an alle
Grüsse
Thomas
 

Anhänge

  • LCD_7920_declare.bas
    815 Bytes · Aufrufe: 422
  • LCD_myAVR_ST7220.bas
    3,4 KB · Aufrufe: 277
Hallo Thomas!

Das Display und den Controller kenne ich natürlich nicht, aber deine Ansteuerung sieht auf den ersten Blick ganz passend aus. :wink:
Vielleicht gibt es aber die Probleme, weil du alles einzeln vorbereitet und dann stückweise die Daten zum Display schickst.

Ich würde es an deiner Stelle mal mit einem entsprechend großen Byte-Array probieren.....
Also alle Daten die zum Display gesendet werden sollen werden der Reihe nach in dem Array abgelegt und dann "in einem Rutsch" zum Display geschickt.
Vielleicht erledigen sich deine Probleme. :hmmmm:
Außerdem wäre es später in der weiteren Verarbeitung einfacher.

Ach so....
Dein INIT sendet 03h, 03h, 03h, 02h und dann 0Ch, 01h, 06h

Ändere das INIT doch mal auf:
03h, 03h, 03h, 02h und dann 28h, 0Eh, 06h, 0Ch, 01h und noch die 80h
Natürlich alles mit RS = low !

Hast du denn ggf. ein richtiges Datenblatt vom Controller zur Hand?
Oder ein LA, um die Signale am Display auch mal kontrollieren zu können?


Grüße,
Cassio
 
Hallo Cassio!

Vielen Dank für deine Tipps. Den Fehler habe ich nun gefunden, und es war .... ein Hardwarefehler.
Der Unterschied zwischen dem Pollin-LCD und dem Chinesen-LCD war die Beschaltung des Pins PSB.
Dieser ist beim Pollin-Dislpay fix auf GND verdrahtet, das andere Display erwartet dort ein +5V VSS
Signal für den Betrieb im Parallel-Modus. Bei mir war der Pin nicht angeschlossen, das hat dann zum
"flatterhaften" Verhalten geführt. RST sollte man übrigens auch noch gleich auf +5V legen.

Nun klappt es also wunderbar, und ich kann mich an die weiteren Funktionen dieses interessanten
LCD-Controllers machen. Sobald ich mehr weiss, schreibe ich hier wieder mal ein paar Zeilen.

Viele Grüsse
Thomas
 
Hallo LCD-Fan's

Hier nun mal mein funktionierender Code für die Textanzeige. An der Grafikanzeige werde ich später mal
weitermachen.

Der Code ist recht einfach und universell gehalten, er könnte so auch für andere HD44780-ähnliche
LCD's angepasst weden, für welche Bascom keine korrekte Ansteuerung anbietet.

Die Lösung besteht aus drei Programmteilen:
- LCD_7920_declare.bas -> Definitionsdatei wird am Anfang des Programms mit $include eingefügt
- LCD_MyAVR_ST7920.bas -> Hauptprogramm mit Beispiel für Anzeige
- LCD_7920_sub.bas -> Sub-Funktionen, wird am Schluss des Programms mit $include eingefügt

Anhang anzeigen LCD_7920_declare.bas
Anhang anzeigen LCD_myAVR_ST7220.bas
Anhang anzeigen LCD_7920_sub.bas

Bei der neuen LCD-Befehlssyntax habe ich mich an die I2C-Routinen von Cassio angelehnt. Befehle:
- Lcda_init -> Initialisiert und löscht das LCD
- Lcda_cls -> Löscht das LCD
- Lcda y, x, "Text" oder String-Variable -> Anzeige von "Text" oder Sring auf Position y, x

- Lcd4_data (Wert) oder Byte-Variable -> Schreibt nativ den (Wert) als Daten in das LCD
- Lcd4_command (Wert) Byte-Variable -> Schreibt nativ den (Wert) als Kommando in das LCD

Den Code habe ich mit den zwei oben schon beschriebenen Displays getestet. Wie schon in einem
andern Beitrag erwähnt, leuchtet die Hintergrundbeleuchtung beim Pollin-Display erst ab ca. 5.7V.
Dazu habe ich mir recht günstig folgenden Booster bestellt:
http://www.ebay.ch/itm/130734500233?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
Diese gibt es auch einzeln, nicht nur im Zehnerpack, aber sowas braucht man(n) ja immer wieder.
Die Pollin-Displays sind zusammen mit dem Booster immer noch recht günstig.

Viel Spass und viele Grüsse
Thomas
 
Hi,

schön das alles soweit funktioniert ;)

Wie schon in einem
andern Beitrag erwähnt, leuchtet die Hintergrundbeleuchtung beim Pollin-Display erst ab ca. 5.7V.
Dazu habe ich mir recht günstig folgenden Booster bestellt:
http://www.ebay.ch/itm/130734500233?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
Diese gibt es auch einzeln, nicht nur im Zehnerpack, aber sowas braucht man(n) ja immer wieder.
Die Pollin-Displays sind zusammen mit dem Booster immer noch recht günstig.
Wau ... US $24,90 ... für nen LM2577 mit ner Drossel, nem Trimmer und ein paar Elkos ... stolzer Preis :rolleyes:

Der LM2577T-ADJ kostet bei Reichelt 4,45. Nen kleinerer hätte es aber wohl auch getan (zB MC34063 für 0,27eur im DIP8)
Also grob über den Daumen ... 10eur Bauteil-/Platinenwert.

1 US-Dollar = 0,793524837 Euro ... das macht dann knapp 20eur. Also 10 eur fürs zusammenlöten plus nochmal Porto/Verpackung.

Also 2-3 Stück wenn es mal brennt und man keine Lust hat selber zu brutzeln. Aber 10 Stk ? Aber wie heißt es so schön ... wer frei ist von Schuld der werfe den ersten Stein :rolleyes:

Solltest du dir aber mal überlegen für die Zukunft nen paar Bauteile für Schaltregler zu besorgen. Die Schottky-Dioden kann man auch anders verwenden, die Speicherdrosseln kosten nicht die Welt und Schaltwandler bis 1,5 oder 2A reichen normalerweise aus. Bei den Elkos für so kleine Wandler braucht man auch noch keine Klimmzüge machen (Schaltfest LowESR oder sowas). Elkos in der Größe hat man meißt sowieso rumfliegen und an den MultilayerKeramiks mit 100nF fehlt es meißtens auch nicht. Außerdem kann man die Schaltung dann von der Größe noch optimieren und an die eigenen Bedürfnisse anpassen.

EDIT: Jetzt hab ich soviel über den Wandler geschrieben und garnix dazu das du den Code am laufen hast und hier hochgeladen hast. Ups ... schäm :eek: ... Also besten Dank für deine hochgeladenen Programmzeilen :cool:

Gruß
Dino
 
Hallo Thomas!

Gratuliere, dass nun alles funktioniert. :D

Deinen Programmcode werde ich mir die Tage mal ansehen.
Ich denke aber, dass er mir zum größten Teil wohl bekannt vorkommen wird. :cool:

Wobei ich immer noch überlege, warum das Display (mit einem HD44780 komp. Controller) nicht auch direkt mit den BASCOM-Routinen funktioniert. :hmmmm:



(zB MC34063 für 0,27eur im DIP8)

Hi Dino!

Stimmt!
Gerade den MC34063A (für 27 Cent bei Pollin) finde ich absolut genial!
Er kann Step-Up, Step-Down sowie Inverting bzw. sogar Step-Up-Inverting..... und liefert bis zu 1,5A Strom.
Ein perfektes Bauteil für alle "Lebenslagen". :wink:
Aus dem Grunde habe ich meine ICL7660 und MAX619 schon lange an die Seite gepackt.


Grüße,
Cassio
 
Hallo Dino und Cassio

Danke für euer Feedback!

Da hast du was falsch verstanden Dino, das ist ja ein 10er Pack für etwas mehr als 20 Dollar. Unten
übrigens noch der Preis für das Einzelstück. Auch wenn ich kein Chinesen-Fan bin, muss ich doch
sagen, dass die Lieferungen hervorragend klappen und die Zollformalitäten viel einfacher sind, als
wenn ich aus Deutschland was kommen lasse.
http://www.ebay.ch/itm/New-LM2577-D...954?pt=LH_DefaultDomain_0&hash=item20c6c517ea
Für etwas mehr als 2 Euro krige ich eine fertige Lösung, sooo schlecht ist das jetzt auch nicht.
Die Ware kommt übrigens portofrei aus Hongkong !!!!!!

Die Schaltung mit dem MC34063 werde ich mir auch mal anschauen. Da ich Elektronik nur als
reines Hobby betreibe und das nie "studiert" habe, gehe ich hier gerne den pragmatischen Weg :).

@Cassio
Der Unterschied zum reinen HD44780 liegt meiner Meinung nach in der Ansteuerung der Cursor-
Positionen. Wenn du ein Display mit ST7920 und der Standard-Bascom Routine betreibst, wird
sicher was angezeigt, nur eben mit der Cursor-Adressierung haperts. Ausser der Syntax und der
Aufteilung in die drei Programmteile (declare, main, sub) habe ich nichts von dir übernommen.
Aber diese Displays würden sich natürlich auch eignen um über I2C anzusteuern.

Bei der Darstellung von Grafik habe ich noch Probleme, hier ist das ST7920-Datenblatt sehr
verwirrend. Ich muss dafür das Display in einen Erweiterten-Modus bringen. Wie dann aber die
Pixel geschrieben werden, ist mir nicht klar.

Anyway, die LCD's mit dem ST7920 bieten von der Lesbarkeit her eine sehr schöne Lösung, die
Unterlängen sehen doch gut aus :) ...

Gruss
Thomas
 
Hi Thomas,

Da hast du was falsch verstanden Dino, das ist ja ein 10er Pack für etwas mehr als 20 Dollar. Unten
übrigens noch der Preis für das Einzelstück.
OK ... ich sag nix mehr und behaupte das Gegenteil :p :rolleyes:

Für den Preis bekommt man hier noch nichtmal die Einzelteile ohne Platine. Das ist dann natürlich nen Schnapper :cool:

Hab ich wohl nicht genau genug hingesehen :eek:

Gruß
Dino
 
Für den Preis bekommt man hier noch nichtmal die Einzelteile ohne Platine.


Hallo zusammen!

Mal abgesehen davon das die Bestellung von Thomas schon OK ist..... wenn er das so benötigt.
Kann doch jeder machen wie er möchte.

Trotzdem möchte ich mal behaupten, dass ich für 1,6 Euro oder 2 Euro locker die Einzelteile für ein bis zwei StepUp-Wandler bekomme.
Natürlich ohne Platine.


Nun aber genug :offtopic:
Mal wieder zurück zu deinen Routinen.

Es war schon so, wie ich mir das gedacht hatte.....
Das Konzept entspricht meiner Vorgehensweise, wie ich das bei den I2C-Ansteuerungen gemacht habe.
Von daher konnte ich mich natürlich auch recht schnell reindenken. :cool:
So ein bis zwei Dinge hätte ich zwar anzumerken......
Wenn es aber so funktioniert, dann ist es doch OK!

Gratuliere also zur gelungen Arbeit! :ciao:
Den Grafikmods wirst du ja vielleicht auch noch hinbekommen.

Apropos Grafik....
Was bedeutet denn Grafikmodus bei dem Display?
Funktioniert das dann auch mit der 4-Bit Ansteuerung, oder musst du dafür dann den 8-Bit Mode nehmen...... wie bei allen GLCD`s?


Grüße,
Cassio
 
Hallo Cassio

Nur immer frei "angemerkt", ich lasse mir gerne Tipps geben... wie erwähnt, ist das mein Hobby und
ich werde auch da gerne besser.... :)

Die Grafik funktioniert auch im 4Bit-Mode, oder bei einigen ST7920 basierenden LCD's sogar mit SPI,
je nach dem, wie der Controller da implementiert wurde. Da gibt es sogar Videos...
http://www.youtube.com/watch?v=m_Rn253_z3o

Abendgrüsse
Thomas
 
Hallo Thomas!

Nein, nein, es geht nicht um Anmerkungen......

Nur mal eine Frage:
Code:
Sub Lcda_cls
   Lcd4_command 1
   Zl1 = "                    "
   Zl2 = "                    "
   Zl3 = "                    "
   Zl4 = "                    "
   Waitms 2
End Sub

Kannst du kein Kommando senden das ein CLS ausführt, anstatt alle Zeilen einzeln per String zu löschen?


Warum arbeitest du zur Zeichenermittlung mit MID() ?
Code:
      Mid(zl1 , X1 , Zz) = Text

Schau dazu doch noch mal in meine Beispiele zur I2C-Ansteuerung.


Grüße,
Cassio
 
Hasllo Cassio

Ja, der Code unterscheidet sich halt doch wesentlich von deinem. Wie erwähnt, kann ich den Cursor
auf dem LCD nur auf jede zweite Zeichenposition setzen, die Funktion ist somit unbrauchbar für
direkte Cursor-Positionierung. Es gibt keine Möglichkeit die Positionen 2, 4, 6, 8 ... direkt mit einem
Befehl anzusteuern.

Aus diesem Grund bilde ich mit Zl1 bis Zl4 so zu sagen den internen Speicher des LCD's nach. Ich
initialisieren die Zeilen mit Leerzeichen, damit der Platz reserviert ist, und mit dem MID-Befehl jede
Position beschrieben werden kann. Jeder LCDA-Befehl schreibt also nicht direkt auf das LCD, sondern
zuerst in die Zeilen Zl1 bis Zl4. Mit dem MID-Befehl wird die X-Position im String festgelegt, ab welcher
geschrieben wird. Anschliessend wird immer die ganze Zeile von Position 1 pro Zeile angezeigt, diese
Position 1 kann ich ja problemlos direkt ansteuern.

Viielleicht gibt es aber einen Befehl, mit welchem ich einen String mit 20 Leerzeichen füllen kann.


Gruss
Thomas
 
Hallo Dino

Diesmal aber shame on me... :) habe gesucht und nicht gefunden....

Danke!!!!

Gruss
Thomas
 
Ja, der Code unterscheidet sich halt doch wesentlich von deinem.

Hallo Thomas!

Ich hätte jetzt gesagt, er unterscheidet sich nur ein wenig in der Datenausgabe...... :wink:
ist aber auch egal.

Wenn du den Grafik-Mode zum Laufen bekommst, dann kannst du ja ggf. auch andere Fonts verwenden.
Dann hätte sich auch das Problem mit dem Cursor erledigt.


Hast du mal versucht das Display mit dem Kommando &H01 und dem anschließenden Parameter &H80 (oder andere erste Cursorposition) zu löschen?
Wäre ja schade, wenn das nicht funktioniert.
Wenigstens im Grafik-Modus müsste es die Funktion dann aber geben.


Grüße,
Cassio
 
Im Code steht (LCD_myAVR_st7920.bas):
Code:
Reset Portc.4
Waitms 100
Set Portc.4

Was ist den an Portc.4 dran? :hmmmm:
Ne Led zum blitzen?
Oder der Reset-Pin des Displays?

Leider kein Alias gesetzt
Ansonsten scheint mir erst mal alles klar zu sein
 
Hallo Jens2000

Ist schon eine Weile her, musste nachschauen. Bei mir ist da eine Test-LED dran, du kannst diese Zeilen löschen,
keine Funktion für die LCD-Ansteuerung.

Habe übrigens die Version auch mal angepasst für eine serielle Ansteuerung:
http://www.avr-praxis.de/forum/show...Controller-seriell-ansteuern&highlight=st7920

Die Grafik habe ich noch nicht realisiert, das ist komplexer, da keine einzelnen Pixel gesetzt werden können, es sind
immer nur 8 Pixel in einer Linie möglich. Somit müsste die Rechnerei im Prozessor/RAM erfolgen.

Gruss
Thomas
 
Das Thema ist zwar schon lange nicht mehr Aktuell, aber Cassio hat sich so viel Arbeit gemacht, das ich jetzt auch Fragen an Ihn stellen möchte.
Ich habe hier ein GLCD 129*64 mit ST7920. Habe versucht das mit Bascom und einem Arduino Uno mit AT328p zum laufen zu bringen. Leider ohne Erfolg.
Für die Arduino Software gibt es wohl eine LIB, für Bascom nicht. Bist Du noch mit Deinen LCD und GLCDs am probieren, oder kannst Du, oder auch andere Mitglieder hier helfen.
Wäre Schade, wenn die Displays wegen Unwissenheit in der Schublade bleiben würden.
Hinweis, ich bin noch BASCOM Anfänger, hab bisher nur Ahnung von der Ansteuerung normaler 16x2 und 20x4 Displays.

Freue mich auf Eure Hinweise, TIPs und Vorschläge

Vielen Dank im voraus....
 
Hallo Glühwurm1966 (wäre noch schön, wenn du einen Vornamen hättest)

Ja, da habe ich vor einiger Zeit die Lösung für den Grafikmodus gefunden. Steure den ST7920 sogar
Im Serial-Mode an (PSB=Low), Geschwindigkeit ist ganz ok, aber weniger Drahtverhau.

Im ST7920 kann man direkt keine einzelnen Pixel ansteuern, es müssen immer gleich 8 Pixel/Bit
(horizontal) an das LCD übergeben werden. Mein Programm bildet das Display im Memory
nach, belegt halt schon gut die hälfte des ATmega328 Memorys. Der Inhalt der Memorys wird
dann in einem Rutsch zum Display gesendet.

Viel Spass
Thomas
 

Anhänge

  • LCD_ST7920_Grafik.zip
    16,5 KB · Aufrufe: 152
Hallo Thomas,
Danke für die schnelle Antwort. Ich werde das mal am Abend ausprobieren.
Wie muss ich denn dann die Beschaltung mit dem Display machen ?
Ich benutze einen Arduino 328P.

Viele Grüße
Hans-Jürgen
 

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