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.

Keypad scanning problem

Status
Not open for further replies.

Isuru Senarath

Member level 2
Joined
Apr 10, 2012
Messages
42
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,286
Activity points
1,580
Hi all,
I am doing a project regarding bus route information system, This is my program. I need to get the enter key number for following FOR loops. How can I filter that. How can I get the pressed key instead of

if(SBUF = 1)
{
Task 1
}

else if(SBUF = 2)
{
Task 2
}

else if (SBUF = '*')
{
Task 3
}

How can I clear the SBUF ? :!: I want to clear the SBUF before I enter the message which I need to send through the GSM module. How can I do that in Task 3. Following is my full program.
Thanks


Code:
#include <REGX51.H>
#include<string.h>
#define COL P2
#define ROW P0
sfr LcdData = 0x90;							//LCD Data Pins
sbit RS =  P2^5;
sbit RW =  P2^6;
sbit EN =  P2^7;

//Function Prototype Declaration


void lcd_data_string(unsigned char *str);
void lcdcmd(unsigned char value);
void lcddata(unsigned char value);
void Delay(unsigned int itime);
void SerTX(unsigned char);
void SMSString(char*text) ;
unsigned char msg[] = "Enter Info:-";
unsigned char keypad[4][4] =	{'1','2','3','A',
								 '4','4','6','B',
								 '7','8','9','C',
								 '*','0','#',':'};
void main()
{
	unsigned char colLoc,rowLoc;
	unsigned int len,i;
	LcdData = 0x00;		 //Port-1 as Output Port
	TMOD = 0x20;	//For Baud Rate Generation
	TH1 = -3;		//Baud Rate of 9600bps
	SCON = 0x50;
	TR1 = 1;		//Start Timer-1

	//LCD Initialization Commands

	lcdcmd(0x38);	//Initialize LCD Commands
	Delay(1);
	lcdcmd(0x0E);	//Display on Cursor Blinking
	Delay(1);
	lcdcmd(0x01);	//Clear LCD
	Delay(1);
	lcdcmd(0x80);	//Row 1 and First Column
	lcd_data_string("Bus Route Info.");		
	Delay(10);
	lcdcmd(0x0C0);
	lcd_data_string("System Project");
	Delay(10);
	lcdcmd(0x01);  //clear screen
	Delay(1);
	len = strlen(msg);
	for(i=0;i<len;i++)
	{
		lcddata(msg[i]);
		Delay(1);
	}
	lcdcmd(0x0C0);						//Move to Second Line of the LCD
	COL =  0x0FF;						//Make Port-2 as Input Port
	while(1)								//Infinite Loop
	{
		do
		{
			ROW = 0x00;						//Groud all Row's
			colLoc = COL;					//Read all the Columns
			colLoc = colLoc & 0x0F;			//Mask the Unused Bits.
		}while(colLoc != 0x0F); 			//Check until all the Keys are released
		do
		{
			do
			{
				Delay(2);					//20msec delay
				colLoc = COL;				//Read all the Columns
				colLoc = colLoc & 0x0F;		//Mask the Unused Bits.
			}while(colLoc == 0x0F); 			//Keep Checking for Key-press
			//It may be possible that this key-press may be due to some noise-spikes in the circuit
			//thats why we will check once again whether the same key is pressed or not.
			//If not the whole loop will be executed once again
			Delay(2);
			colLoc = COL;					//read all columns
			colLoc = colLoc & 0x0F;			//Mask the Unused Bits.
		}while(colLoc == 0x0F);				//Wait for the Key-Press

		while(1)
		{
			ROW = 0x0FE;					//Ground First Row
			colLoc = COL;
			colLoc = colLoc & 0x0F;			//Mask the Unused Bits.
			if(colLoc != 0x0F)				//Column Detected
			{
				rowLoc = 0;					//1st Row Selected
				break;
			}

			ROW = 0x0FD;					//Ground Second Row
			colLoc = COL;
			colLoc = colLoc & 0x0F;			//Mask the Unused Bits.
			if(colLoc != 0x0F)				//Column Detected
			{
				rowLoc = 1;					//2nd Row Selected				
				break;
			}

			ROW = 0x0FB;					//Ground Third Row
			colLoc = COL;
			colLoc = colLoc & 0x0F;			//Mask the Unused Bits.
			if(colLoc != 0x0F)				//Column Detected
			{
				rowLoc = 2;					//3rd Row Selected
				break;
			}

			ROW = 0x0F7;					//Ground Fourth Row
			colLoc = COL;
			colLoc = colLoc & 0x0F;			//Mask the Unused Bits.
			if(colLoc!= 0x0F)
			{
				rowLoc = 3;					//4th Row Selected
				break;
			}
		}

		if(colLoc == 0x0E)			  	//1110 This means that First column is Selected
		{
			SerTX(keypad[rowLoc][0]);
		}
		else if(colLoc == 0x0D)			// 1101
		{
			SerTX(keypad[rowLoc][1]);
		}
		else if(colLoc == 0x0B)			 // 1011
		{
			SerTX(keypad[rowLoc][2]);
		}
		else if(colLoc == 0x07)			  // 0111
		{
			SerTX(keypad[rowLoc][3]);
		}

		//lcdcmd(0xC0);	//Second Row
		
			//Check Columns and send the Data to the LCD Screen:-
			if(colLoc == 0x0E)			  	//1110 This means that First column is Selected
			{
				lcddata(keypad[rowLoc][0]);
			}
			else if(colLoc == 0x0D)					 // 1101
			{
				lcddata(keypad[rowLoc][1]);
			}
			else if(colLoc == 0x0B)					 //  1011
			{
				lcddata(keypad[rowLoc][2]);
			}
			else if(colLoc == 0x07)					 //  0111
			{
				lcddata(keypad[rowLoc][3]);
			}
	
	if(SBUF = 1)
			{
				lcdcmd(0x01);  //clear screen
				lcdcmd(0x80);	//Row 1 and First Column
				lcd_data_string("Go to Bus Stand");		
				Delay(10);
				lcdcmd(0x0C0);
				lcd_data_string("Loc:A1 7.00 PM");
				Delay(100);
				lcdcmd(0x01);  //clear screen
				lcdcmd(0x80);	//Row 1 and First Column
				lcd_data_string("Enter Next Stop");		
				Delay(10);
				lcdcmd(0x0C0);
				lcd_data_string("Number");
				Delay(100);
			}
	
	else if(SBUF = 2)
			{
				lcdcmd(0x80);	//Row 1 and First Column
				lcd_data_string("BS 2 at 7.10PM");		
				Delay(10);
				lcdcmd(0x0C0);
				lcd_data_string("ACHIVE? Y/N?");
				Delay(10);
			}

	else if (SBUF = '*')	 //* is for Y (YES)
				{
					SMSString("AT\r"); // AT commands to initialize gsm modem
					Delay(50);

					SMSString( "ATe0\r"); // turn off echo
					Delay(50);

					SMSString( "AT&W\r"); // save settings
					Delay(50);

					SMSString( "AT+CMGS=\"0718021336\"\r");//my mob number here
					Delay(50);
					SMSString("7.10");
					Delay(500);
					SMSString("0x1A\r");
					Delay(50);
				}
			}
		}
		



void lcdcmd(unsigned char value)
{
	LcdData = value;
	RS = 0;
	RW = 0;
	EN = 1;
	Delay(1);
	EN = 0;
}
void lcddata(unsigned char value)
{
	LcdData = value;
	RS = 1;
	RW = 0;
	EN = 1;
	Delay(1);
	EN = 0;
}
void Delay(unsigned int itime)
{
	unsigned int i,j;
	for(i=0;i<1275;i++)
	for(j=0;j<itime;j++);
}
void SerTX(unsigned char x)
{
	SBUF = x;
	while(TI == 0);
	TI = 0;
}

void lcd_data(unsigned char item)		// Function to send one byte data to LCD
{
	LcdData = item;
	RS= 1;
	RW=0;
	EN=1;
	Delay(1);
	EN=0;
	return;
}

void lcd_data_string(unsigned char *str)	// Function to send string to LCD
{
	int i=0;
	while(str[i]!='\0')
	{
		lcd_data(str[i]);
		i++;
		Delay(10);
	}
	return; 
}


void SMSString(unsigned char* text) //function to send SMS using GSM modem
{
        while (*text)
        {
                SerTX(*text++);
        }
}
 

post your circuit
this is my pic code
interrupt int_server( void )
{

int_save_registers // W, STATUS (and PCLATH)

//
//

if (RBIF) {

if(keypress==1)
{

key=0;
PORTC=0x80;
keydelay();
tempkey=PORTC&0xf;
if(tempkey==1)
key=11;
if(tempkey==2)
key=12;
if(tempkey==4)
key=13;
if(tempkey==8)
key=14;


if(key==0)
{
PORTC=0x40;
keydelay();
tempkey=PORTC&0xf;
if(tempkey==1)
key=3;
if(tempkey==2)
key=6;
if(tempkey==4)
key=9;
if(tempkey==8)
key=16;
}

if(key==0)
{
PORTC=0x20;
keydelay();
tempkey=PORTC&0xf;
if(tempkey==1)
key=2;
if(tempkey==2)
key=5;
if(tempkey==4)
key=8;
if(tempkey==8)
key=10;
}


if(key==0)
{
PORTC=0x10;
keydelay();
tempkey=PORTC&0xf;
if(tempkey==1)
key=1;
if(tempkey==2)
key=4;
if(tempkey==4)
key=7;
if(tempkey==8)
key=15;
}

}


}
 

Dear rajudp,
Thanks for your reply. I am using AT89S52. NOT PIC. Please help me to do my program as follows

I need to get the enter key number for following FOR loops. How can I filter that. How can I get the pressed key instead of

if(SBUF = 1)
{
Task 1
}

else if(SBUF = 2)
{
Task 2
}

else if (SBUF = '*')
{
Task 3
}

How can I clear the SBUF ? I want to clear the SBUF before I enter the message which I need to send through the GSM module. How can I do that in Task 3. Following is my full program.
Thanks
2012-05-21_013315.jpg
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top