Mit dem Display T6963 möchte ich eine Bitmap Grafik darstellen lassen.
Im Internet habe ich diesen C-Code gefunden.
Ich habe mir desshalb den Code heruntergeladen, weil dieser eine
Funktion zum Darstellen eines Bitmaps beinhaltet.
Jetzt weiss ich allerdings nicht welche Werte ich für cols und rows
geben muss. Mir ist nicht ganz klar warum ich cols und rows vorgeben
muss. Kann mir jemand dazu helfen?
void t6963_copy_bitmap(u16 lcd_adr, PGM_P bitmap, u08 cols, u08 rows,
u08 invert)
{
// lcd_adr = start adress in the display RAM
// bitmap = pointer to the bitmap in the flash
// cols = cols of the bitmap in bytes (pixel / 8)
// rows = rows of the bitmap in pixel (row = Reihe)
// invert = if > 0, then bitmap is inverted (maybe a bug in BMP2C)
u08 row, col, data;
u16 lcd_ptr;
for(row=0; row < rows; row++)
{
lcd_ptr = lcd_adr + (row * cols);
t6963_write_cmd2(CMD_SET_ADRESS_POINTER , lo8(lcd_ptr),
hi8(lcd_ptr));
for(col=0; col < cols; col++)
{
data = pgm_read_byte(bitmap + (row * cols) + col);
if(invert) data = ~data;
t6963_write_cmd1(CMD_DATA_WR_INC, data);
}
}
}
Da mit einem Schreibvorgang gleich 8 Bit in horizontaler Anordnung
geschrieben werden, ist doch naheliegend, daß cols die Horizontale
Pixelzahl / 8 sein muss.
Wo liegt das Problem?
Die Größe der Bitmap musst Du angeben, weil ... naja, sie könnte ja
auch kleiner sein, nicht?
Allerdings funktioniert diese Routine nicht sinnvoll mit Bitmaps, die
schmaler sind als das Display, aber immerhin mit welchen, die weniger
hoch sind.
Hallo Rufus!
Was meinst du mit "Allerdings funktioniert diese Routine nicht
sinnvoll mit Bitmaps, die
schmaler sind als das Display, aber immerhin mit welchen, die weniger
hoch sind."
Die Routine macht nichts anderes, als alles Bytes, aus denen die Bitmap
besteht, nacheinander an das Display zu übertragen. Ist die Bitmap
schmaler als das Display, so werden die Daten, die eigentlich in der
zweiten Zeile des Displays dargestellt werden sollte, rechts an die
erste Zeile angehängt, bis die Display-Zeile voll ist.
Mal eine Demonstration:
Display ist 10 "Pixel" breit, Bitmap ist 8 "Pixel" breit
Bitmap:
00000000
11111111
22222222
33333333
Wird so dargestellt:
0000000011
1111112222
2222333333
33
und so weiter.
Als Breite musst Du also die Breite des von Dir verwendeten Displays
angeben - und die Bitmap muss dazu passen.
Das von Dir gepostete "Beispiel" ist zumindest von den Konstanten her
fragwürdig; ich glaube nicht, daß das Display 67 Pixel breit ist.
Vielen Dank Rufus!
Achso.... am besten ich erzeuge gleich ein Bitmap mit 128x128 Pixeln.
Mein Display hat nämlich diese größe.
Dann kann ich auch für cols 128 und für rows 128 eingeben.
@Blacky:
Wo hast Du denn den Code gefunden? Ich hab ihn auch mal runtergeladen,
weiss aber nicht mehr woher (und mit welcher Lizenz).
Da ist naemlich ein kleiner Fehler drin, den ich mal dokumentieren
wollte: Das Setzen der CG RAM Offset Adresse ist falsch:
#define CG_RAM_START 0x1800
#define CG_RAM_END 0x1FFF // CG-RAM must be 2048 Byte !!!
#define CG_RAM_OFFSET (CG_RAM_START & 0xF800) // upper 5 bits of the
start address
t6963_write_cmd2( CMD_SET_OFFSET_REGISTER, hi8( CG_RAM_OFFSET ), 0 );
Im Datenblatt heisst es:
The lower five bits of the first data byte should be set to the upper 5
bits of the start address for the character generator RAM (CG-RAM)
area.
Also muss man da noch verschieben ...
Sorry, dass ich immer so alte Beitraege rauskrame, aber das Forum ist
fuer mich auch immer eine Art Bibliothek, und es waere schade, wenn da
Fehler nicht richtig gestellt wuerden.
Schoene Gruesse aus London
Thorsten