📄 keyscan.asm
字号:
;**********************************************
;Name :mnkey
;Function:
;Input :
;Output :
;Register Used:
;***********************************************
mnkey:
call keyin
call keychk
call keycvt
mnkey90:
ret
;**********************************************
;Name :keyin
;Function:keyinbuf.7=0:key on line0,=1:key on line1
;Input :
;Output :
;Register Used:var1,var2
;***********************************************
keyin:
;-----
mov_ var1,p2 ;push p2 value
;// mov_ var2,p4
mov a,#11110000b
or p4,a
call p2input
clr keyinbuf
;----
;start scan key
;line0
bclr line0
call delay_10us
mov a,p2
and a,#01111111b
mov keyinbuf,a
xor a,#01111111b
b0bts1 fz
jmp keyin80 ;line0 上有键按下,退出line1扫描
;-----
;line1 ;line0 上无键按下,接着扫描line1
bclr line1
call delay_10us
mov a,p2
and a,#01111111b
mov keyinbuf,a
xor a,#01111111b
b0bts0 fz
jmp keyin80 ;line1 上无键按下
;----
bset keyinbuf.7 ;line1 上有键按下
;------
keyin80:
bset line0
bset line1
;----
call p2output
mov_ p2,var1 ;pop p2 value
;// mov_ p4,var2
;---
keyin90:
ret
;**********************************************
;Name :keychk
;Function:
;Input :
;Output :
;Register Used:
;***********************************************
keychk:
mov a,keyinbuf ;check line0 state
cmprs a,keychkbuf
jmp keychk10
b0bts1 keystatflag ;check have key push or not?
jmp keychk90
mov a,keychat ;banish key's dithering
b0bts1 fz
jmp keychk90
mov a,keychkbuf ;save key value
mov keycvtbuf,a
bclr keystatflag
jmp keychk90
;---
keychk10:
mov a,keyinbuf ;send key state to bufram
mov keychkbuf,a
bset keystatflag ;set key push flag
mov a,#3 ;3
mov keychat,a ;banish key's dithering 30ms
;---
keychk90:
ret
;**********************************************
;Name :keycvt
;Function:
;Input :
;Output :
;Register Used:temp3,temp4
;***********************************************
keycvt:
mov a,keycvtbuf ;convert key value
cmprs a,keyoldbuf
jmp keycvt10
jmp keycvt90
;-----------------------------------------
keycvt10:
b0bts0 lineflag ;=0:line0 key,=1:line1 key
jmp line1keypush
;----
;line0 key push
mov a,keycvtbuf
mov keyoldbuf,a
or a,#10000000b
mov temp3,a
mov_ temp4,#7
;-----------------------------------------
loopline0:
bclr fc
rrcm temp3
b0bts1 fc
jmp line0getonekey
decms temp4
jmp loopline0
;-----
bset keyokflag
ret
;-----
line0getonekey:
mov a,temp4
mov aplcode,a
ret
;------------------------------------------
line1keypush:
mov a,keycvtbuf
mov keyoldbuf,a
or a,#10000000b
mov temp3,a
;----
and a,#00000011b
b0bts0 fz
jmp twokeypush
mov_ temp4,#5
loopline1:
bclr fc
rrcm temp3
b0bts1 fc
jmp line1getonekey
decms temp4
jmp loopline1
;-----
bset keyokflag
ret
;-----
line1getonekey:
mov a,temp4
add a,#7
mov aplcode,a
ret
;----
twokeypush:
mov a,#13
mov aplcode,a
bset keyokflag
;-----
keycvt90:
ret
;*******************************************************
;*******************************************************
;*******************************************************
p2input:
clr p2m ;set p2 is input
mov_ p2ur,#0ffh ;set p2 have pull_up
jmp $+1
jmp $+1
ret
;-----------------
p2output:
mov_ p2m,#0ffh ;set p2 is output
clr p2ur ;clr p2 pull_up
jmp $+1
jmp $+1
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -