C Zeichnen mit einem GLCD

Dafür reicht es aus, nur die Pageadresse zu setzen, und die Columnadresse (zB auf 0), und anschließend kannst Du (mit write Data) hintereinanderweg die 128 Datenbytes für alle Columns dieser Page senden, also mit 128 Bytes 1024 Pixel setzen.
Die Column-Adresse inkrementiert automatisch.
(beim lesen kann sogar eingestellt werden, daß da nicht automatisch inkrementiert wird, was read-modify-write vereinfacht...)
 
Sorry, habe glaube immer noch ein Brett vor dem Kopf.

Wozu gibt es jetzt genau "Display Start Line Set"?
 
Damit kannst Du festlegen, ab welcher (Pixel-)Linie das Display den RAM abscannt. Damit kannst Du den gesamten Bildinhalt hoch- und runterschieben (oder besser... durchrollen).
Was auf einer Seite rausgeschoben wird, erscheint auf der anderen quasi wieder. Dazu müssen die entsprechenden Zeilen natürlich auch angeschlossen sein.
Wenn nur ein Display mit 32 Zeilen (4 Pages) durch den ST7565 angesteuert wird, kann man zB auch ein zweites "Bild" in den nicht genutzten Bereich laden, und mit dem Kommando zwischen beiden Bildern umschalten.
 
Kann ich mir das also so vorstellen, als würde ich mit der Maus durch eine lange liste scrollen..? Wenn ja habe ich es endlich verstanden. Das ist ja mal eine nützliche Funktion wenn man Menüs oder animationen darstellen möchte.
 
Wieso kann ich nicht beide Linien gleichzeitig darstellen?


CodeBox C
[I]uint8_t[/I] high = 7;
while(high >=0)
{
glcdSetPageColumn(0,high--);
glcd_senddata(0xFF); 

}

[I]uint8_t[/I] width = 127;
while (width>=0)
{
glcdSetPageColumn(width--,4);
glcd_senddata(0x01);  

}
 
Bin doch ein bisschen weiter gekommen..
Irgendwie habe ich es nicht so mit dem Zeichnen. Sehe ich das richtig, das dass ein riesen Aufwand ist, das Rechteck zu zeichnen?


CodeBox C
void glcdDrawRect(uint8_t x, uint8_t y, uint8_t x1)
{
uint8_t w = 0;
uint8_t h = 0;

glcdSetPageColumn(x,y);
while(w++<20)glcd_senddata(0x01);
w=0;

glcdSetPageColumn(x1,y);
while(w++<20)glcd_senddata(0x01);
w=0; 
}
 
Wenn Du den zweiten Schritt vor dem ersten machst, fliegst Du auf die Klappe. Logisch, oder?



CodeBox C
glcdSetPageColumn(width--,4);
Da Du width auf 127 gesetzt hast, versuchst Du Page 127 zu adressieren. Die gibt es nicht...
 
Ich kann jetzt Rechtecke zeichnen, nur bezogen auf den Pages.. Das ist doch doof.. Was ist wenn Ich ein Rechteck innerhalb einer Page zeichnen möchte das klappt nicht oder?



CodeBox C
void glcdDrawRect([I]uint8_t[/I] x1,[I]uint8_t[/I] y1,[I]uint8_t[/I] w,[I]uint8_t[/I] h)

{
[I]uint8_t[/I] cnt,bot = 0;

for ( ; cnt < (w+1) ; cnt++)
{
glcdSetPageColumn(x1,y1+cnt);
glcdSendData(0x80);
}

for (cnt = 0 ; cnt<w; cnt++)
{
glcdSetPageColumn(x1-h,y1+cnt);
glcdSendData(0x01);  

}

for (bot = x1-h; (bot-1) < x1 ; bot++)
{
glcdSetPageColumn(bot,y1);
glcdSendData(0xff);  

}

for (bot = x1-h ; (bot-1) < x1 ; bot++)
{
glcdSetPageColumn(bot,y1+w);
glcdSendData(0xff);
}

}


Bestimmt ist die Funktion viel zu kompliziert oder?
 
Zuletzt bearbeitet:
Was ist wenn Ich ein Rechteck innerhalb einer Page zeichnen möchte das klappt nicht oder?
Bei mir funktioniert das. ;)
Das ist aber schon mindestens Schritt drei.

Schritt zwei wäre, eine Linie zeichnen zu können.

Und Schritt eins, jeden beliebigen Pixel des Displays adressieren und setzten und löschen zu können...
 
  • Like
Reaktionen: TommyB
Also wenn ich alles richtig verstanden habe, kann ich Columns nicht direkt Adressieren sondern muss das über die Daten Bytes machen.

Wie Adressiere ich am klügsten jeden Pixel?
 
Andersrum. die Columns bzw. die x-Richtung wird direkt von 0 bis 127 adressiert.

Die Rows werden über y-Wert / 8 = Page und y mod 8 = Bitposition adressiert.
 
Ungefähr so..?


CodeBox C
void glcdSetPixel([I]uint8_t[/I] x, [I]uint8_t[/I] y, [I]uint8_t[/I] pix)

{
glcdSetPageColumn(x/8,y%8);
glcdSendData(1<<pix);

}
 
Ganz kalt.
Möchtest Du es verstehen? Dann solltest Du darüber nachdenken, das Datenblatt zu Rate ziehen etc.,
anstatt hier Rätselraten zu veranstalten.

Oder Du benutzt gleich die fertigen libs, dann brauchst Du nicht weiter darüber nachzudenken.
 
Andersrum. die Columns bzw. die x-Richtung wird direkt von 0 bis 127 adressiert.

Schwere Geburt..
Danke für die Hilfe!



CodeBox C
void glcdSetPixel([I]uint8_t[/I] x, [I]uint8_t[/I] y)

{
glcdSetPageColumn(x/8,y);
glcdSendData(1<<(x%8));

}
 
Zuletzt bearbeitet:
y mod 8 = Bitposition adressiert.

Auf die anderen "Rechnungen" wäre ich wahrscheinlich früher oder später drauf gekommen, nur wie kommt man dadrauf?
Muss man dafür Mathe Leistungskurs gehabt haben?
 
Dein Display hat (wahrscheinlich) 64x128=8192 Pixel.
64 Rows, Zeilen, Linien, Pixel auf der Y-Achse
128 Columns, Spalten, Pixel auf der X-Achse

Das Display stellt den Inhalt seines RAMs automatisch dar, sofern es korrekt initialisiert ist) - es scannt quasi kontinuierlich den RAM ab.
Schreibst Du irgendwo was neues/anderes ins RAM, ändert sich das Bild.

Das RAM besteht quasi aus einem zweidimensionalen Byte-Array. Für Dich vereinfacht(*) aus 8x128 Bytes.
Die 128 sind die Columns, die X-Achse.
Die 8 sind die 8 Pages, und da jedes Byte 8 Bit besitzt, hast Du auch hier Platz für 8Pages x 8Bit x 128Columns = 8192 Pixel abgespeichert.

Wenn Du also einen Pixel in Zeile "fragMichNicht" setzen willst (in irgendeiner Spalte), mußt Du herausbekommen, in welcher Page sich Zeile "fragMichNicht" befindet, und wo dort konkret. Das zusammen wäre das "Y". Irgendeine Spalte ist das "X".

(*) Genau genommen kann der ST... Displays mit bis zu 132 Columns ansteuern (0x83), und er besitzt eine neunte Page, die aber nicht mitabgescannt wird (sondern Daten für Sonderzeichen aufnehmen kann - Page9 besitzt auch nur ein Bit x 132 Columns)
 
Muss man dafür Mathe Leistungskurs gehabt haben?
Nunja... ganzzahlige Division und ganzzahlige Division mit Rest hatte man eigentlich Grundschule oder so...
Das hast Du nur bisher nicht so oft gebraucht... Aber hier hast Du 'ne praktische Anwendung dafür...

(jaja, Modulo hat man da noch nicht zu gesagt, das kam erst später...)

Ok, Stufe 0 sollte soweit klar sein.

Kannst Du das ganze jetzt auch praktisch testen?

Dann setze mal ein paar Pixel: (0,0), (127,63), (0,63), (127,0), (64,32)

Für Stufe 1 setzt Du außerdem (zusätzlich) (64,35) und beobachtest was?

Erklärung?
 

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