📄 scankey.asm
字号:
;-----
;2x7
line0 equ p5.0
line1 equ p5.1
;-----
row0 equ p2.0
row1 equ p2.1
row2 equ p2.2
row3 equ p2.3
row4 equ p2.4
row5 equ p2.5
row6 equ p2.6
;-----
;loopj=2 loopi=7
;**********************************************
;Name :mnkey
;Function:
;Input :loopi,loopj
;Output :keyvalue
;Register Used:var1,var2
;***********************************************
mnkey:
mov a,p5
and a,#11111100b
mov p5,a
call delay10us
mov a,p2
and a,#01111111b
xor a,#01111111b
b0bts0 fz ;judge have key push or not
jmp mnkey80 ;no key push
;-----
b0bts0 keypushflag ;have key push,then delay 30ms~100ms
jmp delaytime
bset keypushflag
bclr t30msflag
mov_ timer30ms,#3
jmp mnkey90
;-----
delaytime:
b0bts0 getonekeyflag
jmp longpushjudge
b0bts1 t30msflag
jmp mnkey90
jmp checkkey
;-----
longpushjudge:
b0bts1 checktimeflag ;用于长按键的判定
jmp mnkey90
b0bts1 t1sflag
jmp mnkey90
bclr t1sflag
bset keyokflag
bclr checktimeflag
jmp mnkey90
;-----
;check which key push
checkkey:
bclr t30msflag
bclr keypushflag
mov a,#7
mov loopi,a ;
;------
;line0
mov a,#11111110b
mov var1,a
scanline:
mov a,var1
and p5,a
call delay10us
mov a,p2
mov var2,a ;save line value
;----
mov a,#2
mov loopj,a
;----
loopcheck:
rrcm var2
b0bts1 fc
jmp havekeypush
decms loopj
jmp loopcheck
;-----
bset fc
rlcm var1
decms loopi
jmp scanline
ret
;----------
havekeypush:
bset getonekeyflag
mov a,loopi
sub a,#1
mov loopi,a
;----
bclr fc ;keyvalue=2x(loopi-1)+loopj
;// rlcm loopj
rlc loopi ;x2
mov keyvalue,a
mov a,loopj
add keyvalue,a
cmprs a,#9
jmp mnkey70
;-----
bset checktimeflag
mov_ timer1s,#100
bclr t1sflag
ret
;-----
mnkey70:
bset keyokflag
ret
;-----
mnkey80:
bclr keyokflag
bclr getonekeyflag
;-----
mnkey90:
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -