8051 interfacing with keypad

8051 interfacing with keypad


/*
developed by S4silver
license type - open source
created on - 11/12/2014
modified on - 11/14/2014
modification details - refactored
developer - Frank Hust Jincson
contact mail id - silverembeddedsolutions@gmail.com
web link - http://s4silver.blogspot.in/p/programmers-colony.html
*/

#include <REGX51.H>
sbit RS = P3^6;
sbit EN = P3^7;
void keypad_routine(void );
void delay(unsigned char del)
{
 unsigned int i,j;
 for(i=0;i<del;i++)
  for(j=0;j<250;j++);
}
void lcd_cmd(unsigned char cmd)
{
 P1 = cmd;
 RS=0;
 EN=1;
 delay(2);
 EN=0;
}
void lcd_data(unsigned char dat)
{
 P1 = dat;
 RS=1;
 EN=1;
 delay(2);
 EN=0;
}
int main()
{
 unsigned int i;
 unsigned char c;

 SCON=0x50;  TMOD=0x20;
 TH1=-6;     // 0xFD=253      9600
 TR1=1;

 P2=0x0F;
 P1=0x00;
 RS=0;
 EN=0;

 lcd_cmd(0x38);       // 2 line 8 bit mode  
 lcd_cmd(0x01);  // Reset LCD Display
 lcd_cmd(0x06);  // Shift Display Right
 lcd_cmd(0x0C);  // Display ON cursor Blinking

 lcd_cmd(0x80);       // First Line First Display
 lcd_data('A');
 SBUF='A';
 while(!TI);
 TI=0;
 while(1)
 {
   keypad_routine();
 }
}
void keypad_routine()
{
 unsigned int j;

 P2=0x7E; //row 0 selected  0111 1110
 if((!P2_4)&&(P2_5)&&(P2_6))
  {
   lcd_data('1');
   delay(100);
  }
  else if((P2_4)&&(!P2_5)&&(P2_6))
  {
   lcd_data('2');
   delay(100);
  }
  else if((P2_4)&&(P2_5)&&(!P2_6))
  {
   lcd_data('3');
   delay(100);
  }

  P2=0x7D; //row 1 selected  0111 1101
  if((!P2_4)&&(P2_5)&&(P2_6))
  {
   lcd_data('4');
   delay(100);
  }
  else if((P2_4)&&(!P2_5)&&(P2_6))
  {
   lcd_data('5');
   delay(100);
  }
  else if((P2_4)&&(P2_5)&&(!P2_6))
  {
   lcd_data('6');
   delay(100);
  }
  P2=0x7B; //row 2 selected  0111 1011
  if((!P2_4)&&(P2_5)&&(P2_6))
  {
   lcd_data('7');
   delay(100);
  }
  else if((P2_4)&&(!P2_5)&&(P2_6))
  {
   lcd_data('8');
   delay(100);
  }
  else if((P2_4)&&(P2_5)&&(!P2_6))
  {
   lcd_data('9');
   delay(100);
  }
  P2=0x77; //row 3 selected  0111 0111
  if((!P2_4)&&(P2_5)&&(P2_6))
  {
//   lcd_cmd(0x01);lcd_cmd(0x80);
   lcd_data('*');
   delay(100);
  }
  else if((P2_4)&&(!P2_5)&&(P2_6))
  {
  lcd_data('0');
  delay(100);
 }
 else if((P2_4)&&(P2_5)&&(!P2_6))
 {
  lcd_data('#');
  delay(100);

 }
}