Following is my code #include <avr/io.h> #include <util/delay.h> #define Delay_ms(x) _delay_ms(x) #define RS 1 //PC0 #define RW 1 //PC1 #define EN 2 //PC2 void lcd_cmnd(unsigned char); void lcd_data(unsigned char dta); int main() { DDRC=0xff; DDRD=0xff; lcd_cmnd(0x38); //sets 8-bit interacing Delay_ms(1); lcd_cmnd(0x0e); //display on Delay_ms(1); lcd_cmnd(0x08); //display off Delay_ms(1); lcd_cmnd(0x01); //clears screen Delay_ms(1); lcd_cmnd(0b00000000); lcd_cmnd(0x06); //Entry Mode, Increment cursor position, No display shift lcd_data('N'); Delay_ms(250); lcd_data('a'); Delay_ms(25); lcd_data('s'); Delay_ms(25); lcd_data('i'); Delay_ms(25); lcd_data('r'); Delay_ms(25); return 0; } void lcd_cmnd(unsigned char cmd) { PORTD=cmd; PORTC=(0<<RS); //command mode PC0=RS(low) PORTC|=(0<<RW); // read mode PC1=RW PORTC=(1<<EN); // enable high PC2=EN Delay_ms(1); PORTC=(0<<EN); //enable low Delay_ms(50); } void lcd_data(unsigned char dta) { PORTC|=(0<<RW); //PC1=RW (low) PORTC|=(1<<0); //DATA mode PC0=RS PORTD=dta; PORTC=(1<<EN); //enable high PC2=EN Delay_ms(1); PORTC=(0<<EN); //enable low Delay_ms(50); } It executes well, the simulation in <a href="http://www.labcenter.com/products/vsm/avr.cfm">proteus</a> runs but the cursor just blinks and nothing is displayed. I don't know why. Following is other code which runs and displays on the LCD "Hello World!" #include <avr/io.h> #include <stdlib.h> #include <util/delay.h> #include <stdio.h> //Define functions //========================================================== void io_init(void); //Initializes IO void send_nibble(unsigned char __rs, unsigned char __data); //========================================================== int main (void) { io_init(); _delay_ms(15); send_nibble(0,0b0010); //Set to 4 bit operation (note: 1 nibble operation) _delay_ms(5); send_nibble(0,0b0010); //Function set, 4 bit send_nibble(0,0x08); //display off, cursor off send_nibble(0,0b0000); send_nibble(0,0b1111); //Display ON, Cursor On, Cursor Blinking send_nibble(0,0b0000); send_nibble(0,0b0001); //Clear Display send_nibble(0,0b0000); send_nibble(0,0x06); //Entry Mode, Increment cursor position, No display shift send_nibble(1,0b0100); //H send_nibble(1,0b1000); send_nibble(1,0b0110); //e send_nibble(1,0b0101); send_nibble(1,0b0110); //l send_nibble(1,0b1100); send_nibble(1,0b0110); //l send_nibble(1,0b1100); send_nibble(1,0b0110); //o send_nibble(1,0b1111); send_nibble(1,0b0010); //Space send_nibble(1,0b0000); send_nibble(1,0b0101); //w send_nibble(1,0b0111); send_nibble(1,0b0110); //o send_nibble(1,0b1111); send_nibble(1,0b0111); //r send_nibble(1,0b0010); send_nibble(1,0b0110); //l send_nibble(1,0b1100); send_nibble(1,0b0110); //d send_nibble(1,0b0100); return(0); } void io_init (void) { /* PC 7: N/A PC 6: Reset PC 5: Enable PC 4: Register Select PC 3: Data 7 PC 2: Data 6 PC 1: Data 5 PC 0: Data 4 */ DDRC = 0b00111111; //63 } void send_nibble(unsigned char __rs, unsigned char __data) { PORTC = (__rs<<4) | __data | 0b00100000; // Set RS & Data. Set EN=High _delay_ms(1); PORTC = (__rs<<4) | __data; // Set RS & Data. Set EN=Low _delay_ms(1); } I tried to proceed in the same order but in vain. I am stuck in learning the LCD programming for last 10 days. Any healthy and effective help is appreciated in advance!