[SOLVED] 16 x 2 LCD interfacing problem

Status
Not open for further replies.

Venkadesh_M

Advanced Member level 4
Joined
Jun 26, 2013
Messages
1,374
Helped
258
Reputation
516
Reaction score
254
Trophy points
1,363
Location
Coimbatore, India
Activity points
8,019
Hi all,
I am using PIC 16f877A with lcd jhd 162a. I am trying to interfacing in a 4 bit mode.
I am doing all this

sending command as said in manual and followed by data
but i am getting clear screen on first line and block boxes on second line.
Code:
0x3
0x3
0x3
0x28 //for 4 bit mode
0x08
0x38
0x01 // clear display
after that i am sending data to LCD
I am very new to lcd please help me.....
 

i think u need check you connection TX RX
sorry i mean: ur config....

if u use Mikroc

Code:
// LCD module connections
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB7_bit;
sbit LCD_D4 at RC4_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_RS_Direction at TRISB5_bit;
sbit LCD_EN_Direction at TRISB7_bit;
sbit LCD_D4_Direction at TRISC4_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;
// End LCD module connections
void main()
{
 Lcd_Init(); // Initialize LCD
 Lcd_Cmd(_LCD_CLEAR); // Clear display
 Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
 Lcd_Out(1,1,"Hello World");//Write text'Hello World' in first row
}
 
Last edited:

U really Bad boy if don't know don't reply

- - - Updated - - -

U connect lower port or higher port bit for sending data . also after each place few ms delay which is compulsory

- - - Updated - - -

U connect lower port or higher port bit for sending data . also after each place few ms delay which is compulsory

delay1(3500);
lcd_write_nibble(ctrl_instr,0x03);
delay1(5000);
lcd_write_nibble(ctrl_instr,0x03);
delay1(250);
lcd_write_nibble(ctrl_instr,0x03);
delay1(250);
lcd_write_nibble(ctrl_instr,0x02);
delay1(250);
//-------------------------------------------------------------------
lcd_write_nibble(ctrl_instr,0x02);
lcd_write_nibble(ctrl_instr,0x08);
delay1(10);
//-------------------------------------------------------------------
lcd_write_nibble(ctrl_instr,0x00);
lcd_write_nibble(ctrl_instr,0x08);
delay1(10);
//-------------------------------------------------------------------
lcd_write_nibble(ctrl_instr,0x00);
lcd_write_nibble(ctrl_instr,0x0C);
delay1(10);
 
Golden electronics for my doubt i given 30ms delay between enable as well as each instruction. still its not working it makes clearing display in upper row.
is that a over delay or any mistake in commanding sequence??
 

please clear me ur hardware pin details means which pin used. Can u check is ur controller working for this u may blink any led cont.. sill problem then inform i send details according to ur code
 
Ya I checked other ports with output LEDs everything works fine. and the portd LCD pins also changing.
I am adding the codes here please check and found out . .

- - - Updated - - -
- - - Updated - - -

Code:
#include <pic.h>
#include <htc.h>

#define _XTAL_FREQ 20000000

#define RW RD2
#define RS RD3
#define EN RD1
#define databits PORTD

void delay_ms(void)
{
__delay_ms(31);
__delay_ms(31);
__delay_ms(31);
}

void data(unsigned char c)
{
	delay_ms();
 	databits = ( c & 0xF0 ) | 0x08 | 0x02;
   	delay_ms();
	databits = ( c & 0XF0 ) | 0x08;
        delay_ms();
        databits = ( ( c << 4 ) & 0xF0 ) | 0x08 | 0x02;
        delay_ms();
	databits = ( ( c << 4 ) & 0XF0 ) | 0x08;
	delay_ms();
}

void cmd(unsigned char c)
{
	delay_ms();
 	databits = ( c & 0xF0 ) | 0x02;
       delay_ms();
	databits = ( c & 0XF0 );
        delay_ms();
 	databits = ( ( c << 4 ) & 0xF0 ) | 0x02;
        delay_ms();
	databits = ( ( c << 4 ) & 0XF0 );
	delay_ms();
}


main()
{
        TRISD = 0;
	TRISC = 0;
	delay_ms();
        delay_ms();
        delay_ms();
        delay_ms();
        cmd(0x33);
        delay_ms();
	cmd(0x32);
        delay_ms();
	cmd(0x28);
        delay_ms();
	cmd(0x08);
        delay_ms();
	cmd(0x01);
        delay_ms();
	cmd(0x06);
	RC1 = 1;
        delay_ms();
	data('V');
        delay_ms();
	data('E');
        delay_ms();
	data('N');
        delay_ms();
	data('K');
        delay_ms();
	data('A');
        delay_ms();
	data('D');
        delay_ms();
	data('E');
        delay_ms();
	data('S');
        delay_ms();
	data('H');
	RC0 = 1;
}


RD7 to DB7
RD6 to DB6
RD5 to DB5
RD4 to DB4
RD3 to RS
RD2 to RW
RD1 to EN
 

Use CCS C compiler.....

Its easy to code and decode.
 

Venkadeshm,
try to sync LCD to processor, may be they are running at different speeds

0x03
0x03
0x03
0x02 // you add this


first go to basics how you are sending a command and data to LCD.

command mode should go like this

data=buf//read buff
Rs=0,
Rw=0,
En =1,
some delay
En=0

data mode should go like this
Rs=1
Rw=0
En =1
some delay
En=0

no where you mentioned so while sending data , you just masked the data .

learn to comment your code, others have to understand what you are sending to suggest you.



** Use library functions it would be better
 

Thankyou Raady,
I mentioned the pin assignments in a particular port and I am packing the data as for the required RS and En inputs,
Commonly every one doing so thats why i didnt mentioned it..

Thanks for all............
My lcd is working very very fine....
What i did wrong is i didnt on the display, i just follow the procedure to initialize the lcd in its manual...
now its looks easy and fine thank you all...
 

Code:
#include <pic.h>
#include <htc.h>

#define _XTAL_FREQ 20000000

#define RW RD2
#define RS RD3
#define EN RD1
#define databits PORTD

void data(unsigned char c)
{
	databits = ( c & 0xF0 ) | 0x08 | 0x02;
   	__delay_us(50);
	databits = ( c & 0XF0 ) | 0x08;
    __delay_us(50);
	databits = ( ( c << 4 ) & 0xF0 ) | 0x08 | 0x02;
    __delay_us(50);
	databits = ( ( c << 4 ) & 0XF0 ) | 0x08;
}

void cmd(unsigned char c)
{
	databits = ( c & 0xF0 ) | 0x02;
   	__delay_us(50);
	databits = ( c & 0XF0 );
    __delay_us(50);
	databits = ( ( c << 4 ) & 0xF0 ) | 0x02;
    __delay_us(50);
	databits = ( ( c << 4 ) & 0XF0 );
}

void init(unsigned char c)
{
	databits = ( c & 0xF0 ) | 0x02;
   	__delay_us(50);
	databits = ( c & 0XF0 );
    __delay_ms(10);
	databits = ( ( c << 4 ) & 0xF0 ) | 0x02;
    __delay_us(50);
	databits = ( ( c << 4 ) & 0XF0 );
}

void puts(char* str)
{	
	cmd(0x01);
	cmd(0x80);
	__delay_ms(31);
    for(char i = 0; str[i] != 0; i++)
	{
    __delay_us(20);
	data(str[i]);
	}
}
    
void lcd_init(void)
{
    __delay_ms(16);
    init(0x33);
    __delay_ms(1);
	cmd(0x32);
    __delay_us(20);
	cmd(0x2C);
    __delay_us(20);
	cmd(0x0C);
    __delay_us(20);
	cmd(0x06);	
	__delay_us(20);
	cmd(0x0C);
	__delay_us(20);
	cmd(0x01);
    __delay_us(20);
	cmd(0x80);
    __delay_us(20);
	
}


main()
{
	char i, wel[]="    WELCOME";

    TRISD = 0;
	TRISC = 0;
	RC0 = RC1 = RC2 = 0;

	lcd_init();

	puts(wel);

 

	for( i = 0; i < 50; i++)
	__delay_ms(30);


	while(1);
}
 

read this i think it really can help u
**broken link removed**
 

Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…