Ich habe vor ca. einem Monat ( ~ Mitte Oktober ) ein 2x16 LCD Display geschenkt bekommen ( siehe Abb.1 ). Nun wollte ich natürlich unbedingt das Teil auch ausprobieren. Allerdings hatte ich so meine Startschwierigkeiten, weswegen ich es erst vor wenigen Tagen geschafft habe.
Problem:
Die Anschlussbelegung ( s. Abb.2 ):
Es gibt viele Tutorials, in denen gezeigt wird, wie man so ein LCD Display mit einem Standart Controller anschließt und auch ansteuert. Manche Tutorials sind allerdings unverständlich und auch manchmal falsch, was bei der Anschlussbelegung ( also wie man die 16 Pins des Displays anschließt ) zur Folge hat, dass nichts funktioniert.
Im AVR-GCC Tutorial von mikrocontroller.net habe ich allerdings ein gutes und funktionierendes Tutorial mit Code gefunden. Zum Tutorial
Anschlussbelegung bei einem LCD Display mit dem HD44780-Controller:
Abb.2: Belegung der Pins.
Abb.3: So sieht das ganze verkabelt aus.
Pin #-LCD
Bezeichnung-LCD
Pin-µC
1
Vss
GND
2
Vcc
VCC
3
Vee
mit 330 OHM Wiederstand an GND
4
RS
PD4
5
RW
GND
6
E
PD5
7
DB0
offen (unbenutzt)
8
DB1
9
DB2
10
DB3
11
DB4
PD0 am AVR
12
DB5
PD1 am AVR
13
DB6
PD2 am AVR
14
DB7
PD3 am AVR
15
LED - Beleuchtung: -
VCC
16
LED - Beleuchtung: +
PB7
Abb.4: Mit Pollin-Board von oben.
Programmieren mit C:
Zum Programmieren habe ich die Headerdatei lcd-routines.h, sowie die lcd-routines.c Datei vom Tutorial genommen, da diese gut funktioniert und einfach zu benutzen ist. Danach musste ich die .c Datei noch compilieren, aber das geht mit ProgrammersNotepad2 ( aus WIN-AVR Paket ) ja ganz schnell.
Nach anfänglichen Schwierigkeiten auch auf Seiten des Programmtextes gibts hier nun den fertigen Code.
Abb.5: Steckbrett mit LCD-Display.
//
// Anpassungen im makefile:
// lcd-routines.c in SRC = ... Zeile ANHÄNGEN
//
#include <avr/io.h>
#include <util/delay.h>
#include "lcd-routines.h"
int main(void)
{
DDRB |= 1 << PORTB7;
// Initialisierung des LCD
// Nach der Initialisierung müssen auf dem LCD
vorhandene schwarze Balken
// verschwunden sein
lcd_init();
PORTD ^= 1 << PORTD7;
int i = 0;
while(1)
{
PORTD ^= 1 << PORTD7;
_delay_us(i);
}
return 0;
}
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/HD44780
//
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
//
// Die Pinbelegung ist über defines in lcd-routines.h
einstellbar
////////////////////////////////////////////////////////////////////////////////
// Sendet eine 4-bit Ausgabeoperation an das LCD
static void lcd_out( uint8_t data )
{
data &=
0xF0;
// obere 4 Bit maskieren
////////////////////////////////////////////////////////////////////////////////
// Sendet ein Datenbyte an das LCD
void lcd_data( uint8_t data )
{
LCD_PORT |= (1<<LCD_RS);
// RS auf 1 setzen
lcd_out( data
);
// zuerst die oberen,
lcd_out( data<<4
); // dann die
unteren 4 Bit senden
_delay_us( LCD_WRITEDATA_US );
}
////////////////////////////////////////////////////////////////////////////////
// Sendet einen Befehl an das LCD
void lcd_command( uint8_t data )
{
LCD_PORT &=
~(1<<LCD_RS); // RS auf 0 setzen
lcd_out( data
);
// zuerst die oberen,
lcd_out( data<<4
); //
dann die unteren 4 Bit senden
_delay_us( LCD_COMMAND_US );
}
////////////////////////////////////////////////////////////////////////////////
// Sendet den Befehl zur Löschung des Displays
void lcd_clear( void )
{
lcd_command( LCD_CLEAR_DISPLAY );
_delay_ms( LCD_CLEAR_DISPLAY_MS );
}
////////////////////////////////////////////////////////////////////////////////
// Sendet den Befehl: Cursor Home
void lcd_home( void )
{
lcd_command( LCD_CURSOR_HOME );
_delay_ms( LCD_CURSOR_HOME_MS );
}
////////////////////////////////////////////////////////////////////////////////
// Setzt den Cursor in Spalte x (0..15) Zeile y (1..4)
void lcd_setcursor( uint8_t x, uint8_t y )
{
uint8_t data;
switch (y)
{
case 1:
// 1. Zeile
data = LCD_SET_DDADR + LCD_DDADR_LINE1 + x;
break;
case 2:
// 2. Zeile
data = LCD_SET_DDADR + LCD_DDADR_LINE2 + x;
break;
case 3:
// 3. Zeile
data = LCD_SET_DDADR + LCD_DDADR_LINE3 + x;
break;
case 4:
// 4. Zeile
data = LCD_SET_DDADR + LCD_DDADR_LINE4 + x;
break;
default:
return;
// für den Fall einer falschen Zeile
}
lcd_command( data );
}
////////////////////////////////////////////////////////////////////////////////
// Schreibt einen String auf das LCD
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
//
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
//
#ifndef LCD_ROUTINES_H
#define LCD_ROUTINES_H
////////////////////////////////////////////////////////////////////////////////
// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!
#ifndef F_CPU
#define F_CPU 3686400
#endif
////////////////////////////////////////////////////////////////////////////////
// Pinbelegung für das LCD, an verwendete Pins anpassen
// Alle LCD Pins müssen an einem Port angeschlossen sein und
die 4
// Datenleitungen müssen auf aufeinanderfolgenden Pins liegen
////////////////////////////////////////////////////////////////////////////////
// Zeilendefinitionen des verwendeten LCD
// Die Einträge hier sollten für ein LCD mit einer
Zeilenlänge von 16 Zeichen passen
// Bei anderen Zeilenlängen müssen diese Einträge
angepasst werden
////////////////////////////////////////////////////////////////////////////////
// Initialisierung: muss ganz am Anfang des Programms aufgerufen
werden.
void lcd_init( void );
////////////////////////////////////////////////////////////////////////////////
// Cursor in die 1. Zeile, 0-te Spalte
void lcd_home( void );
////////////////////////////////////////////////////////////////////////////////
// Cursor an eine beliebige Position
void lcd_setcursor( uint8_t spalte, uint8_t zeile );
////////////////////////////////////////////////////////////////////////////////
// Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition
void lcd_data( uint8_t data );
////////////////////////////////////////////////////////////////////////////////
// Ausgabe eines Strings an der aktuellen Cursorposition
void lcd_string( const char *data );
////////////////////////////////////////////////////////////////////////////////
// Definition eines benutzerdefinierten Sonderzeichens.
// data muss auf ein Array[8] mit den Zeilencodes des zu
definierenden Zeichens
// zeigen
void lcd_generatechar( uint8_t code, const uint8_t *data );
////////////////////////////////////////////////////////////////////////////////
// Ausgabe eines Kommandos an das LCD.
void lcd_command( uint8_t data );
////////////////////////////////////////////////////////////////////////////////
// LCD Befehle und Argumente.
// Zur Verwendung in lcd_command
// Set DD RAM Address --------- 0b1xxxxxxx (Display Data RAM)
#define
LCD_SET_DDADR
0x80
#endif
Download als .zip
( Die Makefile-Datei muss natürlich an den Mikrocontroller, den ihr habd angepasst werden. UND die lcd-routines.c muss eingetragen werden -> s.u. )
LCD-Routines.c in Makefile eintragen:
1.) Makefile mit MFile o.ä. öffnen. 1.1) Wenn ihr MFile nutzt: Unter dem Menüpunkt "Makefile" den Punkt "Enable Editing of Makefile" aktivieren. 2.) Unter SRC = ... folgenes ändern: Normal steht dort: SRC = $(TARGET).c
Ihr Schreibt hin: SRC = $(TARGET).c lcd-routines.c 3.) Speichern und fertig
Das wars auch schon wieder. Ich hoffe ich konnte euch ein paar Interessante Dinge zeigen und/oder euch beibringen. Ich werde gucken, was ich dem nächst mache. Schriebt doch mal in die Kommentare, was ihr gerne wissen wollt, oder interessant fändet. Ich freue mich für alle möglichen Antworten ;)
Keine Kommentare:
Kommentar veröffentlichen