...insert code hereORG 00H
MOV P,#0FFH                     ;make port 0 input
K1: MOV P1,#0                   ;ground all rows
MOV A,P2                        ;read all columns check if all keys open
ANL A,#00001111B                ;mask lower four bits
CJNE A,#00001111B,K1            ;check till all keys are released
K2: ACALL DELAY                 ;wait for debounce
MOV A,P2                        ;read columns
ANL A,#00001111B                ;mask
CJNE A,#00001111B,OVER          ;see if any key pressed
SJMP K2                         ;no key pressed
OVER: ACALL DELAY               ;wait for debounce
MOV A,P2                        ;read all columns 
ANL A,#00001111B                ;mask
CJNE A,#00001111B,OVER1         ;see if any key pressed
SJMP K2                         ;no key pressed
OVER1: MOV P1,#11111110B        ;ground first row
MOV A,P2                        ;read columns
ANL A,#00001111B                ;mask lower four bits
CJNE A,#00001111B,ROW_0         ;check if any key pressed
MOV P1,#11111101B               ;no key pressed check second row
MOV A,P2                        
ANL A,#00001111B
CJNE A,#00001111B,ROW_1           
MOV P1,#11111011B                ;no key pressed check third row
MOV A,P2
ANL A,#00001111B
CJNE A,#00001111B,ROW_2
MOV P1,#11110111B                 ;no key pressed check fourth row
MOV A,P2                          
ANL A,#00001111B
CJNE A,#00001111B,ROW_3
LJMP K2                          ;do it again
ROW_0: MOV DPTR,#KCODE0          ;load key row 0
SJMP FIND                        ;find which one is pressed
ROW_1: MOV DPTR,#KCODE1          ;load key row 1
SJMP FIND                        ;find which one is pressed
ROW_2: MOV DPTR,#KCODE2          ;load key row 2
SJMP FIND                        ;find which key is pressed
ROW_3: MOV DPTR,#KCODE3          ;load key row 3
FIND: RRC A
JNC MATCH
INC DPTR
SJMP FIND
MATCH: CLR A                     ;if key is grounded then thise the key pressed
MOVC A,@A+DPTR
MOV P3,A                         ;move ascii code for the pressed key
LJMP K1                          ;do it infintely                    
ORG 300H
KCODE0: DB '0','1','2','3'	 ;ROW 0
KCODE1: DB '4','5','6','7'   ;ROW 1
KCODE2: DB '8','9','A','B'   ;ROW 2
KCODE3: DB 'C','D','E','F'   ;ROW 3
DELAY: MOV TMOD,#01H                 ;thise is the delay subroutine
MOV TL0,#0FFH
MOV TH0,#0B7H
SETB TR0
WAIT: JNB TF0,WAIT
CLR TR0
CLR TF0
RET
END