4×4 Keypad Interfacing with 8051 Microcontroller – Tutorial with C Programming

4X4 KEYPAD INTERFACING WITH 8051 MICROCONTROLLER

INTRODUCTION:-

  • We know that Keypads are very common amongst the widely used technology present in today’s generation.
  • They are very important as they are used to interface with various electronic devices employed in security purpose.
  • Examples of keyboard interfacing devices:-
  1. Calculators
  2. Telephones
  3. Automatic teller machine.
  • So basically there will be 16 pin input connection as a total of 16 switches will be interfaced with the Liquid Crystal display via the 8051 microcontroller device.

SOURCE CODE:

#include<reg51.h>

#define display_port P2   //Data pins connected to port 2 on microcontroller

sbit rs = P3^2;  //RS pin connected to pin 2 of port 3

sbit rw = P3^3;  // RW pin connected to pin 3 of port 3

sbit e =  P3^4; //E pin connected to pin 4 of port 3

sbit C4 = P1^0; // Connecting keypad to Port 1

sbit C3 = P1^1;

sbit C2 = P1^2;

sbit C1 = P1^3;

sbit R4 = P1^4;

sbit R3 = P1^5;

sbit R2 = P1^6;

sbit R1 = P1^7;

sbit DB0 = P2^0;

sbit DB1 = P2^1;

sbit DB2 = P2^2;

sbit DB3 = P2^3;

sbit DB4 = P2^4;

sbit DB5 = P2^5;

sbit DB6 = P2^6;

sbit DB7 = P2^7;

void msdelay(unsigned int time)  // Function for creating delay in milliseconds.

{

unsigned i,j ;

for(i=0;i<time;i++)

for(j=0;j<1275;j++);

}

void lcd_cmd(unsigned char command)  //Function to send command instruction to LCD

{

display_port = command;

rs= 0;

rw=0;

e=1;

msdelay(1);

e=0;

}

void lcd_data(unsigned char disp_data)  //Function to send display data to LCD

{

display_port = disp_data;

rs= 1;

rw=0;

e=1;

msdelay(1);

e=0;

}

void lcd_init() //Function to prepare the LCD  and get it ready

{

lcd_cmd(0x38);  // for using 2 lines and 5X7 matrix of LCD

msdelay(10);

lcd_cmd(0x0F);  // turn display ON, cursor blinking

msdelay(10);

lcd_cmd(0x01);  //clear screen

msdelay(10);

lcd_cmd(0x81);  // bring cursor to position 1 of line 1

msdelay(10);

}

void row_finder1() //Function for finding the row for column 1

{

R1=R2=R3=R4=1;

C1=C2=C3=C4=0;

if(R1==0)

lcd_data(‘1’);

if(R2==0)

lcd_data(‘4’);

if(R3==0)

lcd_data(‘7’);

if(R4==0)

lcd_data(‘*’);

}

void row_finder2() //Function for finding the row for column 2

{

R1=R2=R3=R4=1;

C1=C2=C3=C4=0;

if(R1==0)

lcd_data(‘2’);

if(R2==0)

lcd_data(‘5’);

if(R3==0)

lcd_data(‘8’);

if(R4==0)

lcd_data(‘0’);

}

void row_finder3() //Function for finding the row for column 3

{

R1=R2=R3=R4=1;

C1=C2=C3=C4=0;

if(R1==0)

lcd_data(‘3’);

if(R2==0)

lcd_data(‘6’);

if(R3==0)

lcd_data(‘9’);

if(R4==0)

lcd_data(‘#’);

}

void row_finder4() //Function for finding the row for column 4

{

R1=R2=R3=R4=1;

C1=C2=C3=C4=0;

if(R1==0)

lcd_data(‘A’);

if(R2==0)

lcd_data(‘B’);

if(R3==0)

lcd_data(‘C’);

if(R4==0)

lcd_data(‘D’);

}

void main()

{

lcd_init();

while(1)

{

    msdelay(30);

    C1=C2=C3=C4=1;

      R1=R2=R3=R4=0;

      if(C1==0)

      row_finder1();

      else if(C2==0)

       row_finder2();

       else if(C3==0)

    row_finder3();

    else if(C4==0)

    row_finder4();

}

}

KEYPAD CONNECTION DIAGRAM:

 

KEYPAD LOGIC:

  • Initially all switches are assumed to be released.
  • When any of the switch is pressed the corresponding row and column are short circuited.

STEP 1:

  • Write all logic 0’s to all the rows whereas logic 1’s to all the columns.

NOTE:

BLACK –>Logic 0

Red      –> Logic 1

STEP 2:

  • The job of the software is to scan the pins connected to that position. If a key is pressed logic 0 is driven to C2 due to short circuiting with the logic 1 of the corresponding row( R2) to the pressed keypad switch.

STEP 3:

  • As soon as the key has been pressed in column C2, the software’s job is to write the logic 1’s to each row sequentially until C2 becomes high.
  • The value written to that row will be reflected in that column as short circuit  will happen at that junction.

STEP 4:

  • The logic in C2 remains high until high logic from a row meets the pressed button in C2.
  • Therefore the pressed key was detected at position (2,2) of the matrix keypad.
  • After successful detection of the pressed key it’s our job to assign some corresponding value which may be either a numeral or an ASCiI character.

8051 FEATURES AND SPECIFICATIONS:

  • 10 kilo ohm resistor and 10 microfarad will provide the necessary Power on reset (POR) for the 8051 mc.
  • Secondly the 12 MHz crystal oscillator provides the necessary clock signal to the microcontroller.

CONNECTIONS:

  • According to the connections I have given, the keypad connections were given to Port 1 of the 8051 microcontroller.
  • Secondly the three pins namely Register select, REad/Write and Enable pins  are given to the pins P3.2, P3.3 , P3.4 respectively.
  • Finally last but not the least the data pins namely DB0-DB7 of the Liquid Crystal Display(LCD) are connected to the port P2 (P2.0-P2.7).
  • The port 0 has no internal pull up resistors so it has to be pulled by external 10 kilo ohm resistor.

Video

Click here to see a short video of Cursor Blinking.

Click here to see a short of Displaying Numeral 1 Through LCD: