Schnittstelle mit einem Grafik-LCD

Ich bestelle ein Grafik-LCD NHD-12864AZ-FL-YBW und der größte Teil des Schnittstellencodes scheint ziemlich einfach zu sein. Auf dem Datenblatt hat es die folgende Liste von BefehlenGeben Sie hier die Bildbeschreibung ein

Ich verstehe nicht, was in den Befehl zum Schreiben von Anzeigedaten eingefügt wird, um etwas auf den Bildschirm zu zeichnen. Wie würde beispielsweise das Pixel bei (5, 8) dunkel werden). Ich habe das Datenblatt durchgesehen, aber nichts gefunden.

Antworten (2)

Wie Wouter betonte, können Sie nicht direkt auf ein einzelnes Pixel schreiben.

Die Anzeigematrix verhält sich grundsätzlich wie ein monochromatisches Bitmap. Es ist physisch auf zwei identische Controller aufgeteilt, einer für die linke Hälfte, der andere für die rechte Hälfte. Ihre Daten-/Strobe-Leitungen sind miteinander verdrahtet und Sie können diejenige auswählen, mit der Sie über die Chip-Select-Pins CS1B und CS2B sprechen möchten. Beide sind aktiv hoch und beide Displayhälften würden gleichzeitig geschrieben, wenn Sie beide CS-Pins aktiviert hätten.

Das Display ist vertikal in acht Seiten unterteilt , die zu acht Pixel hohen Zeilen übereinander gelegt werden. Diese vertikalen Achter von Pixeln sind mit Bytes der Seite verbunden und jede Seite hat 64 Bytes. Somit,

  • 8 Seiten * 8 Bit = 64 Zeilen
  • 2 Controller * 64 Bytes pro Seite = 128 Spalten

für die gesamte Anzeige. Ein schönes Bild des Speicherlayouts finden Sie hier .


Wie würde beispielsweise das Pixel bei (5, 8) dunkel werden).

Ich nehme an, dass Sie mit (5,8)-Notation die fünfte Spalte von links und die achte Reihe von oben meinen, wie sie in der Computergrafik weit verbreitet sind. Leider nennt der Hersteller des Controllers die vertikale Koordinate (Seitenindex) X, was ziemlich verwirrend ist.

  1. Reihe Nr. 8 gehört zu Seite Nr. 1. Sie müssen Page Selectden Befehl mit dem Argument ausgeben 1, d. h. 00 10111001für Bitwerte in der Tabelle.

  2. Danach müssen Sie Set addressden Befehl zum Setzen des Spaltenindex ausgeben 5, d. h. Bitwerte von 00 01000101. Jetzt wird der "Cursor" der Anzeige auf das Byte gesetzt, das das angegebene Pixel enthält.

  3. Nun können Sie per Befehl den gewünschten Inhalt des Bytes schreiben Write Display Data. Die achte Zeile ist das LSB von Seite 1 und eine logische Eins auf diesem Bit macht Ihr gewünschtes Pixel dunkel.

Leider kann man nur ein ganzes Byte schreiben. Daher benötigen Sie entweder eine Kopie des Anzeigeinhalts im RWM Ihrer MCU, oder lesen Sie zuerst den aktuellen Wert vom LCD (Befehl Read Display Data), führen Sie ein logisches ODER mit aus 0b00000001und schreiben Sie zurück.

Beachten Sie, dass die Adresse auf der Seite (Y-Register) automatisch vorrückt, wenn Sie Daten schreiben. Sie können die ganze Seite einfach durch sequentielles Schreiben füllen - wenn Sie genug Speicher in Ihrer steuernden MCU haben, können Sie einfach einen Block von 2 * 8 * 64 = 1024 Bytes zuweisen, die Bitmap dort behalten und manipulieren und den gesamten Anzeigeinhalt senden /geänderte Seiten auf Anfrage. Dies hängt von Ihrer Anwendung ab.

Dieses Protokoll ist für die GLCD 128x64 Displays sehr verbreitet. Ich glaube, Sie könnten auch eine gebrauchsfertige Bibliothek für Ihre MCU finden, die Ihnen einige grundlegende Grafiken (Linie, Rechteck, möglicherweise sogar Ellipse) und / oder Textausgabe bietet, ohne das LCD direkt zu manipulieren.

Das sieht aus wie ein PCD8544 LCD-Controller (wie er im üblichen Nokia 84 x 48 BW-Display zu finden ist). Die vollständige Erklärung finden Sie im Datenblatt :) Es gibt keinen Befehl zum Ändern eines einzelnen Pixels, aber Sie können ein Byte schreiben (8 Pixel, vertikal ausgerichtet). Um ein einzelnes Pixel zu ändern, müssen Sie sich entweder den Bytewert merken (in einem Array im uC speichern) oder ihn zuerst lesen. Ändern Sie dann das eine Pixel und schreiben Sie dann das Byte auf das LCD. Dies ist (ein Teil) meines Treibers für ein solches LCD. Es speichert das „Bild“ auf dem uC, sodass auf Kosten von etwas RAM (504 Bytes) vermieden wird, dass jedes Byte zuerst gelesen werden muss.

void lcd5510_pixels( unsigned char x, unsigned char y, unsigned char d ){
   lcd5510_command( 0x80 | x );   
   lcd5510_command( 0x40 | y );  
   lcd5510_data( d );
} 

unsigned char lcd5510_buf[ 504 ];

void lcd5510_write( unsigned int x, unsigned int y, unsigned char d ){
   unsigned int a = x + ( y / 8 ) * 84;
   unsigned int m = 1 << ( y % 8 );

   if(( x >= 84 ) || ( y >= 48 )){
      return;
   }

   if( d ){
      lcd5510_buf[ a ] |= m;
   } else {     
      lcd5510_buf[ a ] &= ~m;
   }

   lcd5510_pixels( x, y / 8, lcd5510_buf[ a ] );         
}

Ein Problem bei dieser Gruppe von LCDs ist, dass es anscheinend mindestens zwei verschiedene Controller gibt (der echte PCD8544 und einige Clone), die eine geringfügig unterschiedliche Initialisierung erfordern, um überhaupt zu funktionieren. Mein Init-Code ist (nach Pin konfigurieren, zurücksetzen usw. (:

   // inspired by https://www.sparkfun.com/products/10168
lcd5510_command( 0x21 );  // select exteded instructions
lcd5510_command( 0xC8 );  // Vop = 110000b
lcd5510_command( 0x06 );  // TCx = 00b
lcd5510_command( 0x13 );  // BSx = 100b
lcd5510_command( 0x20 );  // select basic instructions, horizontal addressing
lcd5510_command( 0x0C );  // normal mode