Hallo zusammen! Kann mir wohl jemand erklären was die folgenden Zeilen zu bedeuten haben? Buffer[X + (Y / 8) * 128] &= ~(mask << (shift1)); Buffer[X + (Y / 8) * 128] |= (~B2Write << shift1); besten dank!
Hallo Martin, ohne den Zusammenhang zu kennen, ist es unmöglich mehr zu sagen, als das was dasteht in normales Deutsch zu übersetzen. Das aber wird die Funktion nicht klarmachen. Was verstehst Du denn nicht an den beiden Zeilen? Gruss Oops
Das ist ein Teil einer Funktion für ein GLCD. Mir reicht ja schon die normale Übersetzung in deutsch!
OK. Also los:
>Buffer[X + (Y / 8) * 128] &= ~(mask << (shift1));
Indiziere den Vektor Buffer mit X+(Y/8), greife auf den Inhalt zu und
Verknüpfe ihn bitweise mit der UND-Verknüpfung mit einem Wert mask der
um diejenige Anzahl Bits nach links verschoben ist, die in shift1 steht
und dann bitweise negiert worden ist.
Weise das Ergebnis wieder dem mit X+(Y/8) indizierten Vektor Buffer zu.
Gruss
Oops
oops: Nicht ganz: Indiziere den Vektor Buffer mit X+(Y/8), greife auf den Inhalt zu und Verknüpfe ihn bitweise mit der UND-Verknüpfung mit einem Wert mask der um diejenige Anzahl Bits nach links verschoben ist, die in shift1 steht und dann (nach dem Verschieben) bitweise negiert worden ist. Weise das Ergebnis wieder dem mit X+(Y/8) indizierten Vektor Buffer zu. Oops
Buffer[X + (Y / 8) * 128] |= (~B2Write << shift1); Analog hier: Verschiebung eines Wertes negierten Wertes B2Write vor dem verschieben. Keine Negation des Schiebeergebnisses. Verknüpfung ist OR anstelle von UND. Hilft das (wirklich)? Gruss Oops
Nochmal oops: Habe die 128 vergessen. DIe geht natürlich auch in den Index mit ein. Gruss Oops
Also wenn das für'n GLCD ist, dann wird durch X/Y wohl die Displayposition definiert (Zeile/Spalte). In der ersten Zeile werden dann entsprechende Pixel gelöscht, während in der zweiten Zeile entsprechende Pixel gesetzt werden (vorausgesetzt, ein gesetztes Bit in Buffer[] entspricht einem sichtbaren Pixel... ansonsten umgekehrt!)
Nicht wirklich! Vielleicht fehlt hier der Zusammenhang! Mir verschließt sich Augenblicklich noch die Funktion ansich.
Warum lösche ich in der einen Zeile die Pixel wenn ich sie in der anderen setze
Naja... Du löscht zuerst die Pixel, die nicht mehr dargestellt werden sollten und setzt danach andere Pixel, die dargestellt werden sollen!
OK verstanden! Dafür schonmal besten dank! Jetzt kommt noch die Frage auf warum durch 8 geteilt wird?
Warum durch 8 geteilt: dazu muss man den Datenblatt von GLCD durchlesen! (Also ein Byte = 8 "Zeilen", besser gesagt, 8 Bildpunkte untereniander.) Karoly
Wenn Du darauf anspielst, dass (Y/8)*128 = Y*16 ist... ...weit gefehlt!!! Die (Ganzzahl-) Division /8 schneidet eventuelle Nachkommastellen einfach ab. Also z.B. 15/8 = 1 Damit wäre dann (15/8)*128 = 128 und nicht 15*16 = 240! Wozu das nun gut sein soll, ist ohne weitere Infos zu dem GLCD, dem restlichen Programm und dem, was damit bezweckt werden soll, nicht zu beantworten!
Also das ist ein KS0108 Display und er Code ist im Anhang. Schriftgröße 5*7
Martin wrote: > Also das ist ein KS0108 Display und er Code ist im Anhang. > Schriftgröße 5*7 Das mag schon sein, ändert aber nichts daran, dass das GLCD anscheinend immer 8 übereinanderliegende Pixel hardwaremässig zu einem Byte zusammenfasst. Das einzige was sich bei einem 5*7 Font und freier Positionierbarkeit der Buchstaben wirklich interessiert, ist: In welchem Byte muss welches Pixel gesetzt werden, damit an der Position X / Y genau das gewünschte Pixel aufleuchtet. Und da der Text ja nicht rastermäßig genau über einem GLCD Byte zu liegen kommen muss, kann es eben auch sein, dass 2 (in Y Richtung) übereinanderliegende Bytes begrapscht werden müssen, damit eine Spalte eines Buchstabens ausgegeben werden kann.
>Das mag schon sein, ändert aber nichts daran, dass das >GLCD anscheinend immer 8 übereinanderliegende Pixel >hardwaremässig zu einem Byte zusammenfasst. Das ist beim KS0108 so. Anscheinend handelt es sich um ein Display mit 128 * 64 Pixeln (d.h 128 Spalten und 8 Zeilen, jede 8 bit hoch), dessen Zeilen/Spaltenmatrix in einem linearen Buffer nachgebildet wird(daher das x+(y/8)*128)). Da hinein wird dann ein Maskenbyte logisch verknüpft, um einzelne Bits zu setzen. Wofür das gut ist, musst du leider selber rausfinden. Mein Compiler liest keine pdf-Files :-) Oliver
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.