C Zeichnen mit einem GLCD

Hatte sich mit Deinem Beitrag überschnitten...

Ums nochmal auf'n Punkt zu bringen:
Mit page adress set und column adress set legst Du das Ziel für die zu schreibenden/lesenden Daten im RAM des Displays fest.

Mit startline set legst Du die Zeile in diesem RAM fest, der beim abscannen der obersten Displayzeile zugeordnet werden soll.
Natürlich kannst Du damit Zeile1 in Zeile2 verschieben, aber wenn Du nr eine (dieselbe) Zeile im RAM beschreibst hast Du auch nur eine Zeile im Display - wo auch immer Du die hinschiebst.

Startline bezieht sich dabei nicht auf die Pages, sondern auf Pixel - Du kannst das Bild pixelweise hoch-/runter...rollen
 
Lieber Jan,

aus Deinen bisherigen Äußerungen kann ich nicht ersehen, ob Du den Aufbau des internen RAM des Videocontrollers überhaupt verstanden hast.

Nachdem @LotadaC die Vorgehensweise auch noch ausführlich erklärt hat, beschreibe uns doch mal mit Deinen Worten, was Du tun mußt um die zwei Punkte in der linken oberen (0,0) und unteren (0,63) Ecke zu setzen.


Wenn Du im Datenblatt den Abschnitt The Line Address Circuit gelesen hättest, wüßtest Du:
If the line addresses are changed dynamically using the display start line address set command, screen scrolling, page swapping, etc. can be performed.
 
Lieber Jan,

aus Deinen bisherigen Äußerungen kann ich nicht ersehen, ob Du den Aufbau des internen RAM des Videocontrollers überhaupt verstanden hast.

Nachdem @LotadaC die Vorgehensweise auch noch ausführlich erklärt hat, beschreibe uns doch mal mit Deinen Worten, was Du tun mußt um die zwei Punkte in der linken oberen (0,0) und unteren (0,63) Ecke zu setzen.


Wenn Du im Datenblatt den Abschnitt The Line Address Circuit gelesen hättest, wüßtest Du:
If the line addresses are changed dynamically using the display start line address set command, screen scrolling, page swapping, etc. can be performed.



CodeBox C
void glcdSetPageColumn(uint8_t pageAddr,
                      uint8_t column)
{
   glcdSendCmd(((pageAddr & 0x0F )| 0xB0));
   
   /*
   *   Baue das Kommando für die Zeile (High Byte)
   */
   glcdSendCmd((((column&0x0F)>>4))| 0x10);
   
   /*
   *   Adresse (Low Byte)
   */
   glcdSendCmd(column & 0x0F);
}


Pixel bei 0,0


CodeBox C
glcdSetPageColumn(0,0);
glcdSendCmd(0x01);
 
Hm, Beschreibungen scheinen Dir also nicht zu liegen.

Nun gut. Das setzten der Column- und Page-Adresse sieht soweit erstmal ganz gut aus (ich habe Deinen Code nicht probiert, aber Du wirst wissen, ob es funktioniert hat).

Du wirst aber keinen Punkt gesehen haben, weil Du die Daten als Kommando gesendet hast und nicht als Daten.
 
Oh, sehe gerade das mein anderer Text keinen Einzug in den Post genommen hat. Ja natürlich muss ich es mit Rohdaten beschrieben also das Pixel und nicht mit einem Kommando.

Es geht ja lediglich jetzt um die Position ob die richtig gesetzt wird.

Leider kann ich es nicht ausprobieren, da ich das Board gerade nicht zur Hand hab.

Was mir noch aufgefallen ist, bei meinem alten Code.. Wenn ich eine Linie senkrecht zeichnen wollte, wurden die Pixel davor immer wieder überschrieben.. senkrecht hat es geklappt... Muss morgen noch mal den alten Code raus suchen..
 
Um erkennen zu können, ob Du den RAM-Aufbau verstanden hast, mußt Du aber mindestens noch den Punkt in der linken unteren Ecke setzten… ;)

Und wenn Du das richtig machst, müßtest Du eigentlich auch verstehen, warum das überschrieben wird.

Setze doch mal spaßeshalber gleichzeitig einen Punkt in Spalte 0, Zeile 1 und Spalte 0, Zeile 3. Wie lauten die Kommandos dafür?
 
/* Pixel.: Zeile "1", Spalte 0" */


CodeBox C
cmd(01000001);
sendData(0x01);


/* Pixel.: Zeile "3", Spalte "0" */


CodeBox C
cmd(01000011);
sendData(0x01);

Sollte so hinhauen?
 
Sollte so hinhauen?
Nein. Beim ersten scrollst Du Zeile 1 des RAM in Zeile 0 des Display und siehst einen Punkt in der linken oberen Ecke.
Beim zweiten scrollst Du Zeile 3 des RAM in Zeile 0 des Display und sieht wieder einen Punkt in der linken oberen Ecke.

Um die beiden genannten Punkte zu setzen mußt Du Column Adress auf 0 setzten und Page Adress auch auf 0
und dann schickst Du ein Datenbyte 0x0A.
Und jetzt überleg Dir mal warum mit diesem Befehl zwei Punkte gleichzeitig in Zeile 1 und 3 gesetzt werden.
 
Das Display hat nur 8 Pages das ist doch richtig oder?
Wenn ich jetzt in die zweite Zeile von Page 0 schreiben will, setze ich erst Page 0 und dann Column auf 2 oder?
 
Das Display hat nur 8 Pages das ist doch richtig oder?
Der ST7565 unterstützt Displays mit bis zu acht Pages, das Display kann durchaus weniger Pages haben.
Genau genommen sind es sogar neun, aber Page8 steht nicht für Pixeldaten zur Verfügung.
Jede der acht (!) Pixel-Pages besitzt wiederum acht Bit (ergibt zusammen Deine 64 Pixel Auflösung).
...Wenn ich jetzt in die zweite Zeile von Page 0 schreiben will, setze ich erst Page 0 und dann Column auf 2 oder?
Die Column hat damit nichts zu tun - wie der Name sagt, ist das die Spalte...
Du willst in Page0 (in irgendeiner beliebigen Spalte) die zweite Zeile setzen, also setzt Du die Page-Adresse auf 0 und die Spaltenadresse auf "beliebig", und sendest.... *Trommelwirbel*... was (als Daten)?
 
Column 0-127

Zeile0
...
Zeile7

Möchte ich jetzt in der 7 Page schreiben, zweite Zeile, so wähle ich erst die Page dann die line und dann Column?
 
Nein,

Page auf 7 und ggf Column auf irgendwas ist klar, aber das mit der Position in der Page (die acht Bit) ist der Knoten, der bei Dir noch platzen muß...

Du hattest oben selbst mal Seite 27 des Datenblattes gepostet - deck mal die rechte Hälfte davon ab...
Du siehst die acht relevanten Pages (0..7), und weißt, wie die mit dem Page Adress Kommando und D3..D0 adressiert werden.
In Page0 steht da in den ersten fünf Columns ein "S". In der ersten Column (=0) sind drei Pixel gesetzt: 1, 2 und 5. Wie sind die zu übermitteln?
steht direkt darüber
 
Ah, will ich jetzt in der Page 0, sagen wir mal einen senkrechten Strich zeichnen, schicke ich einfach ein 0xFF, richtig?
 
Ihr seit doch doof :D
Aber irgendwie.. Wenn ich in Page 0 das 8 Pixel setzen möchte schicke Ich eine 0x80.. Das ist doch aber recht unflexibel? Besser wäre es doch wenn ich eine 0x01 schicke und halt die Rows einer Page damit beschreibe, versteht ihr?
 
doch zu früh gefreut?

Du beschreibst immer die ganze Page (also in einer bestimmten Spalte)...
Alle acht Bit.
(Byteweise Kommunikation)

genau deswegen kannst Du ja nicht einfach irgendwo einen Pixel setzen (oder löschen) - Du mußt immer an die restlichen sieben, die dieselbe Adresse haben denken...
 
Was @LotadaC sagt.

Zeile 0: 0x01
Zeile 1: 0x02
...
Zeile 6: 0x40
Zeile 7: 0x80

Man könnte sich besseres vorstellen, aber die Chips sind nun mal so gebaut.
 

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