Lib für St7920

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Lib für St7920

      Hallo,
      ich versuche das 128x64 Display "geschmeidiger" zu machen. Allerdings fehlt mir der richtige Ansatz. Mit
      ' Config Graphlcd = Custom , Dataport = Portb , Controlport = Portd , Reset = 3 , Cd = 4 , Wr = 5 , Rs = 5 , Ce = 6 , Fs = 7 , Mode = 8'
      kann ich die meisten Anweisungen abfangen jedoch nicht Cursor,Blink,Display on... Dummerweise funktionieren die nur im "Text" Mode, in "Graph" Mode würden sie hässlich.
      Gibt es eine Möglichkeit auch diese zu ändern? In der lcdvfd.lib sind sie vertreten jedoch würde das ein anderes Config verlangen und dann fehlen die Grafik Anweisungen. ;(
    • Pluto25 schrieb:

      kann ich die meisten Anweisungen abfangen
      Was meinst du mit Abfangen?
      Etwa die Routinen wie LCD text, Locate xy, etc. auf eigene Labels umbiegen (mit LCDData, LCDCmd)?


      Pluto25 schrieb:

      Dummerweise funktionieren die nur im "Text" Mode, in "Graph" Mode würden sie hässlich.
      Für Grafik-Routinen kann man die Anweisungen GLCDData, GLCDCmd verwenden, um die Routinen umzubiegen

      .

      Pluto25 schrieb:

      Gibt es eine Möglichkeit auch diese zu ändern? I
      Du kannst eine bestehende Lib nehmen, die die Grafok-Befehle enthält.

      Mit einer eigenen Lib, die zu vor der "Std-Lib" einbindest, kannst du nun die gewünschen Routinen durch eigene ersetzen. Die, welche nicht in deiner Lib gefunden werden, werden dann von der danach eingebundenen bereitgestellt. (Ersetzen von Routinen).
    • Mitch64 schrieb:

      mit LCDData, LCDCmd
      die auch. Das Locate wird etwas knifflig da es nur 16 bit Sprünge zulässt. Somit wird ein Locate 1,3 zu Locate 1,1 gefolgt vom read um den Pointer auf die 3. Byte Stelle zu setzen.
      Bei einem Home oder 'Cursor on' muß es auf den Text Mode umgeschaltet werden um diese Auszuführen und ggf wieder zurück damit der nächste Befehl richtig ausgeführt wird bzw das Display das gewünschte an zeigt.

      Mitch64 schrieb:

      welche nicht in deiner Lib gefunden werden
      Mein Problem ist anders rum z.B. Cursoroff lässt sich nicht ersetzen: Error 60 (Duplicate label)
    • Vor Jahren habe ich mal mit diesen ST7920 Display's experimentiert.
      Es hat 2 Modis, einen Textmode und einen Grafik-Mode. Die Umschaltung erfolgt über ein Command.

      Locate funktioniert nur im Textmode, ebenso wie Cursor on/off. Es gibt aber noch den GLocate.
      Und nur in diesem Mode können die internen Fonts verwendet werden. Ein Zeichen hat dabei 16 Pixel breite, wenn ich mich recht erinnere.
      Und deswegen habe ich den Textmodus damals schon schnell als recht unbrauchbar empfunden.

      Deswegen hatte ich mich damals auf den Grafik-Mode konzentriert. Der Grafik-Speicher ist hierbei aber in Words zu 16 Bit organisiert.
      Um ein Pixel zu ändern, muss die Word-Adresse im Display anhand der Koordinaten ermittelt werden. Dann das Word lesen und darin das Pixel ändern.
      Danach wieder im Display die Word-Adresse setzen und das manipulierte Word in den GRAM schreiben.

      Diese Lib's für Grafik-Displays, die bei Bascom dabei sind, gehen immer von Bytes aus, die gelesen oder beschrieben werden. Word-Werte gehen da nicht.

      Deswegen kann man nur die Basic-Aufrufe umleiten und diese manipulieren und dann selber das Display beschreiben.
      Das hatte damals auch für einfachere Befehle wie Home oder Cls funktioniert, bei komplexeren Dingen nicht mehr.

      Ich hatte damals das Display verworfen. Es gibt einfachere, die von Bascom unterstützt werden und gleiche Auflösung bieten.

      Um hier wirklich für das ST7920 was gescheites zu haben, müsste man einige Routinen selber programmieren. Nur so ist es dann auch möglich, Text-Zeichen im Grafikmode an beliebige Pixel-Positionen zu setzen. Das geht nämlich bei keinem der Bascom Grafik-Lib-Routinen. Immer nur Zeichenweise Positionierung ist da möglich.

      Das ärgert einen dann, wenn man eine Box zeichnet und darin mittig z.B. den Text "OK" positionieren will. Also quasi sowas wie einen Button darstellen will.

      Würde ich dies heute machen, würde ich eine Routine schreiben, das an x,y ein Pixel setzen oder löschen kann. Darauf aufbauend Routinen schreiben, die diese Routine nutzen. Also etwa ein Zeichen schreiben. Diese verwendet dann einen nachgeladenen Font und zeichnet die Pixel.
      Um einen String auszugeben, wird einfach die Zeichenausgabe für jedes Zeichen 1x aufgerufen. Dafür kann man ja auch eine Routine schreiben.
    • Mitch64 schrieb:

      schon schnell als recht unbrauchbar empfunden
      Ja das ist schon irgendwie greusslich.
      Nun gibt es noch keine reale Anwendung (evt als T6393 Ersatz) Daher dachte ich an eine universal lib die die 4x16 genauso unterstützt als auch den Grafik Bereich.
      Ein "Mischmasch" aus beidem könnte auch recht nützlich sein. Ähnlich wie bei vielen Geräten: Zeichen in der Mitte und Piktogramme am Rand.
      Hattest Du dich auch mit den definierbaren Zeichen beschäftigt? Sind das immer 16 Word oder können auch 16Byte (Ein Zeichen) genutzt werden?


      Mitch64 schrieb:

      darin mittig z.B. den Text "OK" positionieren
      Ganz pragmatisch Ok in Text und dann eine Box darum :D
      Um das ganze Pixelgenau zu platzieren muß ein Offset beachtet werden. Dieses "Grauen" steht mir noch bevor. =O

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()

    • Pluto25 schrieb:

      Ja das ist schon irgendwie greusslich.
      Genau. Es ist eine ziemliche Bitfummelei.

      Pluto25 schrieb:

      Hattest Du dich auch mit den definierbaren Zeichen beschäftigt?
      Nein. Ich hätte erst mal die Bascom-Funktion versucht, aber die wird vermutlich nicht gehen, weil der interne Font 16 Bit breite hat.

      Pluto25 schrieb:

      Ganz pragmatisch Ok in Text und dann eine Box darum
      In manchen Fällen mag das funktionieren. Windows macht es auch anders. Zuerst eine gefüllte Box mit Rahmen zeichnen, also den Untergrund vorbereiten, und dann den Text rein. Weil wenn du eine Grafik als Hintergrund hast und da ein Button drauf soll, kannste nicht erst den Text und dann die Box drumrum machen.

      Beim Text muss man auch 2 Modis vorsehen. Ein normaler Mode mit Hintergrund und der Andere Mode transparent. Also nur die Pixel im Display setzen, die im Font auch gesetzt sind.

      Da das Display einen Text- und einen Grafik-Mode besitzt, und man den Text auch im Grafikmode anzeigen kann, also gemischte Anzeige, funktionieren die Bascom-Befehle nicht mehr recht. Weil man will ja mal den Text im Textmode und mal im Grafikmode ausgeben. Da gibt es einiges, was man erst mal durchdenken sollte.

      Am Besten man schreibt die eigenen Routinen.
      Ich könnte mir die Befehle z.B. mit Prefix "LCD_" vorstellen. Und danach folgt der Befehlsname.
      Etwa LCD_CLS oder LCD_Locate oder LCD_SetPixel.

      Geschickt wäre, wenn man noch einen LCD_SetMode (TEXT|GRAPHIC) hat, um den Mode umzuschalten.
      Will man z.B. den Grafik-Speicher löschen, muss man zuerst mit SetMode in den Grafik-Mode schalten, wenn der gerade nicht aktiv ist und dann mit LCD_Cls den Grafik-Schirm löschen.
      Auf diese weise funktionieren die gleichnamigen Befehle für Text und Grafik-Mode gleichermaßen.
    • Mitch64 schrieb:

      Ich könnte mir die Befehle z.B. mit Prefix "LCD_" vorstellen
      Soweit möglich wollte ich diese vermeiden damit sich das möglichst 'Bascomartig' verwenden lässt.
      Das CLS ist geschmeidig. Alleine aufgerufen führt es ein Cls Text und ein Cls Graph aus die sich eben auch einzeln wählen lassen. Bei dem Cls 3,4,5 bin ich mir noch nicht klar ob es unterstützt werden soll?
      Leider gilt das nicht für Home , Cursor. Mangels besserer Idee wird das erstmal Gosub Cursoron/off
      Gosub (No)blink. Wird ein Displayoff jemals benutzt? Ich hatte bisher immer nur ein Display on in der Init.

      Mitch64 schrieb:

      SetMode in den Grafik-Mode schalten
      Und unbedingt ein Locate hinterher. Sonst schreibt er im vorherigem Mode weiter X( .
      Der Text bleibt immer sichtbar das Garph kann abgeschaltet werden. Falls kein Mischmasch gewollt ist wäre ein Cls (cmd 1) angebracht bevor der Graph zugeschaltet wird. Um den zu löschen gibts wohl keinen Einzelbefehl. Also zu Fuß. Das humpelt noch ein weinig (72µs) ^^


      Mitch64 schrieb:

      wenn du eine Grafik als Hintergrund hast und da ein Button drauf soll
      Dann wird die eben entsprechend designt :P bzw enthält den Text/Pictogramm schon. Einen Touch hatte ich bisher nicht aufm Schirm.
      Die Adressierung geht weit über den Sichtbereich hinaus. Im Textmode hilft das gar nicht weil er die "zweite Seite" mit füllt ;( Auch das horizontal scrollen des Graph verursacht recht seltsame Erscheinungen (entweder nur zwei Zeilen oder ein Teil scrollt schneller als der Rest) =O
      Die haben wohl einen Grund das im Datenblatt nicht zu erwähnen ^^
      Vertikal hab ich noch nicht versucht. Ist dort eine zweite Seite nutzbar?
    • Pluto25 schrieb:

      Dann wird die eben entsprechend designt bzw enthält den Text/Pictogramm schon.
      Ja das geht, hat aber einen Nachteil, wie ich mal feststellen musste.
      Wenn du 30 Buttons hast dann musst du 30 Grafiken erzeugen, die du dann in dein Code mit einbinden musst.
      Da geht ganz schnell mal der Flash aus.

      Wenn du das zeichnen lässt, hast du eine Routine, den den Button in gewünschter Größe hinmalt und dann nich eine andere Toutine, die den Text da reinzeichnet.
      Dann brauchst du nur den Text für die Buttons speichern.

      Pluto25 schrieb:

      'Bascomartig' verwenden lässt.
      Das CLS ist geschmeidig. Alleine aufgerufen führt es ein Cls Text und ein Cls Graph aus die sich eben auch einzeln wählen lassen. Bei dem Cls 3,4,5 bin ich mir noch nicht klar ob es unterstützt werden soll?
      Leider gilt das nicht für Home , Cursor. Mangels besserer Idee wird das erstmal Gosub Cursoron/off
      Gosub (No)blink. Wird ein Displayoff jemals benutzt? Ich hatte bisher immer nur ein Display on in der Init.
      Genau deswegen meinte ich, die Bascom-Befehle eben nicht zu verwenden.

      Pluto25 schrieb:

      Und unbedingt ein Locate hinterher. Sonst schreibt er im vorherigem Mode weiter .
      Der Text bleibt immer sichtbar das Garph kann abgeschaltet werden.
      Locate heißt ja im Grunde nichts anderes als die Grafic-RAM Adresse zu setzen. Und wenn du Ausgaben über SetPixel erledigst, macht die ja die Arbeit.
      Und Text wird eigentlich als Grafik ausgegeben. Und damit an jede Pixelposition setzbar.
    • Mitch64 schrieb:

      Und Text wird eigentlich als Grafik ausgegeben
      Das wäre einfach, dann bleibt der Text screen leer. Jedoch auch viel mehr Arbeit für den Avr. Da es die Möglichkeit hat würde ich sie auch gerne verwenden. Z.B als reines 16x4 für z.B. einen Tiny 13
      Nun ist Set Pixel auch die schlechteste Möglichkeit ein Graph zu beschreiben und kommt nur zum Einsatz wenn es nicht mehr anders geht (Diagonale oder Kreise)

      Mitch64 schrieb:

      30 Buttons
      auf 128x64 a_57_04ef5ee8

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()

    • Pluto25 schrieb:

      Nun ist Set Pixel auch die schlechteste Möglichkeit ein Graph zu beschreiben
      Es vereinfacht die weiteren Routinen wie ein einzelnes Zeichen aus einem Font an Pos x,y (Pixelposition) zu zeichnen.

      Wenn dann Textausgabe erst mal geht, kann man sich immer noch überlegen, ob man die Zeichenausgabe "direkter" macht, ohne SetPixel. Aber das wird gleich eine Ecke komplizierter. Da du ja sowieso in ASM programmieren willst, wirst du das bald feststellen.

      Pluto25 schrieb:

      auf 128x64
      Ja. Aber es waren immer nur 4 Buttons gleichzeitig sichtbar. Teilweise auch nur 2 oder 3.
      Das hing vom Zustand ab, was bedient werden kann.
    • Mitch64 schrieb:

      Da du ja sowieso in ASM programmieren willst
      Nicht zwingend aber eine lib mit 1000 *Basic sieht seltsam aus ;)
      Ich hab die 2.Seite gefunden a_64_3a718cae sie liegt nicht daneben z.B wie bei den 16x2 LCDs sondern drunter in Text als auch in Graph. Das schöne daran ist das sie mit nur einem Befehl komplett (oder auch teilweise) aufgerufen werden kann ohne sie Pixel/Zeichenweise srollen zu müssen (wie die LCDs)
    • Ich sammle noch die Befehle für eine lib.
      Nun taucht ein neue Problem auf: Showpice mag das label nicht? Error 0(?) [Label not found [EBILD]]

      Quellcode

      1. Showpic 10 , 20 , Btime 'geht
      2. Showpice 15 , 25 , Ebild 'verursacht Fehlermeldung
      3. Restore Btime 'geht
      4. Restore Ebild 'verweist auf Flashadresse mit 06 01 ???
      5. Btime:
      6. $bgf "smile48a.bgf" '
      7. Ebild:
      8. $eeprom
      9. 'Ebild: hier das gleiche Ergebniss
      10. Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
      11. Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
      12. $bgf "time.bgf"
      13. $data
      Alles anzeigen
      Gibt es eine bessere Methode die Position in EEprom an zu geben? ( Dim Dummy as Eram geht nicht)
      Ein fehlendes Label ist Error 61? Deutet die 0 auf was anders hin?

      Ich suche noch eine Anweisung für den vertikalen Sichtbereich (Page 1/2 oder HScroll 0...64?) Jemand einen besseren Vorschlag?
    • Pluto25 schrieb:

      Nun taucht ein neue Problem auf: Showpice mag das label nicht? Error 0(?) [Label not found [EBILD]]
      Lt. Hilfe müssen die Koordinaten für x und y Vielfache von 8 sein.
      Das passt aber für x nicht mit dem Display zusammen.

      Da wirst du eine eigene Routine zum Anzeigen basteln müssen.

      Pluto25 schrieb:

      Gibt es eine bessere Methode die Position in EEprom an zu geben?
      Es gibt 3 Möglichkeiten die Adresse zu bekommen.

      1. Loadlabel
      2. Restore Labelname, die Adresse steht dann in r9:r8
      3. Mit Sub und Parameter "byLabel"
    • Mitch64 schrieb:

      Vielfache von 8 sein
      Das wäre ja zu einfach ;) Das Showpic akzeptiert ja krumme Positionsdaten nur das Showpice stellt sich quer. Showpice 16 , 24 , Ebild geht aber auch nicht ;(
      Das Showpic hat sogar ein EEprom flag das aber leider nicht über den Labelnamen gesetzt wird und somit wird es (mit Eeprom-Label) zu einer Adresse Inhalt(0601) gelenkt wo natürlich keine Bilddaten, leider auch nicht die Eeprom adresse liegt.

      Mitch64 schrieb:

      die Adresse zu bekommen
      Andersrum: Wie kann ich die EEprom adresse eines Labels bestimmen (Ohne vorher Data 0,0,0...)
      Das Showpice hat ja das Label im Aufruf und sollte somit auch die Adresse kennen - wenns denn mal läuft.
      Beim Showpic klappt das gut (solange es kein EEprom Label bekommt) :D

      PS Das Locate ist ausschließlich für Text. Es gibt ja gar kein Graphlocate :thumbsup:
      Dummerweise ist es auch intern nicht dazu nutzbar da es mit 8x16(halbe) adressiert während die Grafikadressierung aus 4 Viertelbilder besteht (8+offset(0-15)*2 x 32*4 )

      PPS Ein Hscorll ergibt Zeilenchaos . Daraus wird wohl ein G(?)LcdPage 0/1
      Oder legt jemand Wert auf die Möglichkeit Zeilen 1,5,2,6?
    • Mitch64 schrieb:

      Welche Befehle hast du den bisher für deine Lib gesammelt?

      Quellcode

      1. 'Lcdcmd 15 '_lcd_control R24
      2. 'Glcdcmd 14 '_gwrite_cmd R24
      3. 'Lcddata 5 '_write_lcdchar R24
      4. 'Locate 1 , 2 '_glocate R20=2 R21=1
      5. 'Cls '_clear_Graph, und Text
      6. 'Cls Text '_clear_text
      7. 'Cls Graph '_clear_Graph
      8. 'Cls 5 , 7 , 9 , 33 '_cls_line R20=7(y) R21=5(x1) R22=9(x2) R24=33(char?)
      9. 'Pset 3 , 4 , 1 '_gpixel X=R20 , Y=R21 , R25 is on/off
      10. 'Box(2,3)-(10,20),1 '1,20,10,3,2 im Frame, Pointer muß zurück
      11. 'Boxfill(5,6)-(8,18) 1 '=Box
      12. 'Circle(3 , 2) , 4 , 1 '4,3,2,1 im Frame, Pointer muß zurück
      13. 'Showpic 10,20,Ebild,37 'R24=37 'z={Btime}(Eram{0601}) 10,20,0 im Frame, Pointer muß zurück
      14. dazu (Bascomähnlich)
      15. 'Cursoron,Cursoroff
      16. 'Blink,Noblink
      17. 'Displayon,Displayoff
      18. 'Page 0/1 (64-127)?
      Alles anzeigen
      Showpice stellt sich noch quer und dem
      Lcdat fehlen noch die Koordinaten (__LCDCOL/ROW)
      Fehlen da noch welche ? Vorschläge ?

      geht das eleganter/einfacher? Ohne es zweimal laden/'anden' zu müssen?
      (Die Position X (R20) wird vermutlich später noch benötigt.)

      Quellcode

      1. mov R22,R20 'Cx=R22 Cy=R23
      2. andi R22 ,15
      3. sts {gxoffs},r22 'offset
      4. mov R22,R20
      5. Swap R22 'Cx = x / 16
      6. andi R22 ,15
    • Mit
      var = LoadLabel(labelname)
      kannst du die Adresse im EEProm von Labels ermitteln.
      Diese muss dann in das EE-Adress-Register (EEARL, EEARH) geschrieben werden, um darauf zuzugreifen.
      Das Incr und Decr der Adresse musst du dabei von Hand machen.


      Pluto25 schrieb:

      geht das eleganter/einfacher?
      was verstehst du unter einfacher?
      Lesbarer, kürzer oder schneller?
    • Mitch64 schrieb:

      Mit
      var = LoadLabel(labelname)
      kannst du die Adresse im EEProm von Labels ermitteln.
      Leider nicht. Da kommt 0E 5A {00 00} raus, im Eeprom beginnt es bei $30
      Restore ergibt 0E 60 {06 01}

      Lesbarer, kürzer und schneller :D
      Ein Möglichkeit:

      Quellcode

      1. ldi R22,16
      2. mul r20,r22
      3. Swap R0
      4. sts {gxoffs},r0
      5. mov R22,R1
      Lesbarer :/ , kürzer (Eine Zeile :) ) doch nicht schneller :|

      Das Lcdat gibt nur Ascci aus ;( und lässt sich leider nicht so einfach (gar nicht ?) abfangen um einen Text mittels Font aus zu geben. Gibt es dafür keinen Bascom Befehl? Es legt eine 'Fonttable' an da sollte die doch irgendwo benötigt werden?

      PS Kennst Du noch seine Vo? Das hier ist eher blass und reagiert da gar nicht drauf (0-3,2V)
    • Pluto25 schrieb:

      Leider nicht. Da kommt 0E 5A {00 00} raus, im Eeprom beginnt es bei $30
      Restore ergibt 0E 60 {06 01}
      Doch, es funktioniert mit LoadLabel. Es kommen genau die richtigen Adressen raus.
      Restore funktioniert nicht.
      Und man kann auch nicht mit Read lesen. Sondern muss die Adresse von LoadLabel in das EEAR-Register eintragen und von Hand lesen.
      Oder alternativ eben ReadEEProm verwenden.

      Die EEProm-Adresse beginnt bei 0 und hat nichts mit dem Flash oder SRam zu tun.

      Zeig doch mal deinen Code, wie du das EEProm auslesen wolltest?

      Pluto25 schrieb:

      Das Lcdat gibt nur Ascci aus und lässt sich leider nicht so einfach (gar nicht ?) abfangen um einen Text mittels Font aus zu geben.
      LCDat verwendet Fonts (siehe Hilfe LCDAT). Aber der Font sollte im Flash gespeichert sein und nicht im EEProm.
      Wenn du solche speziellen Sachen machen willst, wirst du um eigene Routinen nicht drum herum kommen.
      Zum Abfangen sollte $LCDPUTDATA und $LCDPUTCTRL funktionieren. Habe ich nicht ausprobiert mit Grafik-LCD.



      Pluto25 schrieb:

      Kennst Du noch seine Vo? Das hier ist eher blass und reagiert da gar nicht drauf (0-3,2V)
      Du verwendest 3,2V?
      OK. In den Anschluss-Beispielen, die ich hier habe, wird v0 nicht beschaltet. Weder bei 3,3 Volt, noch bei 5 V Betrieb,
      Auch Vout bleibt unbeschaltet.