Friday, June 8, 2012

How to display text on 16x2 LCD using AVR microcontroller (ATmega16)

This article is in continuation to the article Single character LCD display using AVR. The aforesaid article shows how to display a single letter on LCD. Moving forward towards learning to work with LCD, this article explains how to display a string on LCD. Displaying string is occasionally used in many applications.

The connection of the LCD with the AVR microcontroller (ATmega16) is shown in the circuit diagram. A string is nothing but a sequence of characters. The following steps explain how to display a string on the LCD.
To send string on LCD:
        i.            Make a string pointer variable
       ii.            Pass the starting address of string to that pointer variable
      iii.            Pass the string pointer value to the LCD_write function
      iv.            Increment the pointer value and go to step (iii.) till the value of pointer reaches NULL character.

void LCD_write_string(unsigned char *str) //store address value of the string in pointer *str
{
int i=0;
while(str[i]!='\0') // loop will go on till the NULL character in the string 
{
LCD_write(str[i]); // sending data on LCD byte by byte
i++;
  }
return;
}
 


Wednesday, May 23, 2012

How to interafce 16x2 LCD with AVR microcontroller (ATmega16)


In this project LCD is working in 8-bit mode i.e., the data transferred to the LCD must be in 8-bit data form. The PortA of ATmega16 is connected to data pins of LCD and is defined as LCD_DATA. PortB is defined as control pins (Rs, R/W and En).

Conceptually, interfacing LCD with AVR microcontroller is similar to that of interfacing it with any other microcontroller.
The following steps explain in detail how LCD can be interfaced with ATMEGA 16:

Step1: To initialize LCD
The following instructions are used to initialize LCD.
·       0x38 to initialize LCD in 8-bit mode
·       0x01 to clear LCD
·       0x0E to make cursor ON
·       0x80 to go to first line and 0th position in LCD

 Delay of around 50 micro second is necessary b/w two commands for execution of instructions. 
void init_LCD(void)
{
LCD_cmd(0x38); // initialization of 16X2 LCD in 8bit mode
_delay_ms(1);
LCD_cmd(0x01); // clear LCD
_delay_ms(1);
LCD_cmd(0x0E); // cursor ON
_delay_ms(1);
LCD_cmd(0x80); // ---8 go to first line and --0 is for 0th position
delay_ms(1);
return;
}
Step2: Define command function
To send any command to LCD
·         Transfer the command to LCD_DATA port
·         Set RS and RW bit to go LOW and enable as HIGH
·         Give a small delay
·         Set enable to LOW 
void LCD_cmd(unsigned char cmd)
{
LCD_DATA=cmd;
ctrl =(0<<rs)|(0<<rw)|(1<<en); // RS and RW as LOW and EN as HIGH
_delay_ms(1);
ctrl =(0<<rs)|(0<<rw)|(0<<en); // RS, RW , LOW and EN as LOW
_delay_ms(50);
return;
}
Step3: Define write function
To display any data on LCD
·         Transfer the data (Ascii value of the character to be sent) to LCD_DATA port.
·         Make RW as LOW and set RS and enable as HIGH.
·         Give a small delay.
·         Make enable pin LOW

void LCD_write(unsigned char data)
{
LCD_DATA= data;
ctrl = (1<<rs)|(0<<rw)|(1<<en); // RW as LOW and RS, EN as HIGH
_delay_ms(1);
ctrl = (1<<rs)|(0<<rw)|(0<<en); // EN and RW as LOW and RS HIGH
_delay_ms(50); // delay to get things executed
return ;
}