Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

problem interfacing 16x2 lcd (in 4 bit mode) with ATMEGA 32

Status
Not open for further replies.

yviswanathbe

Full Member level 4
Joined
Jun 14, 2007
Messages
221
Helped
10
Reputation
20
Reaction score
6
Trophy points
1,298
Activity points
3,066
Hi Friends,

I am facing problem with interfacing lcd in 4 bit mode with atmega32 micro controller.

I have done in 8 bit mode.

for initial testing i am just sending a string to LCD, but nothing is visible in the LCD. LCD is blank.

and the same lcd is working fine in 8 bit mode.

I am not able to trace the problem.

i have attached my source code. Some body please help me in solving the issue.

Code:
#include <mega32.h>
#include <stdio.h>
#include <delay.h>

#define LCDPORT     PORTD
#define RS          PORTB.0
#define RW          PORTB.1
#define E           PORTB.2
#define led         PORTB.3
#define flag        PIND.7

void lcd_init_write(unsigned char);
void lcd_com(unsigned char);
void lcd_data(unsigned char);
void lcd_init(void);
void lcd_puts(char *);
void busy();

void lcd_init_write(unsigned char a)
{
          //busy();
          RS=0;
          RW=0;
          LCDPORT=a;
          E=1;
          delay_ms(2);
          E=0;
}
void busy()
{
          PORTD=0x00;
          DDRD=0x00;
          RS=0;
          RW=1;
          while(flag!=0)
          {
                    E=0;
                    delay_ms(2);
                    E=1;
          }
          PORTD=0xFF;
          DDRD=0xFF;
}


void lcd_com(unsigned char a)
{
          unsigned char temp; 
          busy();                                               
          RS=0;
          RW=0; 
          temp=a; 
          temp=temp & 0xF0;
          //LCDPORT=LCDPORT & 0xF0; 
          LCDPORT=LCDPORT & temp;                          
          E=1;
          delay_ms(2);                    
          E=0;
          temp=a;
          temp=temp<<4;
          temp=temp & 0xF0;
          temp=temp>>4; 
          //LCDPORT=LCDPORT | 0xF0;                                                                                 
          LCDPORT=LCDPORT & temp;
          LCDPORT=LCDPORT & 0x0F;                              
          E=1;
          delay_ms(2);                   
          E=0;
}

void lcd_data(unsigned char a)
{
         unsigned char temp; 
          busy();                                               
          RS=1;
          RW=0; 
          temp=a; 
          temp=temp & 0xF0;
          //LCDPORT=LCDPORT & 0xF0; 
          LCDPORT=LCDPORT & temp;                          
          E=1;
          delay_ms(2);                    
          E=0;
          temp=a;
          temp=temp<<4;
          temp=temp & 0xF0;
          temp=temp>>4; 
          //LCDPORT=LCDPORT | 0xF0;                                                                                 
          LCDPORT=LCDPORT & temp;
          LCDPORT=LCDPORT & 0x0F;                              
          E=1;
          delay_ms(2);                   
          E=0;
}
void lcd_init(void)
{
          lcd_init_write(0x30); 
          delay_ms(5);  
          lcd_init_write(0x30); 
          delay_ms(1);  
          lcd_init_write(0x30);   
          lcd_init_write(0x20);   
          lcd_com(0x28);         
          lcd_com(0x06);          
          lcd_com(0x08);             
          lcd_com(0x01);          
          lcd_com(0x0F);
          lcd_com(0x02);
}
void lcd_puts(char *str)
{
          while(*str)
          lcd_data(*str++);
}

void main()
{
          DDRB=0x0F;
          PORTB=0x00;
          DDRD=0xFF;
          PORTD=0xFF;  
          delay_ms(20);
          lcd_init();                   //Intilize LCD in 4-Bit Mode
          lcd_com(0x80);                // Start Cursor From First Line 
          lcd_puts("Hello");          //Print HELLO on LCD
          //lcd_com(0x01);
          //lcd_com(0xC0);              // Start Cursor From Second Line
          //lcd_puts("World");          //Print HELLO on LCD
          while(1);                     //Stay Forever Here
}

Thanks and Regards,
Viswanath.
 

which 4 bit pins you are using
attached your schematic please
 

temp=temp<<4;
temp=temp & 0xF0;
temp=temp>>4;
//LCDPORT=LCDPORT | 0xF0;
LCDPORT=LCDPORT & temp;
LCDPORT=LCDPORT & 0x0F;

Remove the underlined line.
 

Hi d@nny and nandhu,

Thanks for your replies.

I have attached my schematic.

I have changed the code as nandhu said, but the result is same.

Pls help me in solving the problem.

Thanks and Regards,
Viswanath
 

Attachments

  • atmega32V2.pdf
    25.6 KB · Views: 79

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top