scan_code EQU 30H
ORG 0000H
JMP start
ORG 0030H
start:
MOV P0,#0FFH ;初始化p0口,使輸出無顯示
loop: ; 循環調用read—key獲取鍵盤信息,若鍵盤按下,
CALL read_key ; 則用R7返回鍵值信息
CJNE R7,#0FFH,next ; 若R7返回值不為0xff,則調用顯示函數
JMP loop
next: ;顯示程序
MOV A,R7
MOV DPTR,#disp_code
MOVC A,@A+DPTR
MOV P0,A
JMP loop
read_key:
MOV scan_code,#7FH
MOV P1,#0FH
MOV A,P1
MOV R7,#0FFH
CJNE A,#0FH,wait_key ;鍵盤按下則p1的值會改變
JMP end_key
wait_key:
CALL delay_10ms ;延時10ms,若p1口仍右鍵按下,則跳到scan—key
MOV A,P1
MOV R7,#0FFH
MOV R6,#4
CJNE A,#0FH,scan_key
JMP end_key
scan_key:
MOV P1,scan_code ;將0x7f循環右移并賦給P1
MOV A,P1
CJNE A,scan_code,get_key;p1的值改變則確定出其行數
RR A
MOV scan_code,A
DJNZ R6,scan_key
JMP end_key
get_key:
; MOV P1,#0FH
; MOV R1,P1
; CJNE R1,#0FH,$
MOV R7,#4
get_key0:
JNB ACC.0,add_r6;移位循環判斷最低位,為0則確定其列數
RR A
DJNZ R7,get_key0
MOV R7,#0FFH
JMP end_key
add_r6:
DEC R6 ;從第0個鍵盤數起,數滿(R6-1)*4個鍵盤,再加上第R6行
MOV A,R6 ;的列數R7-1,便得第幾個鍵盤按下
MOV B,#4
MUL AB
DEC R7
ADD A,R7
MOV R7,A
end_key:
RET
delay_10ms:
MOV R7,#10
delay0:
MOV R6,#0FAH
delay1:
NOP ; 1us
NOP ; 1us
……………………
|