[SOLVED] keypad interfacing with 8051. data doesn't show on lcd

Status
Not open for further replies.

uday mehta

Advanced Member level 4
Joined
Dec 30, 2011
Messages
104
Helped
6
Reputation
12
Reaction score
6
Trophy points
1,298
Visit site
Activity points
1,979
I have written a keypad and LCD interfacing with 8051 program.
I works properly when I don't you scrolling command.
but when my display data exceed 16 characters then it get data from keypad but instead of show that pressed key it shift display one position. even I use command 0xC0. it never come to second line.

I tried it on proteus simulator. plz suggest me Is there any problem in proteus or in my program?
Code:
#include<reg51.h>

void cct_init(void);
void delay(int);
void lcdinit(void);
void wcmd(int);
void wdata(char);
void enter_roll(void);
char READ_SWITCHES(void);
char keypad(int);



//********************
// Define Pins
//********************
sbit RowA = P1^0;     //RowA
sbit RowB = P1^1;     //RowB
sbit RowC = P1^2;     //RowC
sbit RowD = P1^3;     //RowD

sbit C1   = P1^4;     //Column1
sbit C2   = P1^5;     //Column2
sbit C3   = P1^6;     //Column3
sbit C4   = P1^7;     //Column4

sbit en   = P3^6;     //E pin for LCD
sbit rs   = P3^7;     //RS pin for LCD
sbit te   = P3^3;	   //transmission inable for H12E



char key;                
int a,b,k=0;
int c;                 // check taht enter function called in which condition i.e for enter or change or status
char u[10];

void delay(int c)
{
 int i,j;
 for(i=0;i<c;i++)
 for(j=0;j<50;j++);
} 

void cct_init(void)
{
 P1 = 0xf0;   //used for generating outputs and taking inputs from Keypad
 P2 = 0x00;   //used as data port for LCD
 
 en = 0;   //used for E 
 rs = 0;   //used for RS  
}

void lcdinit()
{
 wcmd(0x38);
 delay(200);
 wcmd(0x0c);
 delay(200);
 wcmd(0x01);
 delay(200);
 wcmd(0x06);
 delay(200);
}

void wcmd(int b)
{
 rs = 0;
 P2 = b;
 en = 1;
 delay(50);
 en = 0;
 delay(50);
}

void wdata(char a)
{
 rs = 1;
 P2 = a;
 en = 1;
 delay(50);
 en = 0;
 delay(50);
}

void lcd(char *disp)
{
 int k,i;
 i=0;
 k=0;
 for(k=0;disp[k]!='\0';k++)
 {
  wdata(disp[k]);
  if(i>=15)
 {
  wcmd(0x07);
 }
  i++;
 }
 
}


void keypad(int k)
{
 key = get_key();       // Get pressed key
 wdata(key);        // Echo the key pressed to LCD
 u[k]=key;
}

void enter_roll()
{
 b=0;
 wcmd(0x01);
 lcd("enter your rollnumber");
 delay(100);
 wcmd(0XC0);
 do
 { 
  keypad(b);
  b++;
 }while( key !='#' );

 }

  //////////////////////////////////
 //******************************//
//////////////////////////////////
// Main program
int main(void)
{
 cct_init();
 lcdinit();               // Initilize LCD


 lcd("   welcome");
 while(1)
 {
  for(k=0;k<1;k++)
  {  
   key = get_key();       // Get pressed key
   wcmd(0X01);	              	       
  }
  enter_roll();
 }
}

char READ_SWITCHES(void)	
{	
	RowA = 0; RowB = 1; RowC = 1; RowD = 1; 	//Test Row A

	if (C1 == 0) { delay(500); while (C1==0); return '1'; }
	if (C2 == 0) { delay(500); while (C2==0); return '2'; }
	if (C3 == 0) { delay(500); while (C3==0); return '3'; }
	if (C4 == 0) { delay(500); while (C4==0); return '+'; }

	RowA = 1; RowB = 0; RowC = 1; RowD = 1; 	//Test Row B

	if (C1 == 0) { delay(500); while (C1==0); return '4'; }
	if (C2 == 0) { delay(500); while (C2==0); return '5'; }
	if (C3 == 0) { delay(500); while (C3==0); return '6'; }
	if (C4 == 0) { delay(500); while (C4==0); return '-'; }
	
	RowA = 1; RowB = 1; RowC = 0; RowD = 1; 	//Test Row C

	if (C1 == 0) { delay(500); while (C1==0); return '7'; }
	if (C2 == 0) { delay(500); while (C2==0); return '8'; }
	if (C3 == 0) { delay(500); while (C3==0); return '9'; }
	if (C4 == 0) { delay(500); while (C4==0); return '%'; }
	
	RowA = 1; RowB = 1; RowC = 1; RowD = 0; 	//Test Row D

	if (C1 == 0) { delay(500); while (C1==0); return '*'; }
	if (C2 == 0) { delay(500); while (C2==0); return '0'; }
	if (C3 == 0) { delay(500); while (C3==0); return '#'; }
	if (C4 == 0) { delay(500); while (C4==0); return '/'; }

	return 'n';           	// Means no key has been pressed
}

char get_key(void)           //get key from user
{
	char key = 'n';              //assume no key pressed

	while(key=='n')              //wait untill a key is pressed
		key = READ_SWITCHES();   //scan the keys again and again

	return key;                  //when key pressed then return its value
}
 

i checked your code.everything is fine except this function
Code:
void lcd(char *disp)
{
 
 unsigned short m=0;
	while(disp[m]!='\0')
	{
 	  	wdata(disp[m]);				  
 	  	m++;
   	}
 
}

- - - Updated - - -

Change this you will get the values of key pressed in 2nd line

- - - Updated - - -

Change this you will get the values of key pressed in 2nd line
 

look at the video. you will automatically understand the problem.
 

Attachments

  • New folder.rar
    2.4 MB · Views: 155

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…