Position: Index > Unclassified >

LCD Interfacing with AVR

2018-01-30 06:03  
Declaration:We aim to transmit more information by carrying articles . We will delete it soon, if we are involved in the problems of article content ,copyright or other problems.
    

Interfacing LCD Display in 8bit Mode

I’ve already discussed about the LCD display in a note here in this website. You can read theNote on character LCD Displayhere. Now let us come to the interfacing side of LCD. Let us see the 8bit mode interfacing of the LCD display with an AVR micro controller first. I have added two circuits in this post1)Interfacing LCD with Avr Atmega8 and2)Interfacing with Atmega32. Towards the end you can see the real life display as an image where I displayed“Circuits Today”:)

                Here to interface LCD with Avr, an 8 bit data bus is required. In addition we need 2bit control bus for write only mode Or 3 bit control bus for Read plus write mode. Connect pin 1 of the LCD module to ground, pin 2 to ve supply. Connect a Pot (2 to 5 K Ohm) across the supply and ground. Connect the middle pin of the pot to pin3 of LCD module. If you want to light up the back light, connect the –LED pin to ground. Connect the LED pin of the LCD to the ve supply using a resistor. Figure below is the two circuit diagrams!

1) Interfacing LCD with Atmega8 (in 8 bit mode)-Circuit Diagram

LCD interfacing with avr micro controller

LCD Interfacing – Atmega8

2) 1) Interfacing LCD with Atmega32 (in 8 bit mode)-Circuit Diagram

Interfacing LCD Display with Avr

LCD Interfacing-Atmega32

Now, I’ve written up two routines for two separate cycles. One is used to transfer data (or character). Another sends command. In C code, they are listed under the functions‘LCD()’and‘LCDcmd()’respectively. To prevent crash of data, we must allow the LCD to complete execution of each operation. Here we will be using delay loops available from the AVR studio Library. Each instruction or data takes at least 40uS to get executed. Largest wait loop is of 1.65mS. For further details, readmy note upon LCD display(Wait a minute. It shouldn’t be ‘LCD display’, instead ‘LC display’. But ‘LCD display’ is widely used) &AVR Library overviewfor beginners. Let’s check the code

One more thing, it is better that to copy and paste this code in notepad (Or word pad or MS word) and check this code.

 C  |  copy code |? 
//-------------------------------------------------------- Start
#include<avr/io.h>
#include<util/delay.h>
 
#define DPORT PORTB //Define Data port
#define DPDDR DDRB
 
#define CPORT PORTD //Define Signals port
#define CPDDR DDRD
 
#define RS PD6 //Signal Pins, Reset
#define EN PD7 //Signal Pins, Enable
 
//Pre-defining Commands
#define LCDClear 0x01 //Clears LCD Display
#define LCD8bit 0x38 //Sets up LCD in 8bit mode
#define LCDCursorOn 0x0f //Enables Cursor
#define LCDSeek00 0x80 //Seeks the pointer to the begeining
 
voidLCD(charch);
voidLCDcmd(void);
voidLCDInitialize(void);
 
intmain()
{DPDDR=0xff;
CPDDR=0xf0;
 
_delay_ms(2000);
 
LCDInitialize();
LCD(‘C’);
LCD(‘i’);
LCD(‘r’);
LCD(‘c’);
LCD(‘u’);
LCD(‘i’);
LCD(‘t’);
LCD(‘s’);
LCD(‘ ’);
LCD(‘T’);
LCD(‘o’);
LCD(‘d’);
LCD(‘a’);
LCD(‘y’);
return0;
}
voidLCD(charch)
{DPORT=ch;//Put values to ports
CPORT=(1<<RS)|(1<<EN);//Signaling to send data
_delay_us(10);
CPORT=(1<<RS)|(0<<EN);
_delay_us(45);
}
 
voidLCDcmd(charch)
{DPORT=ch;
CPORT=(0<<RS)|(1<<EN);//Signaling to send commands
_delay_ms(10);
CPORT=(0<<RS)|(0<<EN);
_delay_ms(45);
if(ch==0x01||ch==0x02)// If commands are LCD Clear or
// LCDSeek00, delay 2mS
_delay_ms(2);
}
 
voidLCDInitialize(void)
{LCDcmd(LCD8bit);
LCDcmd(LCDCursorOn);
LCDcmd(LCDClear);
LCDcmd(LCDSeek00);
}
//-------------------------------------------------------- End

 

Now I’ve used Lots of crazy symbols in my program. Here is a summary.

In C,‘0x’prefix represents a hexadecimal number.‘0b’represents binary.‘|’is thebitwise ‘OR’operation. Here, 0b0010|0b0110=0b0110.‘||’is theLogical ‘OR’test. If in statement ‘A||B’, if value of either or both of the operand is NOT Zero (or True), then the statement result is TRUE.‘?’ stands for Bitwise right shift operation. Here, 0b0001?2 =0b0100.‘?’ stands for Bitwise left shift operation. Here, 0b1000?1 =0b0100. Just for your knowledge, I’ve not used them in this article.

So that was basic version of the code. Let’s see some better functions to be compiled.

 C  |  copy code |? 
//-------------------------------------------------------- Start
#include<avr/io.h>
#include<util/delay.h>
 
#define DPORT PORTB //Define Data port
#define DPDDR DDRB
 
#define CPORT PORTD //Define Signals port
#define CPDDR DDRD
 
#define RS PD6 //Signal Pins, Reset
#define EN PD7 //Signal Pins, Enable
 
#define LCDClear   0x01 //Clears LCD Display
#define LCD8bit   0x38 //Sets up LCD in 8bit mode
#define LCDCursorOn 0x0f //Enables Cursor
#define LCDSeek00   0x80 //Seeks the pointer to the begeining
 
voidLCD(charch);
voidLCDcmd(void);
voidLCDInitialize(void);
voidprintStringLCD(char*str);
intprintIntLCD(unsignedinti);
 
intmain()
{DPDDR=0xff;
CPDDR=0xf0;
 
_delay_ms(500);
LCDInitialize();
printStringLCD("Circuits Today");
_delay_ms(5000);
LCDcmd(LCDClear);
prinStringLCD(“Print an Integer”);
LCDcmd(0xc0);
printIntLCD(990);
return0;
}
 
voidLCD(charch)
{DPORT=ch;//Put values to ports
CPORT=(1<<RS)|(1<<EN);//Signaling to send data
_delay_us(10);
CPORT=(1<<RS)|(0<<EN);
_delay_us(45);
}
 
voidLCDcmd(unsignedcharch)
{DPORT=ch;
CPORT=(0<<RS)|(1<<EN);//Signaling to send commands
_delay_us(10);
CPORT=(0<<RS)|(0<<EN);
_delay_us(45);
if(ch==0x01||ch==0x02)
_delay_ms(2);
 
}
 
voidLCDInitialize(void)
{LCDcmd(LCD8bit);
LCDcmd(LCDCursorOn);
LCDcmd(LCDClear);
LCDcmd(LCDSeek00);
}
 
voidprintStringLCD(char*str)
{inti=0;
while(str[i]!='\0')
{DPORT=str[i];//Put values to ports
LCD(ch);
i;
}
}
intprintIntLCD(unsignedinti)
{staticinta;
a=0;
if(i!=0)
{printIntLCD(i/10);
LCD(0i%10);
a;
}
returna;
}
//-------------------------------------------------------- End

 

Photographs of LCD Interfacing

lcd interfacing

And you want more focused one?

LCD-Circuits Today

 
Reprinted Url Of This Article:
http://www.circuitstoday.com/lcd-interfacing-with-avr