Forum: Compiler & IDEs Bitmuster schreiben (kompliziertes Problem)


von Florian (Gast)


Lesenswert?

Ich habe mal wieder das bekannte Brett vor'm Kopp. Vielleicht könnt Ihr
mir ja helfen. Allerdings muß ich dazu erst einmal versuchen, daß
Problem in Worte zufassen. Ich hoffe, es gelingt mir:

Ich will auf ein einfarbiges Grafik LCD ein Bit-Pixel-Bild schreiben.
Das Bild habe ich als 8-Bitige Hex-Zahlen für das Bitmuster. Bspw.
0xCF, 0xFF, 0xAB oder sonst was.
Normalerweise ist jede Speicherstelle = 1 Zeichen = 8Bit breit. In
diesem Fall habe ich kein Problem, das Bitbild auszugeben.
Jetzt kann man das Display aber auch im Narrow Font betreiben, bei der
jede Speicherstelle zwar immer noch 8 Bit breit ist, aber nur 6 Bit von
angezeigt werden (die rechten Bits). Wie kann ich nun das 8-Bit Bild
übertragen? Es darf dabei kein Bit unterschlagen werden, denn das Bild
besteht ja aus der benötigten Anzahl Pixel/Bits.

Mir steht dabei zur Verfügung:
8-Bit Speicherstelle (nicht Pixel!) adressieren.
6 Pixel/Bits in der Speicherstelle schreiben

Wenn ich also die ersten 6 Bits des erstenn Bytes ausgegeben habe, muß
ich die zweite Speicherstelle anspringen und da die letzten 2 Bits
ausgeben. Zusätzlich noch 4 Bits des zweiten Bytes. Dann 4 verbleibende
Bytes in der dritten Zelle + 4 Bits des dritten Bytes usw.
Wie löse ich das elegant in einer Schleife?

von britneypunter (Gast)


Lesenswert?

Nehmen wir an dein bild steht im Array bild[] und dein Speicher wird
nachher sequentiell durch das Array speicherstelle[] beschrieben:
(Voraussetzung für meinen Vorschlag ist, dass die oberen beiden Bits
der jeweiligen Speicherstelle don't care sind - es also egal ist was
darin steht)

for(u=0;u<n;u++) {
  speicherstelle[4*u] = bild[4*u]
  for(i=1;i<4;i++) {
    speicherstelle[i+3*u]=(bild[i-1+3*u]>>(8-2*i)) | (bild[i+3*u]<<
(2*i));
    }
}

Bsp.:
Speicherzelle       Inhalt bit<5:0>
0                   b05 b04 b03 b02 b01 b00      ; u=0
1                   b13 b12 b11 b10 b07 b06      ; i=1
2                   b21 b20 b17 b16 b15 b14      ; i=2
3                   b27 b26 b25 b24 b23 b22      ; i=3
4                   b35 b34 b33 b32 b31 b30      ; u=1
5                   b43 b42 b42 b40 b37 b36      ; i=1

b12 bedeutet z.B. Byte1 bit2

Habe ich dich mit dieser Bitanordnung richtig verstanden? Also das die
MSBits mit in die nächste Speicherstelle geschrieben werden; und dort
als LSBits landen. Wenn du das anders meinst ist an obigem Algorithmus
aber auch nicht viel zu ändern.

n berechnet sich aus: Anzahl der Speicherstellen / 4

von Florian (Gast)


Lesenswert?

Danke. Das sieht schon sehr gut aus. Auf jeden Fall hast Du das Problem
richtig verstanden. Ich werde es mal testen.

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.