Sunday, October 27, 2013

Interfacing LCD with the ATmega32

Components Required


  • ATmega32 microcontroller
  • AVR Programmer Board
  • Crystal
  • Capacitors
  • 16x2 LCD
  • +5V supply
  • Breadboard
  • Connecting Wires

Circuit Diagram






Description


    DB0-DB7: Data Pins( use DB4-DB7 in 4 bit mode) 

    RS(Register Select) : 1 - Data is sent , 0 - Command is sent . 

    R/W(Read/Write) :1 - Read the LCD , 0 - Write to LCD. 

    E(Enable): to enable an operation . first make low(0) to send data and then set the other two control lines and when they are configured, bring E high (1) and wait for the minimum amount of time required by the LCD and bring it low (0) again. 

    VEE: Contrast Adjust Pin.

    Connections 

  • PC0 to PC7 are connected to the data pins D0 to D7 of the LCD.
  • VDD and VEE are connected to the +5 volts directly.
  • VEE can be connected to a potentiometer to adjust the contrast.
  • VSS is connected to ground.
  • RS, RW and E are connected to PD5, PD6 and PD7 respectively.
  • A crystal is connected to XTAL1 and XTAL2 pins to provide the clock pulse.
  • Reset is connected to +5V.

Source Code

/*
The following code will display the string defined in the main function.
 */ 

#include <avr/io.h>
#include <util/delay.h>

#ifndef F_CPU
#define F_CPU 1000000UL //Frequency of the external crystal
#endif

/*CWR - Command Word Register*/
#define ENABLE_LCD PORTD |= 0x80 //CWR state  to enable LCD
#define DISABLE_LCD PORTD &= ~0x80//CWR state to disable LCD
#define SET_LCD_DATA PORTD |= 0x20 //CWR state to send data
#define SET_LCD_CMD PORTD &= ~0x20 //CWR state to send command

void LCD_WriteCommand (unsigned char CMD);
void LCD_WriteData (unsigned char Data);
void LCD_DisplayString_F(char row, char column,char *string);
void LCD_Cursor(char row, char column);

void init_devices(void)
{
DDRC = 0xFF; //All pins of PORTC declared as Output
PORTC = 0x00;//Initially all pins declared as output low
DDRD = 0xF0;//Pins D4 to D7 declared as input,remaining as o/p
PORTD = 0x00;//All output pins as low
_delay_ms(100); // wait for 100ms
LCD_WriteCommand (0x38); // 8 data lines
LCD_WriteCommand (0x06); // cursor setting
LCD_WriteCommand (0x0f); // display ON
LCD_WriteCommand (0x01); // clear LCD memory
_delay_ms (10); // 10ms delay after clearing LCD
}
int main(void)
{
init_devices();
        //Text to be displayed in first row
LCD_DisplayString_F(1,1,"    ROBOWARES ");
        //Text to be displayed in second row
LCD_DisplayString_F(2,1,"rickruling.blogspot.in");
return 0;
void LCD_WriteCommand (unsigned char Command)
{
SET_LCD_CMD; // Set LCD in command mode
PORTC = Command; // Load data to port
ENABLE_LCD; // Write data to LCD
_delay_ms(1);
DISABLE_LCD; // Disable LCD
_delay_ms(1); // wait for 1ms
}
void LCD_WriteData (unsigned char Data)
{
SET_LCD_DATA; // Set LCD in data mode
PORTC = Data; // Load data to port
ENABLE_LCD; // Write data to LCD
_delay_ms(1);
DISABLE_LCD; // Disable LCD
_delay_ms(1); // wait for 1ms
}

void LCD_DisplayString_F (char row, char column ,char *string)
{
         /*Break the string into characters and send them for the display*/
LCD_Cursor (row, column);
while (*string)//Loop till the string is not null
LCD_WriteData(*string++);
}
void LCD_Cursor (char row, char column)
{
switch (row)
{
case 1:     //Set the position in the first row
                 LCD_WriteCommand (0x80 + column - 1);
break;
case 2:     //Set the position in the second row
                 LCD_WriteCommand (0xC0 + column - 1);
break;
default: break;
}
}


For more tutorial and information, like the Facebook Page 

https://www.facebook.com/Robowares


No comments:

Post a Comment