If writing 8 bits is the problem then a write nibble function should solve it,
Code:
[COLOR="Blue"]void LCD_nibble(unsigned char nibble){
LCD_CTRL_PORT &= ~(1<<LCD_rs);
LCD_DATA_PORT = (nibble & 0xF0)|(LCD_DATA_PORT & 0x0F);
LCD_enable();
}[/COLOR]
void LCD_init()
{
//initialize LCD control lines
LCD_CTRL_PORT &= ~(1<<LCD_rs); // RS low
LCD_CTRL_PORT &= ~(1<<LCD_rw); // R/W low
LCD_CTRL_PORT &= ~(1<<LCD_en); // E low
// initialize LCD control lines to output
LCD_CTRL_DDR |= (1<<LCD_rs);
LCD_CTRL_DDR |= (1<<LCD_rw);
LCD_CTRL_DDR |= (1<<LCD_en);
// initialize LCD data port to input
LCD_DATA_DDR |= 0xF0;// Data on high four bits of port
[COLOR="blue"] _delay_ms(15); //start of required sequnce
LCD_nibble(0x30);
_delay_ms(5);
LCD_nibble(0x30);
_delay_ms(1);
LCD_nibble(0x30);
_delay_ms(1);
LCD_nibble(0x20); //switch to 4 bit mode[/COLOR]
LCD_start();
LCD_function_set();
_delay_us(40);
LCD_display_off();
_delay_us(40);
LCD_display_clear();
_delay_ms(2);
LCD_mode_set();
LCD_display_on();
}
The blue bits are the changes from your original code.
Mike.