Hex Keypad Interfacing with 8051:

The Assembly Code:

 

ASM Code:
ORG 0000H ;set origin MOV P2, #0FFH ;select p2 as output port LJMP MAIN ;jump to main program DELAY_1SEC: ;to give delay of 1second using timer0 in mode 1 MOV TMOD, #01H MOV R1, #14 XY: MOV TH0, #00H MOV TL0, #00H SETB TR0 JNB TF0, $ CLR TF0 CLR TR0 DJNZ R1, XY RET DELAY: ;to give lcd some time to write MOV R1, #05H S2: MOV R0, #0FFH S1: DJNZ R0, S1 DJNZ R1, S2 RET WRITE_CMD: ;command subroutine to write command to lcd CLR P3.7 ;register select bit cleared to choose command register MOV P1, A ;port 1 acts as input to lcd SETB P3.6 ;enable pin high to low for write operation CLR P3.6 ; LCALL DELAY ;give lcd some time delay RET ;return to main program WRITE_CHR: ;data subroutine to write data to lcd SETB P3.7 ;register select bit set high to choose data register MOV P1, A ;port 1 acts as input to lcd SETB P3.6 ;enable pin high to low for write operation CLR P3.6 ; LCALL DELAY ;give lcd some time delay RET ;return to main program INI_LCD: ;initialise lcd MOV A, #38H ;two lines 5x8 matrix LCALL WRITE_CMD ;call command subroutine MOV A, #0CH ;display on, cursor off LCALL WRITE_CMD ;call command subroutine MOV A, 06H ;increment cursor(shift cursor to right) LCALL WRITE_CMD ;call command subroutine RET ;return to main program B1: ;subroutine to type 'e' MOV A, #'E' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD1 B2: ;subroutine to type '1' MOV A, #'1' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD2 B3: ;subroutine to type '4' MOV A, #'4' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD3 B4: ;subroutine to type '7' MOV A, #'7' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD4 B5: ;subroutine to type '0' MOV A, #'0' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD5 B6: ;subroutine to type '2' MOV A, #'2' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD6 B7: ;subroutine to type '5' MOV A, #'5' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD7 B8: ;subroutine to type '8' MOV A, #'8' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD8 B9: ;subroutine to type 'f' MOV A, #'F' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD9 B10: ;subroutine to type '3' MOV A, #'3' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD10 B11: ;subroutine to type '6' MOV A, #'6' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD11 B12: ;subroutine to type '9' MOV A, #'9' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD12 B13: ;subroutine to type 'd' MOV A, #'D' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD13 B14: ;subroutine to type 'c' MOV A, #'C' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD14 B15: ;subroutine to type 'b' MOV A, #'B' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD15 B16: ;subroutine to type 'a' MOV A, #'A' LCALL WRITE_CHR LCALL DELAY_1SEC LJMP KEYPAD16 MAIN: ;main program LCALL INI_LCD ;call initialise lcd KEYPAD: CLR P2.0 ;clear 1st column JNB P2.4, B1_1 ;check if 'e' pressed KEYPAD1: JNB P2.5, B2_1 ;check if '1' pressed KEYPAD2: JNB P2.6, B3_1 ;check if '4' pressed KEYPAD3: JNB P2.7, B4_1 ;check if '7' pressed KEYPAD4: SETB P2.0 ;if no key is pressed in column 1 rhen set 1st column CLR P2.1 ;clear 2nd column JNB P2.4, B5_1 ;check if '0' pressed KEYPAD5: JNB P2.5, B6_1 ;check if '2' pressed KEYPAD6: JNB P2.6, B7_1 ;check if '5' pressed KEYPAD7: JNB P2.7, B8_1 ;check if '8' pressed KEYPAD8: SETB P2.1 ;if no key is pressed in column 2 rhen set 2nd column CLR P2.2 ;clear 3rd column JNB P2.4, B9_1 ;check if 'f' pressed KEYPAD9: JNB P2.5, B10_1 ;check if '3' pressed KEYPAD10: JNB P2.6, B11_1 ;check if '6' pressed KEYPAD11: JNB P2.7, B12_1 ;check if '9' pressed KEYPAD12: SETB P2.2 ;if no key is pressed in column 3 rhen set 3rd column CLR P2.3 ;clear 4th column JNB P2.4, B13_1 ;check if 'd' pressed KEYPAD13: JNB P2.5, B14_1 ;check if 'c' pressed KEYPAD14: JNB P2.6, B15_1 ;check if 'b' pressed KEYPAD15: JNB P2.7, B16_1 ;check if 'a' pressed KEYPAD16: SETB P2.3 ;if no key is pressed in column 4 rhen set 4th column LJMP KEYPAD STOP: SJMP STOP ; B1_1: ;subroutine to call b1 to display 'e' ACALL DEBOUNCE_DELAY JNB P2.4, KEYPAD1 LJMP B1 B2_1: ;subroutine to call b2 to display '1' ACALL DEBOUNCE_DELAY JNB P2.5, KEYPAD2 LJMP B2 B3_1: ;subroutine to call b3 to display '4' ACALL DEBOUNCE_DELAY JNB P2.6, KEYPAD3 LJMP B3 B4_1: ;subroutine to call b4 to display '7' ACALL DEBOUNCE_DELAY JNB P2.7, KEYPAD4 LJMP B4 B5_1: ;subroutine to call b5 to display '0' ACALL DEBOUNCE_DELAY JNB P2.4, KEYPAD5 LJMP B5 B6_1: ;subroutine to call b6 to display '2' ACALL DEBOUNCE_DELAY JNB P2.5, KEYPAD6 LJMP B6 B7_1: ;subroutine to call b7 to display '5' ACALL DEBOUNCE_DELAY JNB P2.6, KEYPAD7 LJMP B7 B8_1: ;subroutine to call b8 to display '8' ACALL DEBOUNCE_DELAY JNB P2.7, KEYPAD8 LJMP B8 B9_1: ;subroutine to call b9 to display 'f' ACALL DEBOUNCE_DELAY JNB P2.4, KEYPAD9 LJMP B9 B10_1: ;subroutine to call b10 to display '3' ACALL DEBOUNCE_DELAY JNB P2.5, KEYPAD10 LJMP B10 B11_1: ;subroutine to call b11 to display '6' ACALL DEBOUNCE_DELAY JNB P2.6, KEYPAD11 LJMP B11 B12_1: ;subroutine to call b12 to display '9' ACALL DEBOUNCE_DELAY JNB P2.7, KEYPAD12 LJMP B12 B13_1: ;subroutine to call b13 to display 'd' ACALL DEBOUNCE_DELAY JNB P2.4, KEYPAD13 LJMP B13 B14_1: ;subroutine to call b14 to display 'c' ACALL DEBOUNCE_DELAY JNB P2.5, KEYPAD14 LJMP B14 B15_1: ;subroutine to call b15 to display 'b' ACALL DEBOUNCE_DELAY JNB P2.6, KEYPAD15 LJMP B15 B16_1: ;subroutine to call b16 to display 'a' ACALL DEBOUNCE_DELAY JNB P2.7, LOOP LJMP B16 LOOP: LJMP KEYPAD16   DEBOUNCE_DELAY: ; a key debouncing delay algorithm MOV TMOD, #10H MOV TH1, #00H MOV TL1, #00H MOV R2, #4 AGAIN: SETB TR1 WAIT: JNB TF1, WAIT CLR TR1 CLR TF1 DJNZ R2, AGAIN RET END ;end of main program  

Download the model and code from here.