mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe zu Code Ausschnitt


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

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang befindet sich ein Beispiel.
Jetzt weiss ich allerdings nicht welche Werte ich für cols bzw. rows
geben muss.

Autor: Blacky (Gast)
Datum:

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

Autor: Blacky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Rufus!

Kannst du mir anhand eines Beispiels sagen welche Werte ich für cols
und rows geben muss. Ich hab das immer noch nicht verstanden.

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Blacky (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, genau so sieht's aus. Endlich ist das Währungsmetallstück gefallen.

Autor: Thorsten (Gast)
Datum:

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

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.