Danke für die Antworten.

Hier mal mein code/beschaltung.
Kontakte hab ich alle durchgetestet.

Klicke auf die Grafik für eine größere Ansicht

Name:	lcd_xmega.JPG
Hits:	8
Größe:	42,1 KB
ID:	22272

Code:
#define DATA_PORT PORTA
#define LCD_RS IOPORT_CREATE_PIN(PORTB,2)		
#define LCD_E  IOPORT_CREATE_PIN(PORTB,0)		
#define LCD_RW IOPORT_CREATE_PIN(PORTB,1)
#define P_DB0 IOPORT_CREATE_PIN(PORTA,0)
#define P_DB1 IOPORT_CREATE_PIN(PORTA,1)
#define P_DB2 IOPORT_CREATE_PIN(PORTA,2)
#define P_DB3 IOPORT_CREATE_PIN(PORTA,3)
#define P_DB4 IOPORT_CREATE_PIN(PORTA,4)
#define P_DB5 IOPORT_CREATE_PIN(PORTA,5)
#define P_DB6 IOPORT_CREATE_PIN(PORTA,6)
#define P_DB7 IOPORT_CREATE_PIN(PORTA,7)

void lcd_set_write_instruction();
void lcd_set_write_data();
void lcd_write_byte (char c);
void lcd_clear_and_home();
void lcd_home();
void lcd_goto(uint8_t line, uint8_t pos);
void lcd_line_one();
void lcd_line_two();
void lcd_write_data(char c);
void lcd_write_string(char *x, uint8_t len );
void lcd_write_string_0(char *x);
void lcd_write_string_p(const char *s);
void lcd_init();
void lcd_set_on_off(uint8_t state);
void lcd_write_inst(uint8_t cmd);




	
//this function is directly called from main
//it init the display and trys to print some test chars. The result is only a blinking cursor that moves
void lcd_init()
{

		ioport_configure_pin(LCD_E, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
		ioport_configure_pin(LCD_RS, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
		ioport_configure_pin(LCD_RW, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
		
		ioport_configure_pin(P_DB0, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
		ioport_configure_pin(P_DB1, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
		ioport_configure_pin(P_DB2, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
		ioport_configure_pin(P_DB3, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
		ioport_configure_pin(P_DB4, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
		ioport_configure_pin(P_DB5, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
		ioport_configure_pin(P_DB6, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
		ioport_configure_pin(P_DB7, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT); 
	// Now do the actual LCD initialisations
 
	// startup delay - make it long to allow time for power to settle
	// (you want wish to remove this line)
	_delay_ms(250);
 
	// LCD display initialisation by instruction magic sequence
	lcd_set_write_instruction();
	lcd_write_inst(0x38);			// function set
	_delay_ms(100);
	lcd_write_inst(0x08);			// display on/off control
	_delay_ms(100);
	lcd_write_inst(0x01);			// display clear
	_delay_ms(100);
	lcd_write_inst(0x06);			// entry mode set
	_delay_ms(100);
	lcd_write_inst(0x02);
	_delay_ms(100);
	lcd_write_inst(0x0F);			
	_delay_ms(100);
	lcd_write_inst(0x0F);			
	_delay_ms(100);
	lcd_write_inst(0x39);			
	_delay_ms(100);

lcd_write_inst(0x80);	

	lcd_write_data('A');
	lcd_write_data('B');
	lcd_write_data('C');
	lcd_write_data('D');
	lcd_write_data('E');


 _delay_ms(100);


}



 void lcd_set_on_off(uint8_t state)
 {
	 lcd_set_write_instruction();
	 if(state==1)
	 {
		 lcd_write_byte(0x0F);
	 }
	 if(state==0)
	 {
		 lcd_write_byte(0x08);
	 }
	
 }
 
// This function clears the RS line to write a command
void lcd_set_write_instruction()
 {
	ioport_set_pin_low(LCD_RS);		// set RS line low 
	_delay_ms(1);
}
 
 
// This function sets the RS line to write data
void lcd_set_write_data()
 {
	ioport_set_pin_high(LCD_RS);		// set RS line high
	_delay_ms(1);
	
}
 


 
// This function writes a byte to the LCD
void lcd_write_byte (char c)
 {
	 ioport_set_pin_low(LCD_RW);
int output[CHAR_BIT];
int i;
for (i = 0; i < CHAR_BIT; ++i)
 {
  output[i] = (c >> i) & 1;
}
//manual approach
if(output[0]==1)
{
	ioport_set_pin_high(P_DB0);
}
else
{
	ioport_set_pin_low(P_DB0);
}
if(output[1]==1)
{
	ioport_set_pin_high(P_DB1);
}
else
{
	ioport_set_pin_low(P_DB1);
}
if(output[2]==1)
{
	ioport_set_pin_high(P_DB2);
}
else
{
	ioport_set_pin_low(P_DB2);
}
if(output[3]==1)
{
	ioport_set_pin_high(P_DB3);
}
else
{
	ioport_set_pin_low(P_DB3);
}
if(output[4]==1)
{
	ioport_set_pin_high(P_DB4);
}
else
{
	ioport_set_pin_low(P_DB4);
}
if(output[5]==1)
{
	ioport_set_pin_high(P_DB5);
}
else
{
	ioport_set_pin_low(P_DB5);
}
if(output[6]==1)
{
	ioport_set_pin_high(P_DB6);
}
else
{
	ioport_set_pin_low(P_DB6);
}
if(output[7]==1)
{
	ioport_set_pin_high(P_DB7);
}
else
{
	ioport_set_pin_low(P_DB7);
}
_delay_us(100);
	
	//DATA_PORT.OUT = c;			// Place data on Data Port
	ioport_set_pin_high(LCD_E);		// set E line high
	_delay_us(100);
	ioport_set_pin_low(LCD_E);		// set E line low to latch data into LCD
	_delay_ms(1);
}
 
 
// This function clears LCD and sets address to beginning of first line
void lcd_clear_and_home()
 {
	lcd_set_write_instruction();
	lcd_write_byte(0x01);
	_delay_ms(2);
	lcd_write_byte(0x02);
	_delay_ms(1);
 } 
 
// This function sets address to beginning of first line
void lcd_home()
{
	lcd_set_write_instruction();
	lcd_write_byte(0x02);
	_delay_ms(1);
}
 
 
// This function moves cursor to a given line and position
//  line is either 0 (first line) or 1 (second line)
//  pos is the character position from 0 to 15.
void lcd_goto(uint8_t line, uint8_t pos)
{
	uint8_t position = 0;
 
	lcd_set_write_instruction();
	switch(line)
	{
		case 0: position = 0;
		break;
		case 1: position = 0x40;
		break;
	}
		lcd_write_byte(0x80 | (position + pos));
}
 
 
// This function moves the cursor to 1st character of 1st line
void lcd_line_one() { lcd_goto(0, 0); }
 
 
// This function moves the cursor to 1st character if 2nd line
void lcd_line_two() { lcd_goto(1, 0); }
 
 
// This function writes a character to the LCD
void lcd_write_data(char c)
{
	//ioport_set_pin_high(P_LED2);
	lcd_set_write_data();
	lcd_write_byte(c);
//	lcd_write_inst(0x14);
	//ioport_set_pin_low(P_LED2);
}
 
void lcd_write_inst(uint8_t cmd)
{
	lcd_set_write_instruction();
	lcd_write_byte(cmd);
}
 
// This function writes a string (in SRAM) of given length to the LCD
void lcd_write_string(char *x, uint8_t len )
{
	while (--len > 0)
		lcd_write_data(*x++);
}
 
 
// This function writes a null-terminated string (in SRAM) to the LCD
void lcd_write_string_0(char *x)
{
	while (*x)
		lcd_write_data(*x++);
}
 
 
// Same as above, but the string is located in program memory,
//  so "lpm" instructions are needed to fetch it, and a \0
//  must be defined at the end of the string to terminate it.
void lcd_write_string_p(const char *s)
{
	char c;
 
	for (c = pgm_read_byte(s); c; ++s, c = pgm_read_byte(s))
		lcd_write_data(c);
}