INTERFACING OF LCD WITH ATMEGA32 AVR MICROCONTROLLER.In this article you will learn what LCD is and how to interface LCD with AVR microcontroller Atmega32 using 8-bit mode. What is the basic difference between 8-bit mode and 4-bit mode? How to write code for LCD interfacing in C language and what are the basic commands used for LCD programming. Here we will also learn how to program LCD and sends command/ data to LCD.
WHAT IS LCD?
LCD stands for Liquid Crystal Display, is an electronic device which is used for data display. LCDs are preferable over seven segments and LEDs as they can easily represent data in form of alphabets, characters, numbers or animations. LCDs are very easy to program and make your work quite attractive and simple. Numerous types of LCDs are available in market such as 16X2, 16X4, 20X2, 20X4, graphical LCDs (128X64) etc. The LCD which we are using is 16X2 alphanumeric LCD, it display 32 characters in two rows means in one row we have 16 characters.
PIN DESCRIPTION OF LCD
16X2 LCD can interface with AVR microcontroller by using two modes, 4-bit mode or 8-bit mode. In this article we will use 8-bit mode for interfacing. In 8-bit mode we send command to LCD by using eight data lines (D0-D7) while in 4-bit mode we use four data lines (D5-D7) for sending command and data. These data lines can be connected to any port of Atmega32.
PIN NO. | PIN NAME | DESCRIPTION |
1 | VCC | Supply pin (+5V DC) |
2 | VDD | Ground pin |
3 | VEE | Contrast pin |
4 | RS | Register selection pin (either data or command)RS=0: Command Register ,
RS=1: Data Register |
5 | RW | Selects Read or Write operationRW=0: for write
RW=1:Â for read |
6 | E | Enable pin |
7 | D0 | Data pin 0 |
8 | D1 | Data pin 1 |
9 | D2 | Data pin 2 |
10 | D3 | Data pin 3 |
11 | D4 | Data pin 4 |
12 | D5 | Data pin 5 |
13 | D6 | Data pin 6 |
14 | D7 | Data pin 7 |
Â
HOW TO PROGRAM LCD?
Basically there are two registers, command and data. When we are giving command to LCD, we select command register and when we are sending data to LCD for display, we select data register. Command is an instruction given to LCD in order to perform required function according to the given command. In order to display textual information, data is send to LCD.
SENDING COMMANDS ON LCD
For sending commands on LCD we have to write command on data pins. For this, selects:
RS = 0 >> selects command register
RW = 0 >> selects write operation
E >> make enable pin from high to low
SENDING DATA ON LCD
For sending data on LCD we have to write data on data pins. For this, selects:
RS = 1 >> selects data register
RW = 0 >> selects write operation
E >> make enable pin from high to low
SCHEMATIC
We design our circuit on proteus. Circuit diagram is given below:

CODE FOR INTERFACING LCD
We use Atmel studio 6 for development of code and the code is written in C language.
#ifndef F_CPU
# define F_CPU 16000000UL // clock speed is 16MHz
#endif
#include<avr/io.h>Â Â Â Â Â Â Â // AVR header
#include<util/delay.h>Â Â Â // delay header
//******************LCD PROGRAM STARTS*********************//
#define LCD_DATA PORTBÂ Â Â Â Â Â Â Â Â // port B is selected as LCD data port
#define ctrl PORTDÂ Â Â Â Â Â Â Â Â Â Â Â Â //Â port D is selected as LCD command port
#define en PD7Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â // enable signal is connected to port D pin 7
#define rw PD6Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â // read/write signal is connected to port D pin 6
#define rs PD5Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â // register select signal is connected to port D pin 5
void LCD_cmd(unsigned char cmd);
void init_LCD(void);
void LCD_write(unsigned char data);
int main(void)
{
DDRB=0xFF;Â Â Â Â Â Â Â Â Â Â Â Â Â // set LCD data port as output
DDRD=0xE0;Â Â Â Â Â Â Â Â Â Â Â Â Â // set LCD signals (RS, RW, E) as out put
init_LCD();Â Â Â Â Â Â Â Â Â Â Â Â // initialize LCD
_delay_ms(100);Â Â Â Â Â Â Â Â // delay of 100 Milli seconds
LCD_cmd(0x0C);Â Â Â Â Â Â Â Â Â // display on, cursor off
_delay_ms(100);
LCD_write(‘ ‘);Â Â Â Â Â Â Â Â // call a function to display space on LCD
_delay_ms(1);
LCD_write(‘ ‘);Â Â Â Â Â Â Â Â // call a function to display space on LCD
_delay_ms(1);
LCD_write(‘ ‘);Â Â Â Â Â Â Â Â // call a function to display space on LCD
_delay_ms(1);
LCD_write(‘ ‘);Â Â Â Â Â Â Â Â // call a function to display space on LCD
_delay_ms(1);
LCD_write(‘ ‘);Â Â Â Â Â Â Â Â // call a function to display space on LCD
_delay_ms(1);
LCD_write(‘A’);Â Â Â Â Â Â Â Â // call a function to display “A” on LCD
_delay_ms(100);
LCD_write(‘V’);Â Â Â Â Â Â Â Â // call a function to display “V” on LCD
_delay_ms(100);
LCD_write(‘R’);Â Â Â Â Â Â Â Â // call a function to display “R” on LCD
_delay_ms(100);
LCD_cmd(0xC0);Â Â Â Â Â Â Â Â Â // move cursor to the start of 2nd line
_delay_ms(100);
LCD_cmd(0x0C);Â Â Â Â Â Â Â Â Â // display on, cursor off
_delay_ms(100);
LCD_write(‘ ‘);Â Â Â Â Â Â Â Â // call a function to display space on LCD
_delay_ms(1);
LCD_write(‘ ‘);
_delay_ms(1);
LCD_write(‘ ‘);
_delay_ms(1);
LCD_write(‘A’);Â Â Â Â Â Â Â // call a function to display “A” on LCD
_delay_ms(100);
LCD_write(‘t’);Â Â Â Â Â Â Â // call a function to display “t” on LCD
_delay_ms(100);
LCD_write(‘m’);Â Â Â Â Â Â Â // call a function to display “m” on LCD
_delay_ms(100);
LCD_write(‘e’);Â Â Â Â Â Â Â // call a function to display “e” on LCD
_delay_ms(100);
LCD_write(‘g’);Â Â Â Â Â Â Â // call a function to display “g” on LCD
_delay_ms(100);
LCD_write(‘a’);Â Â Â Â Â Â Â // call a function to display “a” on LCD
_delay_ms(100);
LCD_write(‘3’);Â Â Â Â Â Â Â // call a function to display “3” on LCD
_delay_ms(100);
LCD_write(‘2’);Â Â Â Â Â Â Â // call a function to display “2” on LCD
_delay_ms(100);
LCD_cmd(0x0E);Â Â Â Â Â Â Â Â Â // make display ON, cursor ON
_delay_ms(1);
return 0;
}
void init_LCD(void)
{
LCD_cmd(0x38);Â Â Â Â Â Â Â Â Â Â // initialization in 8bit mode of 16X2 LCD
_delay_ms(1);
LCD_cmd(0x01);Â Â Â Â Â Â Â Â Â // make clear LCD
_delay_ms(1);
LCD_cmd(0x02);Â Â Â Â Â Â Â Â Â // return home
_delay_ms(1);
LCD_cmd(0x06);Â Â Â Â Â Â Â Â Â // make increment in cursor
_delay_ms(1);
LCD_cmd(0x80);Â Â Â Â Â Â Â Â Â // “8” go to first line and “0” is for 0th position
_delay_ms(1);
return;
}
//**************sending command on LCD***************//
void LCD_cmd(unsigned char cmd)
{
LCD_DATA = cmd;Â Â Â Â Â // data lines are set to send command
PORTDÂ &= ~(1<<rs);Â // RS sets 0
PORTDÂ &= ~(1<<rw);Â // RW sets 0
PORTDÂ |= (1<<en);Â Â // make enable from high to low
_delay_ms(100);
PORTDÂ &= ~(1<<en);
return;
}
//*****************write data on LCD*****************//
void LCD_write(unsigned char data)
{
LCD_DATA= data;Â Â Â Â Â Â // data lines are set to send command
PORTDÂ |= (1<<rs);Â Â Â // RS sets 1
PORTDÂ &= ~(1<<rw);Â Â // RW sets 0
PORTDÂ |= (1<<en);Â Â Â // make enable from high to low
_delay_ms(100);
PORTD &= ~(1<<en);
return ;
}
Â
SIMULATION ON PROTEUS
Compile the above code and dump the HEX file in AVR microcontroller as described in the previous tutorials. Make necessary settings and check the display on LCD.

BASIC COMMANDS USED IN LCD DISPLAY
COMMANDS | DESCRIPTION |
0x01 | Clear screen |
0x02 | return home |
0x04 | Cursor decrement |
0x05 | Display shifts to right |
0x06 | Cursor increment |
0x07 | Display shifts to left |
0x08 | Cursor and display OFF |
0x10 | Cursor position Shifts to left |
0x14 | Cursor position shifts to right |
0x38 | Using two lines, 8-bit mode |
0x28 | Using two lines, 4-bit mode |
0x80 | Move cursor to the beginning of first line |
0x0C | Display ON, cursor OFF |
0XC0 | Move cursor to the beginning of second line |
0x0A | Display OFF, cursor ON |
0x0E | Display ON, cursor blinking |
0x30 | For display in one line in 8-bit mode |
0x20 | For display in one line in 4-bit mode |
0x0F | Display data on cursor blinking |
0x18 | Shift complete data to left side |
0x1C | Shift complete data to right side |
Thanks for visiting our website . Keep sharing and keep learning 🙂Â
Â
Â
write a program in AVR LCD, take input from keypad and perform addition and subtraction .Results with digits added or subtracted must be displayed on LCD.
i am getting error on lcd_write() like stray ‘ 221’ in program
thank you
Great explanation but there is a line I don’t get (LCD_DATA= data;) What is LCD_DATA ?!!