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