#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 lcdcmd(unsigned char value);
void lcddata(unsigned char value);
void Delay(unsigned int itime);
void SerTX(unsigned char);
unsigned char msg[] = "Pressed Key:-";
unsigned char keypad[4][4] = {'1','2','3','4',
'5','6','7','8',
'9','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
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) //This means that First column is Selected
{
SerTX(keypad[rowLoc][0]);
}
else if(colLoc == 0x0D)
{
SerTX(keypad[rowLoc][1]);
}
else if(colLoc == 0x0B)
{
SerTX(keypad[rowLoc][2]);
}
else if(colLoc == 0x07)
{
SerTX(keypad[rowLoc][3]);
}
//lcdcmd(0xC0); //Second Row
//Check Columns and send the Data to the LCD Screen:-
if(colLoc == 0x0E) //This means that First column is Selected
{
lcddata(keypad[rowLoc][0]);
}
else if(colLoc == 0x0D)
{
lcddata(keypad[rowLoc][1]);
}
else if(colLoc == 0x0B)
{
lcddata(keypad[rowLoc][2]);
}
else if(colLoc == 0x07)
{
lcddata(keypad[rowLoc][3]);
}
}
}
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;
}