A.H. schrieb:
> lcd_write_init(0x20,0); // B 0000 0010 => mit 8-Bit-Command in 4-Bit-Modus
umschalten
Dabei bekomm ich einen Fehler: Zu viele Argumente! Habe das ",0" mal
rausgelöscht.
Code ist jetzt:
/* LCD Include-Datei
*
* Das LCD ist folgendermaßen angeschlossen:
* PC4 = RS
* PC5 = Enable
* PC0-PC3 = D4-D7
* R/W ist n.c.
*
* 03/2005 Florian Schäffer, http://www.blafusel.de
*
*/
#include <avr/io.h>
#include <avr/delay.h>
#define delay(us) _delay_loop_2 (((F_CPU/4000)*us)/1000) // wartet
µs
void lcd_write_init(uint8_t data)
{
PORTC = (data>>4); // output high nibble only,(!) zzgl. Zustand
für RS-Leitung
lcd_flash_e ();
}
// Enable-Leitung toggeln
void lcd_flash_e ()
{
PORTC = PORTC | ( 1<<DDC5 ) ; // Enable = HIGH
delay(1); // kurz warten, damit Flanke entsteht
PORTC = PORTC & ~( 1<<DDC5 ) ; // Enable = LOW
delay(64); // Warten, bis der durch Enable angelegte
Befehl hoffentlich verarbeitet wurde
}
// Kommando oder Zeichen an Display senden: rs=0 => Kommando, rs=1 =>
Zeichen
void lcd_write (uint8_t data, uint8_t rs)
{
uint8_t dataBits ;
if (rs) // write data (RS=1, RW=0)
dataBits=0x10; // RS liegt an Pin 4 = B 0001 0000 = H 10
else // write instruction (RS=0, RW=0)
dataBits=0;
PORTC = dataBits |(data>>4); // output high nibble first, zzgl.
Zustand für RS-Leitung
lcd_flash_e ();
PORTC = dataBits | (data&0x0F); // output low nibble, zzgl.
RS-Leitung
lcd_flash_e ();
delay(2000);
}
// Display loeschen
void lcd_cls ()
{
lcd_write(0x02,0); // B 0000 0010 => Display loeschen
delay(2000); // dauert eine Weile, Wert ausprobiert
lcd_write(0x01,0); // B 0000 0001 => Cursor Home
delay(2000); // dauert eine Weile, Wert ausprobiert
}
// Zeichenausgabe
void lcd_writechar (uint8_t zeichen)
{
lcd_write (zeichen, 1);
}
// gibt eine Zeichenkette auf dem LCD aus
void lcd_writetext ( char *text)
{
uint8_t i = 0;
while (text[i]!=0)
{
lcd_writechar(text[i]);
i++;
}
}
// gibt eine int-Zahl auf dem Display aus. Zweiter Parameter = Anzahl
der Stellen (führende Leerzeichen),
// space=0 => führende Nullen, 1 => führende Leerzeichen
void lcd_writezahl (int32_t zahl, uint8_t pos, uint8_t spacer)
{
int32_t output;
char sign = '0';
pos--; // Korrektur des Parameters für Benutzerfreundlichkeit
if (spacer) sign=' ';
// negatives Vorzeichen oder Leerzeichen
if (zahl < 0)
{
lcd_writechar ('-');
zahl *= -1; // positive Zahl
}
output = zahl;
// Hunderttausender-Dezimalstelle oder Leerzeichen (Ausblenden
fuehrender Nullen)
if (zahl >= 100000) lcd_writechar (0x30 + output/100000); else if (pos
>= 5) lcd_writechar (sign);
output = output % 100000;
// Zehntausender-Dezimalstelle oder Leerzeichen (Ausblenden fuehrender
Nullen)
if (zahl >= 10000) lcd_writechar (0x30 + output/10000); else if (pos
>= 4) lcd_writechar (sign);
output = output % 10000;
// Tausender-Dezimalstelle oder Leerzeichen
if (zahl >= 1000) lcd_writechar (0x30 + output/1000); else if (pos >=
3) lcd_writechar (sign);
output = output % 1000;
// Hunderter-Dezimalstelle oder Leerzeichen
if (zahl >= 100) lcd_writechar (0x30 + output/100); else if (pos >= 2)
lcd_writechar (sign);
output = output % 100;
// Zehner-Dezimalstelle oder Leerzeichen
if (zahl >= 10) lcd_writechar (0x30 + output/10); else if (pos >= 1)
lcd_writechar (sign);
// einer Dezimalstelle oder Leerzeichen
lcd_writechar (0x30 + output % 10);
}
// Zeilenwechsel
void lcd_gotoline (uint8_t zeile)
{
if (zeile == 1) lcd_write(0x80,0); // B 1000 0000 => DD-RAM Adress
Set 1. Zeile/1.Spalte
if (zeile == 2) lcd_write(0xC0,0); // B 1100 0000 => DD-RAM Adress
Set 2. Zeile/1.Spalte (B x100 0000 = H 40)
}
// Cursorpositionieren (Zeile, Spalte)
void lcd_gotopos (uint8_t zeile, uint8_t spalte)
{
if (zeile == 1) lcd_write(0x80+spalte-1,0); // DD-RAM Adress 1.
Zeile + Spalte
if (zeile == 2) lcd_write(0xC0+spalte-1,0); // DD-RAM Adress 2.
Zeile + Spalte
}
// Portrichtung einstellen
void lcd_port_ini ()
{
DDRC = 0x3F; // setze Portrichtung (1 = Ausgang): 0011 1111
}
// Display initialisieren. Einmal als erstes aufrufen
void lcd_ini ()
{
lcd_port_ini();
PORTC=0x00; // alle Leitungen LOW
delay(16000); // 10ms warten bis LCD wirklich bereit (max. Wert lt.
Datenblatt)
lcd_write_init(0x30); // init 1
delay(4100);
lcd_write_init(0x30); // init 2
delay(100);
lcd_write_init(0x30); // init 3
delay(100);
lcd_write_init(0x20); // B 0000 0010 => mit 8-Bit-Command in
4-Bit-Modus umschalten
delay(1000); // sicherheitshalber warten
// ab jetzt 4-Bit-Modus
lcd_write(0x28,0); // B 0010 1000 => Function Set: 4Bit (kein
8-Bit Bus), zweizeiliges Display, 5x7 Dots/Zeichen (kein 5x10)
lcd_write(0x0C,0); // B 0000 1100 => Display On/Off: Display ein,
Cursor aus, Blinken aus (0c0C) Cursor an: 0x0E
lcd_write(0x06,0); // B 0000 0110 => Entry Mode Set: DD-RAM autom.
inkr., Cursor bewegen
lcd_cls(); // Display löschen
}