
org 8000h
start:

poll:
lcall keypressed
jnc poll
lcall findrow
mov b,a
jnc getcolumn
lcall print
db "Error - Key row not found", 0
lcall crlf

kp1:
lcall keypressed
jc kp1
sjmp start

getcolumn:
lcall findcolumn
swap a
orl a, b
mov b, a
jnc reportkey

lcall print
db "Error - key row not dound", 0
lcall crlf

kp2:
lcall keypressed
jc kp2
sjmp start

reportkey:
lcall displaykey
lcall convertkey
lcall display
mov sbuf, a

kp3:
lcall keypressed
jc kp3
ljmp start

keypressed:
mov p1, #0Fh
mov a, p1
orl a, #0f0h
cpl a
jz nokey
setb C
ret

nokey:
clr C
ret

findrow:
mov a, p1
mov r0, #4

trynextrow:
rrc a
jnc rowfound
djnz r0, trynextrow
setb C
ret

rowfound:
mov a, #4
subb a, r0
clr C
ret

findcolumn:
mov r0, #4
mov a, #0EFh
push acc

trynextcolumn:
pop acc
mov p1, a
rl a
push acc
mov a, p1
orl a, #0f0h
cpl a
jnz columnfound
djnz r0, trynextcolumn
pop acc
setb C
ret

columnfound:
pop acc
mov a, #4
clr C
subb a, r0
clr C
ret

displaykey:
lcall print
db "Key Pressed - column and row: ", 0
mov a, b
lcall prthex
lcall crlf
ret

convertkey:
mov a, b
rl a
rl a
mov C, acc.6
mov acc.0, C
mov C, acc.7
mov acc.1, C
anl acc, #0fh
ret

crlf:
mov a, #0dh
lcall sndchr

sndchr:
clr ti
mov sbuf, a

delay:
dec a
d_olp:
push acc
mov a, #0a6h
d_ilp:
inc a
nop
nop
nop
nop
nop
nop
nop
nop
jnz d_ilp
nop
nop
nop
pop acc
djnz acc, d_olp
mov a, #0a6h
d_lp2:
inc a
nop
nop
nop
nop
nop
nop
nop
nop
jnz d_lp2
nop
nop
nop
nop
nop
ret

display:
inc a
movc a, @a+pc
ret
db 0c0h
db 0f9h
db 0a4h
db 0b0h
db 99h
db 92h
db 82h
db 0f8h
db 80h
db 90h
db 88h
db 83h
db 0c6h
db 0a1h
db 86h
db 8eh

getchr:
jnb ri, getchr
mov a, sbuf
clr acc.7
clr ri
ret

inkey:
mov a, #00h
jnb ri, doneik
mov a, sbuf
anl a, #7fh
clr ri
doneik:
ret

prthex:
lcall binasc
lcall sndchr 
mov a, r2
lcall sndchr
ret

binasc:
mov r2, a
anl a, #0fh
add a, #0f6h
jnc noadj1
add a, #07h
noadj1:
add a, #3ah
xch a, r2

swap a
anl a, #0fh
add a, #0f6h
jnc noadj2
add a, #07h
noadj2:
add a, #3ah
ret

print:
pop dph
pop dpl
prtstr:
clr a
movc a, @a+dptr
cjne a, #0h, mchrok
sjmp done

mchrok:
lcall sndchr
inc dptr
ljmp prtstr
done:
mov a, #1h
jmp @a+dptr

end

