LCD Anzeige Modul (HD44780 kompatible)

Kurzbeschreibung:      
   

Da für viele Mikrocontrollerprojekte eine Ausgabe via LCD-Anzeige sehr sinvoll ist, dient dieses LCD-Modul dazu einfach, und ohne großem Codeaufwand ein LCD-Modul an die verschiedenen AVR-Prozessoren anzubinden. 

Das LCD-Modul wird im 4-Bit-Modus betrieben, um Port-Pins vom Prozessor einzusparen. Somit genügt es auf der Hardwareplattform legendlich einen 10poligen Wannenstecker für die Ansteuerung des LCD-Display bereitzustellen.
Es werden legendlich 8 I/O-Leitungen vom Prozessor beansprucht. Falls man auf die Steuerung auf die Hintergrundbeleuchtng verzichtet, genügen auch 7 I/O-Leitungen.

Die Zuordnung der I/O-Pins erfolgt in der Header-Datei vom LCD-Modul. Dabei ist es möglich entweder einen kompletten Port vom AVR-Kontroller für die Steuerung zu verwenden oder die Daten und Steuerleitungen vom LCD-Modul auf jeweils einen Port zu verteilen.

Das LCD-Modul ist für alle HD44780 - kompatible LCD-Module geeignet. von 1x16 bis 4x24 Zeilen. Es ist legenlich darauf zu Achten, dass die LCD-Module einen internen Vorwiderstand für die Hintergrundbeleuchtung besitzen.

 

Hardware

 
Schaltplan:      
LCD-Modul - Schaltplan für HD44780 kompatible Module
Stückliste:  

- LCD-Modul       (z.B. 2x16 Display  von http://www.myavr.de/shop/article.php?artDataID=96 für 8,90 EUR)
- 1x16 polige Buchsenleiste und 1x16 polige Stiftleiste  (www.reichelt.de )
- 1x Wannenstecker 10 polig, gerade                          (www.reichelt.de 'WSL 10G' )
- 1x BC548 Transistor oder ähnliche
- 1x Widerstand R1 = 4,7 kΩ
- 1x Trimmer R3 = 5 kΩ   (für die Kontrasteinstellung)
- 1x Widerstand R4 = 10 kΩ
- 1x Widerstand R5 = 1 kΩ
- 1x Flachbandkabel 10 polig , ca 30cm
- 2x Pfostenbuchsen 10 polig 
- kleines Stück Lochrasterplatine für den Schaltungsaufbau

Die Bauteilkosten incl. LCD-Display liegen bei ca 12 EUR.

 
Aufbau:   Die 16 polige Stifleiste von der Leiterbahnunterseite auf die LCD-Display Leiterplatte einlöten. Ansonsten ist nur darauf zu achten, dass der Wannenstecker nicht unter dem Display-Bereich plaziert wird.
Der gesamte Aufbau erfolgt auf einer Lochrasterplatine. Kleiner Tipp am Rande, das Display mit der Stiftleiste nicht direkt in die Lochraster-Leiterplatte einlöten, sondern erst eine 16 polige Buchsenleiste auf die Lochrasterleiterplatte einlöten, in die dann das LCD-Modul gesteckt wird. Somit kann das LCD-Modul problemlos gegen andere LCD-Module getauscht werden. Bitte darauf Achten, dass die eingesetzten LCD-Module Pinkompatible mit der unten aufgeführten Pin-Belegung vom LCD-Modul ist. Eventuell muss man nur ein Adapterkabel dazwischen hängen.

Getestet wurde die Schaltung von mir mit dem 2x16 Display von myavr und einem 2x24 Display.
 
Inbetriebnahme:  

1) Grundsätzlicher Funktionstest:
- Schaltung mit Spannung +5V versorgen.
- Kontrastregler nun so einstellen, dass in der 1.Zeile lauter schwarzen Kasten erscheinen.
- Am Lichteingang 5V anlegen ==> die Hintergrundbeleuchtung muss nun angehen.

2) Endtest:
- LCD-Modul mittels Flachbandkabel mit der Testhardware verbinden
- Software LCD-Modul  (lcd.c,  lcd.h) einbinden und die lcd.h Datei an die aktuelle Hardware anpassen.
- Atmel Prozessor programmieren und Schaltung mit Spannung versorgen.

Nun sollte auf dem Display der programmierte Text erscheinen.

Hinweise zur Fehlersuche:
Erscheinen nur in der 1.Zeile lauter schwarze Kasten, so bedeutet dies, dass der Display-Kontroller nicht korrekt initialisiert wurde. Dies kann mehrere Ursachen haben:

- Hardware:  Verbindungen von den Datenbits und Steuerleitungen zum Display kontrollieren
Timingproblem vom ATMEL-Prozessor, wenn dieser mit dem internen RC-Oszilator betrieben wird.
Auf jeden Fall sollte bei einem internen Oszillator eine Kalibrierung mittels OSCAL-Byte durchgeführt werden 

- Software:   Falsche Zuordnungen der PINS in der Headerdatei  lcd.h
OSCAL-Byte wird nicht korrekt gesetzt

 
LCD-Display:   Die meisten kompatible HD44780 LCD-Module verwenden eine einreihige 16 polige Stiftleiste. Sollte bei Ihnen ein 2reihige Stifleiste vorhanden sein, so müssen Sie ein Adapterkabel von 2x8 auf 1x16  erstellen damit Sie Ihr Display verwenden können. Hierbei müssen Sie auf die Belegung Ihrer Pins achten, Da zum Teil die Signale der Pins nicht identisch sind. (z.B. muss Pin 1 von Ihrem LCD  nicht immer auch der Pin 1 von meinem Display sein)

Pin-Belegung vom Display (1x16 Anschlussleiste) und Wannstecker zur Zielhardware
 
  LCD-
Anschluss
LCD Display
Modul Pins
Bechreibung
9 1 - Vss Masseanschluss für das LCD-Modul
10 2 - Vcc +5V Spannungsversorgung
- 3 - Vo Eingang zur Kontrasteinstellung des LCD-Displays
1 4 - RS Register Select:
0 => Zugriff auf Instructionregister (schreiben)
Zugriff auf Busy-Flag und Adress counter (lesen)
1 => Zugriff auf Data Register (lesen und schreiben)
2 5 - R/W

Eingang  Read / Write Signal
0 => Schreibzugriff
1 => Lesezugriff

3 6 - E Eingang Data Read / Write Enable Signal
positiver Impuls (mindestens 250ns) über nimmt die Daten
- 7 - DB0 Ein/Ausgang Datenbit 0 - wird im 4-Bit Modus nicht benötigt und liegt fest auf GND
- 8 - DB1 Ein/Ausgang Datenbit 1 - wird im 4-Bit Modus nicht benötigt und liegt fest auf GND
- 9 - DB2 Ein/Ausgang Datenbit 2 - wird im 4-Bit Modus nicht benötigt und liegt fest auf GND
- 10- DB3 Ein/Ausgang Datenbit 3 - wird im 4-Bit Modus nicht benötigt und liegt fest auf GND
5 11 - DB4 Ein/Ausgang Datenbit 4
6 12 - DB5 Ein/Ausgang Datenbit 5
7 13 - DB6 Ein/Ausgang Datenbit 6
8 14 - DB7 Ein/Ausgang Datenbit 7  / kann auch als Busy-Flag Verwendung finden
- 15 - LED-A Hintergrundbeleuchtung Anode - LCD-Display mit internen LED Vorwiderstand
- 16 - LED-K Hintergrundbeleuchtung Kathode
  4 Transistor Licht Steuersignal für den Transistor, der dann + 5V  auf den LED-Anode Eingang für die 
Hintergrundbeleuchtung durchschaltet. Mittels PWM-Signal an diesem Eingang kann die
Hintergrundbeleuchtung gedimmt werden.

 

Bilder:   Schaltungsaufbau vom LCD-Modul  
   

Schaltungsaufbau vom LCD-Modul

 
    Leiterbahnansicht vom LCD-Modul  

Software

 
LCD-Modul:  

Für den C-Compiler von Codevision AVR habe ich ein LCD-Modul erstellt. Folgende Funktionen werden vom Modul zur Verfügung gestellt:

void vInitLcd(void);                                           // LCD Display intialisieren (4-Bit Modus, 2 Zeilen,  7x5 Pixel)
void lcd_command(unsigned char data);    // LCD Command im 4 Bit Modus an LCD übertragen
void lcd_data(unsigned char data);              // LCD Datenbyte im 4 Bit Modus an LCD übertragen

void vPrintStringF_LCD(flash unsigned char *ptrString);         // Zeichekette die im Flash abgelegt ist
//ausgeben

void vPrintString_LCD( unsigned char *ptrString);                    // Zeichekette die im RAM abgelegt ist
// ausgeben

void vGotoXY_LCD(unsigned char ucX, unsigned char ucY);   // Cursor positionieren
void vClearLCD(void);                                                                         // LCD löschen und Cursur auf Home setzen


Legendlich in der Headerdatei von lcd.h werden entsprechend der Hardwaregegebenheiten die entsprechenden Pins zugeordnet.  Grundsätzlich kann man das LCD in 2 Port-Modi betreiben:

1) FULL-Mode: alle LCD-Pins liegen an einem Port ==> dies ist zu empfehlen, da dies Flash-Speicher spart

2) HALF-Mode: die Datenbits und Kontrollbits liegen an unterschiedlichen Ports (z.B. alle Datenbits am PORTD und alle Kontrollbits am PORTB. Dadurch ist man beim Hardwaredesign flexibler, dies kostet aber ca. 112 Bytes mehr vom Flashspeicher.

Für den HALF-Mode muss dann folgendes gesetzt werden:
#define LCD_PORT_MODE_FULL 0 // LCD Pins liegen alle komplett an einem Port
#define LCD_PORT_MODE_HALF 1 // Datenbits und Kontrollbits liegen auf unterschiedlichen Ports

Für den FULL-Mode wird dann folgendes gesetzt:
#define LCD_PORT_MODE_FULL 1 // LCD Pins liegen alle komplett an einem Port
#define LCD_PORT_MODE_HALF 0 // Datenbits und Kontrollbits liegen auf unterschiedlichen Ports


als nächstes folgt dann die Zuordnung der PORTS, welche für die LCD-Steuerung verwendet werden.
Und zum Schluß erfolgnt dann noch die Zurordnung der einzelnen LCD Steuerbits.

Die Bits können zwar frei zugeordnet werden, aber trotzdem würde ich folgende Zuordnungen wegen der besseren Übersicht empfehlen:
Datenbits DB4 - DB7   auf die PORT-Bits   PD4-PD7  zulegen
und die
Steuerbits LCD_RS, LCD_RW und LCD_EN auf die PORT-Bits  PD0-D2 zulegen

Ebenso sollten die obigen Gruppen auch im Half-Mode erhalten bleiben.

Vergessen Sie nicht die include-Anweisung an den eingesetzten Prozessortyp anzupassen.
#include

Das wars :-) Jetzt kann das Modul im bestehen C-Projekt eingebunden werden. Und hier noch ein Beispiel, wie die Funktionen verwendet werden:

vInitLcd();   // Dieser Aufruf muss nur einmal erfolgen, am besten in der bestehende Init-Routine hinzufügen


vGotoXY_LCD(2,0);                               // Cursur auf  1.Zeile  3.Stelle  setzen
vPrintStringF_LCD("TEST-LCD");  
vGotoXY_LCD(0,1);                              // Cursur auf   2.Zeile   1.Stelle setzen

.....
unsigned char buffer[MAXBUFFER];
......
vGotoXY_LCD(0,1);                   // Cursor auf  2.Zeile und 1.Stelle setzen
vPrintString_LCD(buffer);      // String aus der RAM-Variablen ausgeben

 
Download   LCD-Modul:  
Version 1.04 
14.10.2008   
lcd_v104.rar (frei für private Nutzung)

Compiler CodeVision AVR
 
HD44780 Programmierung

  kommt noch, wenn ich etwas mehr Zeit habe  
Links   in Kürze sind hier brauchbar Links zufinden