Hilfe zu Code Ausschnitt

Gast #150160
Lesenswert?
• ▲
▼
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);
    }
  }
}
Angehängte Dateien:
Gast #150161
Lesenswert?
• ▲
▼
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.
Gast #150165
Lesenswert?
• ▲
▼
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.
Gast #150168
Lesenswert?
• ▲
▼
@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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren