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;
}
//---------------------------------------------------------------------------