This article is about interfacing a hex key pad to 8051 microcontroller. A clear knowledge on interfacing hex key pad to 8051 is  very essential  while designing embedded system projects which requires character or numeric input or both. For example projects like digital code lock, numeric calculator etc. Before going to the interfacing in detail, let’s have a look at the hex keypad.

Hex keypad.

Hex key pad is essentially a collection of 16 keys arranged in the form of a 4×4 matrix. Hex key pad usually have keys representing numerics 0 to 9 and characters A to F. The simplified diagram of a typical hex key pad is shown in the figure below.

4x4 keypad
Hex keypad

The hex keypad has 8 communication lines namely R1, R2, R3, R4, C1, C2, C3 and C4.  R1 to R4 represents the four rows and C1 to C4 represents the four columns. When a particular key is pressed the corresponding row and column to which the terminals of the key are connected gets shorted. For example if key 1 is pressed row R1 and column C1 gets shorted and so on. The program identifies which key is pressed by a method known as column scanning. In this method a particular row is kept low (other rows are kept high) and the columns are checked for low. If a particular column is found low then that means that the key connected between that column and the corresponding row (the row that is kept low) is been pressed. For example if  row R1 is initially kept low and column C1 is found low during scanning, that means key 1 is pressed.

Interfacing hex keypad to 8051.

The circuit diagram for demonstrating interfacing hex keypad to 8051 is shown below.Like previous 8051 projects, AT89S51 is the microcontroller used here. The circuit  will display the character/numeric pressed on a seven segment LED display. The circuit is very simple and it uses only two ports of the microcontroller, one for the hex keypad and the other for the seven segment LED display.

interfacing 4x4 keypad to 8051
Interfacing hex keypad to 8051

 The hex keypad is interfaced to port 1 and seven segment LED display is interfaced to port 0 of the microcontroller. Resistors R1 to R8 limits the current through the corresponding segments of the LED display. Capacitors C1, C2 and crystal X1 completes the clock circuitry for the microcontroller. Capacitor C3, resistor R9 and push button switch S1 forms a debouncing reset mechanism.


MOV DPTR,#LUT // moves starting address of LUT to DPTR
MOV A,#11111111B // loads A with all 1's
MOV P0,#00000000B // initializes P0 as output port

BACK:MOV P1,#11111111B // loads P1 with all 1's
     CLR P1.0  // makes row 1 low
     JB P1.4,NEXT1  // checks whether column 1 is low and jumps to NEXT1 if not low
     MOV A,#0D   // loads a with 0D if column is low (that means key 1 is pressed)
     ACALL DISPLAY  // calls DISPLAY subroutine
NEXT1:JB P1.5,NEXT2 // checks whether column 2 is low and so on...
      MOV A,#1D
      MOV A,#2D
      MOV A,#3D
      CLR P1.1
      JB P1.4,NEXT5
      MOV A,#4D
      MOV A,#5D
      MOV A,#6D
      MOV A,#7D
      CLR P1.2
      JB P1.4,NEXT9
      MOV A,#8D
      MOV A,#9D
       MOV A,#10D
       MOV A,#11D
       CLR P1.3
       JB P1.4,NEXT13
       MOV A,#12D
       MOV A,#13D
       MOV A,#14D
       MOV A,#15D
       LJMP BACK

DISPLAY:MOVC A,@A+DPTR // gets digit drive pattern for the current key from LUT
        MOV P0,A       // puts corresponding digit drive pattern into P0

LUT: DB 01100000B // Look up table starts here
     DB 11011010B
     DB 11110010B
     DB 11101110B
     DB 01100110B
     DB 10110110B
     DB 10111110B
     DB 00111110B
     DB 11100000B
     DB 11111110B
     DB 11110110B
     DB 10011100B
     DB 10011110B
     DB 11111100B
     DB 10001110B
     DB 01111010B

About the program.

Firstly the program initializes port 0 as an output port by writing all 0’s to it and port 1 as an input port by writing all 1’s to it. Then the program makes row 1 low by clearing P1.0 and scans the columns one by one for low using JB instruction.If column C1 is found low, that means 1 is pressed and accumulator is loaded by zero and DISPLAY subroutine is called. The display subroutine adds the content in A with the starting address of LUT stored in DPTR and loads A with the data to which the resultant address points (using instruction MOVC A,@A+DPTR). The present data in A will be the digit drive pattern for the current key press and this pattern is put to Port 0 for display. This way the program scans for each key one by one and puts it on the display if it is found to be pressed.


  • The 5V DC power supply must be well regulated and filtered.
  • Column scanning is not the only method to identify the key press. You can use row scanning also. In row scanning a particular column is kept low (other columns are kept high) and the rows are tested for low using a suitable branching instruction. If a particular row is observed low then that means that the key connected between that row and the corresponding column (the column that is  kept low) is been pressed. For example if  column C1 is initially kept low and row R1  is observed low during scanning, that means key 1 is pressed.
  • A membrane type hex keypad was used during the testing. Push button switch type and dome switch type will also work. I haven’t checked other types.
  • The display used was a common cathode seven segment LED display with type number ELK5613A. This is just for information and any general purpose common cathode 7 segment LED display will work here.



A short video clip of the circuit being tested is shown below.



  1. Pin no 1 of Microcontroller is connected to h of display.It is correct??

  2. could you please why you put 0D in A ? why this value please answer me
    thank you so much

  3. Where does the source of the keypad coming from, basing the circuit?

  4. can anyone tell me… what it’s application?

  5. How can I interface a hex keypad and two 7 segment display with 8051, to display two digit no

  6. sankaranandam

    How the schematic diagrams are drawn please tell the software.

    • Ajit Karandikar

      Hexadecimal number to Seven segment mapping (the abcdefg components) of the digit display unit

      f | | b

      e | | c


      The central dash is the g display.

      Thus to display number 1 only the segments b and c need to light up, so the code abcdefg will be 0110000. Which would be the number stored in the memory of the look up table.

  7. How to decrement 256 in 8051 microcontroller sir…pls reply me soon…

  8. Sir I am write this for the second time. This project is one that make use of DTMF technology.Now I have writen a program to interface it with 8051 to switch off and ON a car ignation using a mobile hand set and it worked but I want the system to behave in such away that the hand set stack in the sysem will send a text message to the remote handset comfirming that the car has switched Off.pls look into this project and post on ur site forevery body

  9. Sir pls permit me to sugest my oppion to u. Refering u to this site”” could give u the insite of what I have in mind for this site to be doing if welcomed sir guested if this issue of inovations comes into play more student will be glad because ur site is great one especailly in microcontroller. Pls

  10. Great work from this site, dear Admin I USE thIS Time to thank u all for the nice project work that is comming out from here and also to commend u of ur improvement.Now u ve added the video part of ur project good one indeed now the next improvement that student is expecting from this site is using proteus i.e including simulated version of ur work in the said proteus professional.

    • How does it works in Proteus؟
      is the program correct?