Forum: Mikrocontroller und Digitale Elektronik Übersetzung für zwei Zeilen C-Code


von Martin (Gast)


Lesenswert?

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!

von Oops (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Das ist ein Teil einer Funktion für ein GLCD.
Mir reicht ja schon die normale Übersetzung in deutsch!

von Oops (Gast)


Lesenswert?

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

von Oops (Gast)


Lesenswert?

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

von Oops (Gast)


Lesenswert?

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

von Oops (Gast)


Lesenswert?

Nochmal oops:
Habe die 128 vergessen. DIe geht natürlich auch in den Index mit ein.

Gruss
Oops

von Stefan (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Nicht wirklich! Vielleicht fehlt hier der Zusammenhang!
Mir verschließt sich Augenblicklich noch die Funktion ansich.

von Martin (Gast)


Lesenswert?

Warum lösche ich in der einen Zeile die Pixel wenn ich sie in der 
anderen setze

von Stefan (Gast)


Lesenswert?

Naja... Du löscht zuerst die Pixel, die nicht mehr dargestellt werden 
sollten und setzt danach andere Pixel, die dargestellt werden sollen!

von Martin (Gast)


Lesenswert?

OK verstanden! Dafür schonmal besten dank! Jetzt kommt noch die Frage 
auf warum durch 8 geteilt wird?

von Karoly K. (koka55)


Lesenswert?

Warum durch 8 geteilt: dazu muss man den Datenblatt von GLCD durchlesen!
(Also ein Byte = 8 "Zeilen", besser gesagt, 8 Bildpunkte untereniander.)

Karoly

von Stefan (Gast)


Lesenswert?

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!

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Also das ist ein KS0108 Display und er Code ist im Anhang.
Schriftgröße 5*7

von karadur (Gast)


Lesenswert?

Hallo

z.B. um Grafik zu verschieben.

von Karoly K. (koka55)


Lesenswert?


von Gast (Gast)


Lesenswert?

Schau was dein Debugger oder Simulator mit dem Code macht.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.