| ??? 09/15/06 04:24 Read: times |
#124339 - more Informative code Responding to: ???'s previous message |
Hello All,
I have commnted the code in more expressive way SCAN_MATRIX_KEYBORAD Subroutine is to find whhether any column is low or not. If yes then jump to AHEAD subroutine. AHEAD Subroutine is to find any row is low ot not. If any row is low then jump to PROCESS SCAN. PROCESS_SCAN subroutine is to check last time whethere any column is low or not. If yes then jump to ROW_SCAN_1. ROW_SCAN_1 subroutine is to check whether the 1st row is low or not. If it is the case then jump to ROW_1 and get the corresponding value of row in dptr which is in the form of LOOKUP TABLE. If still there is a probs in getting the code. Revrt me with the probs. regards AS
SCAN_MATRIX_KEYBOARD:
acall DELAY ; calls the 30 MS delay subroutine
mov a, p1
push acc ; value of P1 is preserved
anl a, #0fh ; higher nibble is made low ie ROW to check
; whether a coumn is low or not
cjne a, #0fh, AHEAD ;if the Lower Nibble ie Coulmn reading is not high then
; it means any columnis low
; jump to subroutine AHEAD
sjmp SCAN_MATRIX_KEYBOARD ; otherwise LOOP
AHEAD:
pop acc ; get back the original value of p1 ie the keypressed
anl a, #0f0h ; Make lower Nibbles ie column low to check whether
; a ROW has been presse
cjne a, #0f0h, PROCESS_SCAN ; if the higher nibbles ie ROW are not high
; it means any key is pressed and
; correspodingly the ROW is low
; then jump to PROCESS_SCAN
sjmp SCAN_MATRIX_KEYBOARD ; otherwise LOOP
PROCESS_SCAN:
mov a, p1 ;get the value of keypressed in A
cpl a ; compliment it and find whether actually a key is pressed or not
; if all the rows and coulmns are high it means no key is being pressed
jz SCAN_MATRIX_KEYBOARD ;if no key is pressed then jump SCAN_MATRIX_KEYBORAD
; by seeking value zero in A
cpl a ; get the original value of p1
push acc ; preserve this value of p1
anl a, #0fh ;for again checking whether any coumn is low or not
cjne a, #0fh, ROW_SCAN_1 ; if any column is low then jump to find the corresponding row
sjmp SCAN_MATRIX_KEYBOARD
ROW_SCAN_1:
pop acc ; get the original value of keypressed again to check which row is pressed
anl a, #0f0h ; make higher nibbles high so that the row which is low can be trassed
; as upto now it is scanned that a column is low
cjne a, #0e0h, ROW_SCAN_2 ; if ROW 1 has been pressed then jump to ROW_1
; otherwise jump to ROW_2 checking
sjmp ROW_1
ROW_SCAN_2:
cjne a, #0d0h, ROW_SCAN_3
sjmp ROW_2
ROW_SCAN_3:
cjne a, #0b0h, ROW_SCAN_4
sjmp ROW_3
ROW_SCAN_4:
cjne a, #70h, SCAN_MATRIX_KEYBOARD
sjmp ROW_4
ROW_1:
mov dptr, #CODE1
sjmp FINAL
ROW_2:
mov dptr, #CODE2
sjmp FINAL
ROW_3:
mov dptr, #CODE3
sjmp FINAL
ROW_4:
mov dptr, #CODE4
FINAL:
mov a, p1 ; get the original value of p1 so that the COlumn can be sestimated from here
clr c ; clear carry flag
SUB_FINAL:
rrc a ; rotate right untill carry is clear
jnc MATCH ; if the carry is clear then jump to MATCH
inc dptr ; if carry is not clear then increment the DPTR
sjmp SUB_FINAL ; LOOP
MATCH:
clr a ; clear acc
movc a,@a+dptr ; move the value of dptr to ACC
;mov r6, a
push acc ; preserve this value
ret
CODE1: db '1','2','3','4'
CODE2: db '5','6','7','8'
CODE3: db '9','10','11','12'
CODE4: db '13','14','15','16'
|



