Teste mal den Code:
Code:
//---------------------------------------------------------------------------
// Titel : myAVR Beispiel "LCD Ausgabe auf einer Zeile" für den ATmega8/48/88/168
//---------------------------------------------------------------------------
// Funktion : gibt eine Zeichenkette auf dem myAVR LCD Modul, 1 Zeile
// Schaltung : PORTD.2 = RS, PORTD.3 = E, PORTD.4-7 = D4-7
//---------------------------------------------------------------------------
// Prozessor :
// Takt : 3.6864 MHz
// Sprache : C
// Datum : 09.11.2007
// Version : 1.0
// Autor : S. Hänsel
// Programmer : ...
// Port : ...
//----------------------------------------------------------------------
#define F_CPU 3686400
#include <avr\io.h>
#include <util\delay.h>
/////////////////////////////////////////////////////////////////////////////
// allgemeine-Funktionen
//---------------------------------------------------------------------------
// waitMs(..) - Wartet einige Millisekunden
// Die Dauer ist nicht kalibriert.
// PE: miliSec=Anzahl der zu wartenden Millisekunden
//---------------------------------------------------------------------------
void waitMs(int miliSec)
{
_delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec); // 4 Zyklen warteschleife
}
void waitUs(int mikroSec)
{
_delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec); // 4 Zyklen warteschleife
}
//////////////////////////////////////////////////////////////////////////////
// LCD-Funktionen für myAVR-Board + myAVR-LCD
// 4-BitModus an PortD Bit 4-7
// PortD Bit 2 = RS, high=Daten, low=Kommando
// PortD Bit 3 = E, high-Impuls für gültige Daten
//---------------------------------------------------------------------------
// lcdSend(..) - sendet ein Byte an LCD im 4-Bit-Modus
// RS muss vorher richtig gesetzt sein
// PE: data=zu sendendes Byte
//---------------------------------------------------------------------------
void lcdSend(char data)
{
// aktuelles RS ermitteln
char rs=PORTD;
rs&=4;
// High-Teil senden
char tmp=data;
tmp&=0xf0;
tmp|=rs;
PORTD=tmp;
// Schreibsignal
sbi(PORTD,3);
cbi(PORTD,3);
// Low-Teil senden
tmp=data;
tmp&=0x0f;
tmp*=16;
tmp|=rs;
PORTD=tmp;
// Schreibsignal
sbi(PORTD,3);
cbi(PORTD,3);
// verarbeiten lassen
waitMs(1);
}
//---------------------------------------------------------------------------
// lcdCmd(..) - sendet ein Kommando an LCD
// PE: cmd=Kommando-Byte
//---------------------------------------------------------------------------
void lcdCmd(char cmd)
{
cbi(PORTD,2); // RS löschen = Kommando
lcdSend(cmd); // senden
}
//---------------------------------------------------------------------------
// lcdWrite(..) - sendet ein Zeichen (Daten) an LCD
// PE: text=Zeichen
//---------------------------------------------------------------------------
void lcdWrite(char text)
{
sbi(PORTD,2); // RS setzen = Daten
lcdSend(text); // senden
}
//---------------------------------------------------------------------------
// lcdWrite(..) - sendet eine Zeichenkette an LCD
// Die Zeichenkette muss mit 0x00 abgeschlossen sein
// PE: pText=Zeiger auf Zeichenkette
//---------------------------------------------------------------------------
void lcdWrite(char* pText)
{
while(pText[0]!=0)
{
lcdWrite(pText[0]);
pText++;
}
}
//---------------------------------------------------------------------------
// lcdWrite(..) - sendet eine Zeichenkette an LCD
// PE: pText=Zeiger auf Zeichenkette
// count=Anzahl der zu sendenden Zeichen
//---------------------------------------------------------------------------
void lcdWrite(char* pText, int count)
{
while(count!=0)
{
lcdWrite(pText[0]);
pText++;
count--;
}
}
//---------------------------------------------------------------------------
// lcdHome(..) - Cursor auf Position 1,1
//---------------------------------------------------------------------------
void lcdHome()
{
lcdCmd(0x02);
waitMs(2); // warten
}
//---------------------------------------------------------------------------
// lcdClear(..) - löscht die Anzeige im LCD
//---------------------------------------------------------------------------
void lcdClear()
{
lcdCmd(0x01);
waitMs(2); // warten
}
//---------------------------------------------------------------------------
// lcdOn(..) - schaltet das LCD an
//---------------------------------------------------------------------------
void lcdOn()
{
lcdCmd(0x0E);
}
//---------------------------------------------------------------------------
// lcdOff(..) - schaltet das LCD aus
//---------------------------------------------------------------------------
void lcdOff()
{
lcdCmd(0x08);
}
//---------------------------------------------------------------------------
// lcdGoto(..) - setzt die Cursorposition
// PE: row = Zeile 1..2
// col = Spalte 1..16
//---------------------------------------------------------------------------
void lcdGoto(int row, int col)
{
row--; // Null-basierend
row&=0x01; // sicherheitshalber
row*=0x40; // Zeile nach Bit 6 bringen
col--; // Null-basierend
col&=0x0f; // sicherheitshalber
char tmp=row|col;
tmp|=0x80; // Cursor setzen
lcdCmd(tmp); // senden
}
//---------------------------------------------------------------------------
// lcdInit(..) - Schaltet die Ports und Initialisiert das LCD
//---------------------------------------------------------------------------
void lcdInit()
{
// Port D = Ausgang
DDRD=0xff;
PORTD=0;
// warten bist LCD-Controller gebootet
waitMs(50);
// SOFT-RESET
PORTD = 0x30; //0b00110000;
sbi(PORTD,3);
cbi(PORTD,3);
waitMs(5);
PORTD = 0x30; //0b00110000;
sbi(PORTD,3);
cbi(PORTD,3);
waitUs(100);
PORTD = 0x30; //0b00110000;
sbi(PORTD,3);
cbi(PORTD,3);
waitMs(5);
// 4-BitModus einschalten
PORTD=0x20;
// Schreibsignal
sbi(PORTD,3);
cbi(PORTD,3);
waitMs(5);
// ab hier im 4-Bit-Modus
lcdCmd(0x28); // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
//lcdOff();
lcdCmd(0x06); // Entry Mode
lcdOn();
lcdClear();
}
//---------------------------------------------------------------------------
// Main-Funktion
//---------------------------------------------------------------------------
int main (void)
{
waitMs(200);
lcdInit();
lcdGoto(1,1);
lcdWrite("Hallo myAVR!");
while (1) { } // Mainloop
return 0;
}
//---------------------------------------------------------------------------
Lesezeichen