Anzeigen von Zeichen auf einem LCD mit einem EFM8-Mikrocontroller

Raspberry Pi 3: Sysinfo am 2x16 Zeichen LCD-Display anzeigen (March 2019).

Anonim

Anzeigen von Zeichen auf einem LCD mit einem EFM8-Mikrocontroller


Erfahren Sie, wie Sie Zeichen mithilfe eines Bildeditors entwerfen und auf einem LCD anzeigen, das von einem EFM8-Mikrocontroller gesteuert wird.

Einführung

In einem früheren Artikel wurde die Verwendung der SPI-Funktionalität eines EFM8-Mikrocontrollers zur Anzeige einer horizontalen Bildlaufzeile auf einem 128 x 128 Pixel großen LCD untersucht. In diesem Artikel werden wir dieselbe Low-Level-Schnittstelle verwenden, um die LCD-Anzeige mit allen Großbuchstaben des Alphabets zu aktualisieren. Noch besser: Sie lernen Techniken, mit denen Sie effizient jedes Zeichen oder Symbol entwerfen und anzeigen können, das mit 10 vertikalen und 8 horizontalen Pixeln angemessen dargestellt werden kann.

Vorherige Artikel in dieser Serie

  • Die EFM8-Serie von Silicon Laboratories: Eine leistungsstarke neue Embedded-Entwicklungsplattform
  • LCD über SPI steuern: Eine Einführung in die Projektentwicklung mit einem EFM8 Microcontroller

Benötigte Hardware / Software

  • SLSTK2000A EFM8-Evaluierungsboard
  • Simplicity Studio integrierte Entwicklungsumgebung
  • Scilab

Projektübersicht

Ziel ist es, alle Großbuchstaben auf einem 128 x 128 Pixel großen LCD-Display zu entwerfen und anzuzeigen. Der Text wird im typischen Textverarbeitungsformat auf dem LCD-Bildschirm ausgegeben: Ein Cursor verfolgt die Position, an der das nächste Zeichen angezeigt wird, und Sie geben einfach ein neues Zeichen ein, indem Sie eine Funktion namens InsertCharacter () aufrufen.

Die Schriftart ist ein benutzerdefinierter Zeichensatz mit fester Breite (und fester Höhe), der mit den im nächsten Abschnitt beschriebenen Techniken erstellt wurde. Die feste Zeichengröße beträgt 10 vertikale Pixel mal 8 horizontale Pixel (obwohl das Zeichen tatsächlich auf 9 mal 7 Pixel beschränkt ist, da eine leere Zeile und eine leere Spalte enthalten sind, um eine Trennung zwischen benachbarten Zeichen zu ermöglichen). Diese Größe wurde aus verschiedenen Gründen gewählt. Das LCD ist 128 Pixel breit, so dass 8 horizontale Pixel sicherstellen, dass eine gerade Anzahl von Zeichen über den Bildschirm passt. Wir verwenden 10 vertikale Pixel anstelle von 8, weil die resultierenden dünneren Buchstaben für das Auge etwas angenehmer sind. Diese Abmessungen ergeben auch Buchstaben, die groß genug sind, um leicht lesbar und dennoch klein genug zu sein, so dass das LCD eine bedeutungsvolle Anzahl von Zeichen gleichzeitig anzeigen kann. Der vielleicht wichtigste Grund ist jedoch der folgende: Der Code zum Kopieren der Pixeldaten von der Zeichenmatrix in den LCD-Datenpuffer ist mit einer Breite von 8 Pixeln viel einfacher, da die Bits, die die Pixelzustände darstellen, mit Bytegrenzen ausgerichtet sind. Das bedeutet, dass wir die LCD-Daten korrekt aktualisieren können, indem wir saubere Byteoperationen anstelle von unbeholfenen (und weniger effizienten) Bitoperationen verwenden, bei denen die Bits von einem Byte in einen Teil eines Bytes und einen Teil eines anderen Bytes kopiert werden müssen.

Gestalten von Charakteren

Das Übersetzen von visuellen Symbolen in LCD-kompatible Daten ist ein ernsthaft nicht intuitiver Prozess: Wer könnte den Buchstaben G zeichnen, indem er einem Byte-Array eine Reihe von hexadezimalen Werten zuweist "// www.getpaint.net/index.html" target = "_ blank" > Paint.NET, eine leistungsstarke und kostenlose Anwendung zur Bild- und Bildbearbeitung.

Jetzt ist es Zeit für Scilab, die Sie hier herunterladen können. Scilab ist eine freie numerische Berechnungssoftware ähnlich MATLAB. Wie bei MATLAB ist Scilab nützlich für mehr als nur Zahlen. In diesem Projekt werden wir die Zeichenbilder analysieren und in C-Code umwandeln, den wir kopieren und in unsere EFM8-Quelldateien einfügen können. Zusätzlich zu Scilab selbst müssen Sie die Image Processing Design Toolbox installieren. Dies wird mit dem ATOMS-Modul-Manager von Scilab problemlos erreicht:

Die andere wichtige Ergänzung der Firmware ist die Funktion, bei der die Pixeldaten von den von Scilab erzeugten Arrays in das zweidimensionale Array eingefügt werden, das die Pixeldaten für das gesamte LCD enthält:

Code

 void InsertCharacter(unsigned char *LCD_Character) //the input to this function is a pointer to a pixel data array { unsigned char n; unsigned char row_pixel; unsigned char column_byte; //rows are handled on a pixel-by-pixel basis row_pixel = LCDCursor(ROW); //columns are handled on a byte-by-byte basis, because one character width is 8 bits column_byte = LCDCursor(COL); /*each byte from the pixel data array is copied to LCDDisplayData, starting with the current cursor position*/ for(n = 0; n < CHAR_HEIGHT; n++) { LCDDisplayData(row_pixel)(column_byte) = *LCD_Character; LCD_Character++; //point to the next byte in the array row_pixel++; //the next byte corresponds to pixel data for the next line } LCDCursor(COL)++; //move the cursor one character width to the right /*if the cursor has reached the end of the line, return the cursor to the far left and move it down by one character height*/ if(LCDCursor(COL) == NUM_LINE_DATA_BYTES) { LCDCursor(COL) = 0; LCDCursor(ROW) = LCDCursor(ROW) + CHAR_HEIGHT; if(LCDCursor(ROW) == NUM_LINES) //if the cursor has reached the end of the display area, LCDCursor(ROW) = 0; //return the cursor to the top line } while(UPDATE_LCD == FALSE); //wait here until Timer2 initiates an LCD update UPDATE_LCD = FALSE; UpdateAllLCDLines(); } 

Code herunterladen

Wenn Sie den obigen Code einsehen und die Kommentare lesen, sollten Sie eine gute Vorstellung davon bekommen, wie das funktioniert. Beachten Sie, dass diese Routine sowohl das LCD-Pixeldatenfeld aktualisiert als auch die Cursorposition verwaltet.

Die Gesamtfunktionalität dieses Projekts besteht darin, wiederholt alle Großbuchstaben von A bis Z, dann von A bis Z usw. zu drucken. Der grundlegende Programmablauf ist der folgende:

  • Der Mikrocontroller löscht das LCD.
  • Timer2 ist aktiviert.
  • Das Programm tritt in eine Endlosschleife ein und verwendet die Funktion InsertCharacter (), um A, dann B, dann C und so weiter zu Z und dann wieder zu A zu drucken.
  • Die Funktion InsertCharacter () (siehe obigen Codeausschnitt) aktualisiert das LCD-Pixeldatenfeld, verwaltet den Cursor, wartet, bis Timer2 das Flag für eine LCD-Aktualisierung setzt, und initiiert dann eine Aktualisierung über die Funktion UpdateAllLCDLines ().
  • Der Timer2-ISR setzt das Aktualisierungsflag nur dann, wenn die SPI-Statusvariable angibt, dass die SPI-Schnittstelle im Leerlauf ist. Dies stellt sicher, dass die Funktion InsertCharacter () nicht versucht, eine neue SPI-Übertragung einzuleiten, bevor die vorherige Übertragung abgeschlossen ist.

Video

Nächster Artikel in der Serie: Kommunizieren mit einem EFM8 Microcontroller über USB

Gib diesem Projekt einen Versuch für dich selbst! Holen Sie sich die Stückliste.