| ??? 09/14/06 09:45 Read: times |
#124282 - commented code Responding to: ???'s previous message |
Here is the code of SCAN KEYS with commnets.
I hope it is readable, if not then reply what are the probs you are facing. Also reply mw the error in logic regards AS
SCAN_MATRIX_KEYBOARD:
acall DELAY ; calls the 30 MS delay subroutine
mov a, p1 ; mov the value of p1 to acc
push acc ; value of acc is preserved
anl a, #0fh ; higher nibble is made low ie ROW
cjne a, #0fh, AHEAD ;if the Lower Nibble ie Coulmn reading is not high then
; it means any column has been pressed
; jump to subroutine AHEAD
sjmp SCAN_MATRIX_KEYBOARD ; otherwise LOOP
AHEAD:
pop acc ; get back the original value of p1
anl a, #0f0h ; Make lower Nibbles ie column low
cjne a, #0f0h, PROCESS_SCAN ; if the higher nibbles ie ROW are not high
; it means any ROW is pressed
; then jump to PROCESS_SCAN
sjmp SCAN_MATRIX_KEYBOARD ; otherwise LOOP
PROCESS_SCAN:
mov a, p1 ; once agin move the value of p1 to acc
cpl a ; compliment it and find whether actually a key is pressed or not
jz SCAN_MATRIX_KEYBOARD ;
cpl a ; get the original value of p1
push acc ; preserve this value of p1
anl a, #0fh
cjne a, #0fh, ROW_SCAN_1 ;; again check any column had been pressed or not
sjmp SCAN_MATRIX_KEYBOARD
ROW_SCAN_1:
pop acc ; get the original value of acc agian to check which row is pressed
anl a, #0f0h ; make higher nibbles high
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'
|



