Atmel
AVR
Mikrocontroller mit OpenSuse: Ansteuerung von LCD-Displays
LCD-Displays
gibt es in großer Mannigfaltigkeit. Üblich ist, dass die Displays
bereits einen Controller enthalten, der die Pixel ansteuert. Auch in
diesem Bereich hat eine Art Standardisierung stattgefunden, so dass nur
gegen wenige Controllertypen programmiert werden muss. Ein sehr
gebräuchlicher Controller ist der HD44780.LCD-Display Seiko L2432 mit 2 Zeilen zu 24 Zeichen
Auf dem Display sitzt ein Controller HD44780, also absoluter "Standard".Das Display hat 2 Zeilen zu 24 Zeichen.
Unterseite des Seiko L2432, rechts der Controller HD44780. Ganz rechts der 14-polige Konnektor, an den ein Flachbandkabel angelötet wurde.
| Pin |
Function |
| 1 |
GND |
| 2 |
V+, normalerweise +5V |
| 3 |
VLC, Kontrastreglung |
| 4 |
RS - Register Set |
| 5 |
RW - Read/Write |
| 6 |
E - Enable |
| 7 |
DB0 |
| 8 |
DB1 |
| 9 |
DB2 |
| 10 |
DB3 |
| 11 |
DB4 |
| 12 |
DB5 |
| 13 |
DB6 |
| 14 |
DB7 |
| 15 |
(A - Anode for Backlight)
optional |
| 16 |
(K - Kathode for Backlight)
optional |
In Rot sind die für die 4-Bit-Ansteuerung notwendigen Pins gekennzeichnet. Diese müssen mit freien Ports des AVRs (bzw. V+ und GND) verbunden werden.
Neben der Datenleitungen (8 Datenbits D0..D7 bzw. 4 Datenbits D4..D7 im 4-Bit-Modus, Controllerauswahl, R/W, RS, Enable sowie GND und Vcc), muss unbedingt auch -wenn vorhanden- die Kontrastregelung angeschlossen werden. Das gezeigte Display benötigt beispielsweise eine Spannung, die irgendwo zwischen 0 und 5V liegt. Wird keine passende Regelspannung für den Kontrast eingestellt, ist absolut nichts zu sehen und man kann nicht erkennen, ob das Display überhaupt funktioniert! Die Kontrastspannung wird über einen Trimmer angeschlossen von typischerweise 10 KOhm, so dass man auf unterschiedliche Lichtverhältnisse reagieren kann.
Als Open Source gibt es eine Bibliothek für den AVR-Controller (LCD Library von Peter Fleury), welche LCDs ansteuern kann. Sie nutzt die 4-Bit-Ansteuerung (oder einen Memory-Mapped-Mode, der bei bestimmten AVRs möglich ist). Je nach Controller wird ein 8-Bit-Modus, ein 4-Bit-Modus oder beides unterstützt. Der 4-Bit-Modus hat den Vorteil, dass am AVR weniger Pins benötigt werden.
Hinweis: Im 4-Bit-Modus werden die Datenleitungen
D4..D7 eines LCD-Moduls/Controllers genutzt. Auch wenn in der
Peter-Fleury-Bibliothek immer von D0..D3 (=die logischen Datenleitungen
des 4-Bit-Modes) die Rede ist, gemeint sind im
4-Bit-Modus immer D4..D7 (=die physikalischen Datenleitungen des
LCD-Moduls).
Im folgenden ist die Nutzung der Funktionen dargestellt (Codeauszug, kompletten Source Code gibts weiter unten):
...
#include
"lcd.h"
...
/* clear display and home cursor */
lcd_clrscr();
/* put string to display (line 1) with linefeed */
lcd_puts("LCD Test Line 1\n");
/* cursor is now on second line, write second line */
lcd_puts("Line 2");
/* move cursor to position 8 on line 2 */
lcd_gotoxy(7,1);
/* write single char to display */
lcd_putc(':');
DO("wait for key\n\r");
/* wait until
push button PD2 (INT0) is pressed */
wait_until_key_pressed();
DO("after key\n\r");
/*
* Test 2: use lcd_command() to turn on cursor
*/
/* turn on cursor */
lcd_command(LCD_DISP_ON_CURSOR);
...
Die
Bibliothek muss im Makefile als zusätzliche Bibliothek eingetragen
werden. Die Funktionsprototypen stehen alle im Header „lcd.h“, den man
im eigenen Programm eintragen muss.
Die
Bibliothek ist auch konfigurierbar, es gibt z.B. Controller, die mehr
als zwei Zeilen beherrschen, dies kann in der Bibliothek eingestellt
werden. Die Spezifika des Displays (Anzahl zeilen, Anzahl Zeichen, ..)
und die Anschlußbelegung am AVR muß in "lcd.h" eingetragen werden.
Im Code findet sich übrigens auch der Makroaufruf DO(„text“), dies ist ein Debug-Makro ("DEBUG OUT") von mir, welchen Daten via RS232 ausgibt. Damit kann man erkennen, was der Controller gerade tut. Wie die RS232-Schnittstelle angesprochen wird, wird weiter unten in meinem Text besprochen.
LCD-Displays Wintek WD-C2704M-1HNN mit 4 Zeilen zu 27 Zeichen
Das
Display hat 4 Zeilen zu 27 Zeichen. Auf dem Display sitzen zwei
Controller, kompatibel zum HD44780. Einer ist für die oberen zwei
Zeilen, der andere für die unteren zwei Zeilen verantwortlich. Beide
Controller teilen sich alle I/O-Leitungen. Statt einem E(nable)-Pin
gibt es zwei Enable-Pins E1 und E2 für die Auswahl zwischen den beiden
Controllern.
Die Bibliothek von Peter Fleury unterstützt allerdings nur Displays mit einem Controller. Ich habe das Problem dadurch gelöst, dass ich in alle Funktionen der Bibliothek wo notwendig zwischen beiden Controllern unterschieden habe. So wird z.B. aus der Funktion lcd_clrscr(void) eine Funktion lcd_clrscr(int controllerId), der die Werte LCD_CRTLR_1 und LCD_CRTLR_2 übergeben werden können.
Die Pin-Belegung des Moduls ist in folgender Tabelle dargestellt.
Die oben erwähnte "Quasi-Standardisierung"ist hier leicht verändert, da
2 Enable-Pins existieren.
| Pin |
Function |
| 1 |
GND |
| 2 |
V+, normalerweise +5V |
| 3 |
VLC, Kontrastreglung (0..4V) |
| 4 |
RS - Register Set |
| 5 |
RW - Read/Write |
| 6 |
E1 - Enable Controller 1 |
| 7 |
E2 - Enable Controller 2 |
| 8 |
DB0 |
| 9 |
DB1 |
| 10 |
DB2 |
| 11 |
DB3 |
| 12 |
DB4 |
| 13 |
DB5 |
| 14 |
DB6 |
| 15 |
DB7 |
| 16-21 |
Key Input for Input Keys |
In Rot sind die für die 4-Bit-Ansteuerung notwendigen Pins gekennzeichnet. Diese müssen mit freien Ports des AVRs (bzw. V+ und GND) verbunden werden.
Im folgenden ist die Nutzung der modifizierten Funktionen dargestellt (Codeauszug, kompletten Source Code gibts weiter unten):
...
#include
"lcd.h"
...
/* clear display and home cursor */
lcd_clrscr(LCD_CRTLR_1);
lcd_clrscr(LCD_CRTLR_2);
/* put string to display (line 1) with linefeed */
lcd_puts(LCD_CRTLR_1, "LCD Test Line 1\n");
/* cursor is now on second line, write second line */
lcd_puts(LCD_CRTLR_1, "Line 2");
/* move cursor to position 8 on line 2 */
lcd_gotoxy(LCD_CRTLR_1, 7,1);
/* write single char to display */
lcd_putc(LCD_CRTLR_1,':');
DO("wait for key\n\r");
/* wait until
push button PD2 (INT0) is pressed */
wait_until_key_pressed();
DO("after key\n\r");
/*
* Test 2: use lcd_command() to turn on cursor
*/
/* turn on cursor */
lcd_command(LCD_CRTLR_1, LCD_DISP_ON_CURSOR);
...
Im Bild ist der Anschluss des LCDs an das einfache AVR-Board zu erkennen.
Hier der Source-Code zum
Display: lcd_2controller.zip
Erschöpfende Infos zur LCD-Ansteuerung unter http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD