|
scan_code EQU 30H
ORG 0000H
JMP start
ORG 0030H
start:
MOV P0,#0FFH ;初始化p0口,使輸出無(wú)顯示
loop: ; 循環(huán)調(diào)用read—key獲取鍵盤(pán)信息,若鍵盤(pán)按下,
CALL read_key ; 則用R7返回鍵值信息
CJNE R7,#0FFH,next ; 若R7返回值不為0xff,則調(diào)用顯示函數(shù)
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 ;鍵盤(pán)按下則p1的值會(huì)改變
JMP end_key
wait_key:
CALL delay_10ms ;延時(shí)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循環(huán)右移并賦給P1
MOV A,P1
CJNE A,scan_code,get_key;p1的值改變則確定出其行數(shù)
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;移位循環(huán)判斷最低位,為0則確定其列數(shù)
RR A
DJNZ R7,get_key0
MOV R7,#0FFH
JMP end_key
add_r6:
DEC R6 ;從第0個(gè)鍵盤(pán)數(shù)起,數(shù)滿(mǎn)(R6-1)*4個(gè)鍵盤(pán),再加上第R6行
MOV A,R6 ;的列數(shù)R7-1,便得第幾個(gè)鍵盤(pán)按下
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
……………………
|
|