Hallo

habe zusätzlich die freien Daatenleitungen auf GND gesetzt
Das würde ich nicht machen. Wenn das LCD, aus welchen Gründen auch immer, hier etwas ausgeben möchte, knallt´s! Ist eigentlich r/w mit GND verbunden?

Ein 4x20-LCD an meinem RP6 (auch ein Mega32):

https://www.roboternetz.de/phpBB2/ze...ag.php?t=41805

Der Code (hoffentlich richtig an deine Belegung angepasst):

Code:
 // LCD 20x4 (LMC-SSC4A20) an den PC0-3, PC5 und PC7               10.2.2011 mic

// 4-Bit-Ansteuerung ohne busy-Abfrage:

// 1 - GND - GND
// 2 - Vcc - Vcc
// 3 - Kontrast (0-0,5V)
// 4 - RS - PC7
// 5 - R/W - GND
// 6 - E - PC5
// 7 - nc
// 8 - nc
// 9 - nc
// 10 - nc
// 11 - Data4 - PC0
// 12 - Data5 - PC1
// 13 - Data6 - PC2
// 14 - Data7 - PC3
// 15 - A - Vcc
// 16 - K - GND

#include <avr/io.h>
#include <util/delay.h>

#define demospeed 50

#define d4h	(PORTC|=1)
#define d4l	(PORTC&=~1)
#define d5h	(PORTC|=2)
#define d5l (PORTC&=~2)
#define d6h (PORTC|=4)
#define d6l (PORTC&=~4)
#define d7h (PORTC|=8)
#define d7l (PORTC&=~8)
#define eh  (PORTC|=32)
#define el  (PORTC&=~32)
#define rsh (PORTC|=128)
#define rsl (PORTC&=~128)

void strobe(void)
{
   eh;
   _delay_ms(1);
   el;
}
void lcd_write8(uint8_t wert, uint8_t pause)
{
   if(wert & 16) d4h; else d4l;
   if(wert & 32) d5h; else d5l;
   if(wert & 64) d6h; else d6l;
   if(wert & 128) d7h; else d7l;
   strobe();
   _delay_ms(pause);
}
void lcd_write4(uint8_t wert, uint8_t pause)
{
   if(wert & 16) d4h; else d4l; // high nipple
   if(wert & 32) d5h; else d5l;
   if(wert & 64) d6h; else d6l;
   if(wert & 128) d7h; else d7l;
   strobe();
   _delay_ms(pause);
   if(wert & 1) d4h; else d4l; // low nipple
   if(wert & 2) d5h; else d5l;
   if(wert & 4) d6h; else d6l;
   if(wert & 8) d7h; else d7l;
   strobe();
   _delay_ms(pause);
}
void lcd_cls(void)
{
   rsl;
      lcd_write4(1,2);
   rsh;
}
void lcd_locate(uint8_t x, uint8_t y)
{
   rsl;
   switch (y) {
      case 0: lcd_write4(0x80+x, 40); break;    // 0. Zeile
      case 1: lcd_write4(0xc0+x, 40); break;    // 1. Zeile
      case 2: lcd_write4(0x94+x, 40); break;    // 2. Zeile
      case 3: lcd_write4(0xd4+x, 40); break;    // 3. Zeile
   }
   rsh;
}
void lcd_writeChar(uint8_t zeichen)
{
   lcd_write4(zeichen,1);
}
void lcd_writeString(char *string)
{
   while(*string)
      lcd_writeChar(*string++);
}
void lcd_init(void)
{
   DDRC |= 0b10101111;
   PORTC &= ~0b10101111;

   rsl;
   _delay_ms(100);
   lcd_write8(0b00100000,100);   // Function Set: 4bit-Modus starten
   lcd_write4(0b00101000,40);      // Function Set: 2 Zeilen, Font 0 (0010NFxx)
   lcd_write4(0b00000001,40);      // Display Clear
   lcd_write4(0b00000110,40);      // Entry Mode Set: inc, no shift
   lcd_write4(0b00001100,40);      // Display On and Cursor
   //lcd_write4(0b00001111,40);   // Display On and Cursor
   rsh;
   _delay_ms(1);
}
int main(void)
{
   uint8_t i;                    // Hilfsvariable
   lcd_init();                   // lcd initialisieren

   lcd_cls();                    // Display löschen
   lcd_locate(0,0);              // Schreibpositon festlegen
   for(i=0; i<20; i++) {lcd_writeChar('*'); _delay_ms(demospeed); }
   lcd_locate(0,1);
   for(i=0; i<20; i++) {lcd_writeChar('a'+i); _delay_ms(demospeed/2); }
   lcd_locate(0,2);
   for(i=0; i<20; i++) {lcd_writeChar('A'+i); _delay_ms(demospeed/3); }
   lcd_locate(0,3);
   for(i=0; i<10; i++) {lcd_writeChar('0'+i); _delay_ms(demospeed/4); }
   for(i=0; i<10; i++) {lcd_writeChar('0'+i); _delay_ms(demospeed/4); }

   _delay_ms(2000);
   lcd_cls();
   lcd_locate(2,0);
   lcd_writeString("RP6 ROBOT SYSTEM");
   lcd_locate(0,2);
   lcd_writeString("LC-Display an LED1-6");
   lcd_locate(9,3);
   lcd_writeString("16.7.08 mic");

   while(1){
   }
   return 0;
}
Vielleicht hilf dir das?

btw. verwende ich fünf der sechs Datenleitungen gleichzeitig auch zum Einlesen von fünf Tastern ;)

Poste mal dein aktuelles Programm... (bitte in Code-Tags)

Gruß

mic