Beschreibung
Die folgenden C-Funktionen zur 4-Bit-Ansteuerung eines LC-Displays (2- oder 4-zeilige Punkt-Matrix-Displays mit Controllern wie zum Beispiel dem ST7066U oder dem HD44780) sind im Rahmen eines Projektes entstanden, in dem ein
ATmega16A-Controller von
Atmel neben anderen Funktionen auch die Ausgabe von Texten auf einem solchen Display übernimmt. Es existieren neben einer Routine zur Initialisierung des Displays weitere Funktionen, zum Beispiel für die Ausgabe von Zeichenketten oder die Positionierung des Cursors.
Die Funktionen wurden bewusst so erstellt, dass sie schnell und einfach an andere Pin-Belegungen angepasst werden können. Voraussetzung ist, dass alle Anschluss-Pins an einem Port des Controllers sind.
Quellen
- lcd.c - C-Funktionen
- lcd.h - Festlegung von Display-Parametern (z. B. Anzahl der Zeilen und Spalten per DISPLAY_NUMBER_ROWS und DISPLAY_NUMBER_COLUMNS, Timing usw.)
- port_definitions.h - Konfiguration der Pinbelegung
Eine detaillierte Dokumentation der einzelnen Funktionen und Dateien ist hier zu finden:
Doxygen-Dokumentation
Beispiele
Vor der Nutzung des Displays sind die mit dem Display verbundenen Pins des Controllers zu initialisieren:
lcd_pin_init();
Eine korrekte Initialisierung des Displays erfolgt mittels:
lcd_init();
Nun kann das Display für die Ausgabe von Texten benutzt werden. Im einfachsten Fall sieht das dann so aus:
lcd_send_string("Hallo Welt!", FALSE);
Befindet sich der String im Programmspeicher, um RAM zu sparen:
const char pgm_mem_text[] PROGMEM = "Text 1234567890";
ist bei der Ausgabe das "Progmem-Flag" auf
TRUE zu setzen:
lcd_send_string(pgm_mem_text, TRUE);
Neben diesen Funktionen existiert auch die Möglichkeit, den Cursor beliebig zu setzen (beispielsweise in Spalte 0, Zeile 1):
lcd_set_cursor(0, 1);
oder ihn wieder zurück in die Ausgangsposition zu setzen:
lcd_cursor_home();
Der folgende Befehl löscht das komplette Display:
lcd_clear();
Geeignete Displays
Grundsätzlich sollten die Routinen für alle Punkt-Matrix-Displays mit bis zu 4 Zeilen und einem Controller (HD44780 oder kompatible) geeignet sein. Getestet wurden die Funktionen bis jetzt an folgenden Displays:
Fehlerquellen
Falls die Ansteuerung des Displays nicht funktioniert, sollten folgende mögliche Fehlerquellen ausgeschlossen werden:
- Anschlussbelegung am Display selbst (Verdrahtung) oder in der Datei port_definitions.h fehlerhaft
- Timing (d. h. Wartezeiten) während der Initialisierung und der Funktionen zur Datenübertragung fehlerhaft (siehe Datenblatt und Anpassung der Angaben in lcd.h)
- fehlende oder falsche Angaben zur Taktfrequenz des Controllers (F_CPU-Definition), die zu einer falschen Berechnung der Delays führen, ebenso wie eine nicht eingeschaltete Optimierungsstufe beim Kompilieren (führt ebenso zu Problemen bei der Berechnung der Delays)
- Probleme durch Mehrfachbelegung der ATmega-Controller-Ports (Beispiele: JTAG-Interface an PortC, USART an PortD)
Wenn diese Fehlerquellen ausgeschlossen sind, kann es natürlich sein, dass die Funktionen für das spezielle Display nicht funktionieren, weil die Initialisierungsroutinen anders gestaltet sein müssen oder die Organisation der Zeilen mit zwei Controllern erfolgt. In diesem Fall ist das Datenblatt zu konsultieren, um evtl. die Quellen anzupassen.
Lizenz
Alle hier veröffentlichten Quellen stehen unter der
LGPLv3.
Versionsinfo
- Version 0.1, 26.07.2009: erste Version
- Version 0.2, 27.07.2009: Autowrap (neue Zeile bei Erreichen des Zeilenendes durch String) und Newline-Detektion hinzugefügt
- Version 0.3, 29.07.2009: bessere Beschreibung der Funktionen; String-Daten können nun auch aus dem Programmspeicher gelesen werden (Veränderung der Schnittstelle von lcd_send_string())
- Version 0.4, 30.07.2009: Fehlerbereinigung für Autowrap bei zweizeiligen Displays
- Version 0.5, 27.09.2009: Fehlerbereinigung: nicht genutzter Pin des Ports wird nicht mehr überschrieben
- Version 0.6, 01.11.2009: Funktion zur Initialisierung der uC-Ports/Pins hinzugefügt
- Version 0.7, 09.01.2010: Nutzung des R/W-Pins nun in lcd.h konfigurierbar (kann auch fest auf Masse gelegt werden), Zählweise der Zeilen jetzt ab 0 (lcd_set_cursor())
- Version 0.7, 06.02.2010: Lizenzumstellung auf LGPLv3
- Version 0.8, 20.08.2011: Funktionen zur Ansteuerung der Hintergrundbeleuchtung hinzugefügt, Umstellung der Kommentare in den Quellen auf doxygen-Style, Doxygen-Dokumentation zur Webseite hinzugefügt
- Version 0.9, 11.09.2011: Bugfix in Funktion lcd_blpin_init()
Externe Informationsquellen
Anregungen oder weitere Informationen
Hier kann ein Kommentar hinterlassen werden: