This article is another step forward in learning more about AVR microcontrollers. We have demonstrated interfacing of LCD module with ATmega328 microcontroller, which will help you to learn its basic concepts. ATmega328 is an eight bit AVR (Advanced Virtual RISC) based microcontroller. It is a powerful microcontroller with a built-in  internal memory of around 32Kb. Atmega 328 has only 28 pins.

Therefore it have only limited number of  GPIO pins. While  designing complex projects we need sufficient number of I/O pins . An LCD module can be interfaced with a microcontroller either in 8 bit mode or in 4 bit mode.  8 bit mode is the conventional mode which uses 8 data lines and RS, R/W, E pins for functioning. However 4 bit mode uses only 4 data lines along with the control pins. This will saves the number of GPIO pins needed for other purpose.

Let’s begin to build our project!

Components Required

AVR microcontrollerATmega 3281
LCD Module20x41
Crystal16 Mz1
Variable Resistor10K1

Circuit Diagram


Interfacing LCD Module with AVR in 4-Bit Mode
Interfacing LCD Module with AVR in 4-Bit Mode


As shown in the circuit diagram, port B and port D of the controller is used for interfacing it with LCD module. In 4 bit mode only 4 lines D4-D7, along with RS, R/W and E pins are used. This will save us 4 pins of our controller which we can use it for other purpose. Here we only need to write to the LCD module. So the R/W pin can be ground it as shown in the schematic diagram.

In this way the total number of pins can be reduced to 6. In 4 Bit mode the data bytes are split into two four bits and are transferred in the form of a nibble. The data transmission to a LCD is performed by assigning logic states to the control pins RS and E. The reset circuit, oscillator circuit and power supply need to be provided for the proper working of the circuit.

Interfacing LCD Module with AVR in 4-Bit Mode


Interface LCD Module with AVR in 4-Bit Mode
Interface LCD Module with AVR in 4-Bit Mode


Important Aspects of the Program

Download Program

The programming part is done in embedded C using Atmel studio 7 .At the beginning of the program a pre-processor named “F_CPU” is defined. It is simply your way to tell some of the library code how many CPU cycles per second the processor is executing. Here we defined the F_CPU as 16 MHz. “#include <avr/io.h>” is a header files which provides you with various  i/o operations like DDRx, PINx, PORTx, etc. “#include <util/delay.h>” is a header file which provides you with inbuilt delay functions like _delay_ms(), _delay_us(), etc. “_delay_ms(1000)” provides a delay of 1000 milliseconds (i.e., equivalent to 1 second).

DDRx – Data Direction Register configures data direction of the port(Input/Output). The instruction “

PORTx – Port register is for assigning appropriate values for the port pins.

Writing to PORTx.n will immediately change state of the port pins according to given value.

The port and the corresponding pins that we used are defined at the beginning. According to your circuit, you can alter the port name and pin number in the program.

A subroutine called “ LCD_CmdWrite()” is used for sending commands to the LCD. In this function the 8 bit data is break into two 4 bit data and send to LCD as nibbles. The command register of the LCD is the selected by writing a ‘0’ to the RS pin. The writing operation is done by simply enabling the E pin of LCD for few microseconds. Similarly the subroutine called “ LCD_DataWrite()” is used for sending data to the LCD. The data register of the LCD is the selected by writing a ‘1’ to the RS pin.

“LCD_Init()” is the sub routine used for initializing the  lcd module. And “LCD_Disp()” is for displaying strings. The function “LCD_setCursor” is used  for setting the cursor position.


1 Comment