www.mikrocontroller.net

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


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

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

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oops (Gast)
Datum:

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

Gruss
Oops

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!)

Autor: Martin (Gast)
Datum:

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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum lösche ich in der einen Zeile die Pixel wenn ich sie in der 
anderen setze

Autor: Stefan (Gast)
Datum:

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

Autor: Martin (Gast)
Datum:

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

Autor: Karoly Kovacs (koka55)
Datum:

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

Karoly

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Martin (Gast)
Datum:
Angehängte Dateien:

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

Autor: karadur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

z.B. um Grafik zu verschieben.

Autor: Karoly Kovacs (koka55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau was dein Debugger oder Simulator mit dem Code macht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.