📄 w566&588&567.inc
字号:
FLAG DS 1
keyfg equ 01h
KEY_VALUE DS 1
LINE_COUNT DS 1
SCAN_TIME DS 4
SCAN_OLD DS 4
KEY_ENABLE DS 4 ;BITN:1->ENABLE,0->DISABLE
SCAN_NEW DS 1
;BP1.0~7 INPUT
;BP0.0~3 OUTPUT
INPUT EQU BP1
OUTPUT EQU BP0
deb_time equ 4 ;>=2
row equ 4 ;bp00~bp03
col equ 8 ;bp10~bp17
;在TIMER中扫描按键 TIMER为2MSEC INTERRUPT
SCAN_KEY:
PHX
PHY
LDX <LINE_COUNT
INC <LINE_COUNT
CPX #row-1
BCC 2
STZ <LINE_COUNT ;clear if LINE_COUNT>=row
LDA !INPUT
STA <SCAN_NEW
LDA #0FH
TSB !OUTPUT ;set all output
LDA SET_OUTPUT,X
TRB !OUTPUT ;clear next output pin
LDA <SCAN_NEW
EOR <SCAN_OLD,X
BNE KEY_CHANGE ;key status change
STZ <SCAN_TIME,X
JMP SCAN_KEY_RTN
KEY_CHANGE:
INC <SCAN_TIME,X
LDY <SCAN_TIME,X
CPY #deb_time
BCC SCAN_KEY_RTN ;scan_time,x<deb_time
STZ <SCAN_TIME,X
TAY
EOR <SCAN_OLD,X ;just nor the bit changed,
STA <SCAN_OLD,X
TYA
AND <KEY_ENABLE,X
BEQ SCAN_KEY_RTN ;disabled key pressed return
BIT <SCAN_OLD,X ;1: means 0->1(release key);0: means 1->0(press key)
BNE SCAN_KEY_RTN ;reture if release key
LDY #FFH
GET_ROW:
INY
LSR A
BCC GET_ROW
JSR METHOD2
LDA #keyfg ;set key pressed flag
TSB <FLAG
JSR GET_HOLD_KEYS_NUM
SCAN_KEY_RTN:
PLY
PLX
RTS
GET_HOLD_KEYS_NUM:
;return Y
LDX #0
LDY #0
DETECT_NEXT_ROW:
LDA #01H
DETECT_NEXT_COL:
BIT <SCAN_OLD,X
BNE 1
INY
ASL A
BCC DETECT_NEXT_COL
INX
CPX #row
BCC DETECT_NEXT_ROW
RTS
SET_OUTPUT:
DB 02H,04H,08H,01H
METHOD1:
CLC
TYA
ADC METHOD_ADJUST1,X
STA <KEY_VALUE
RTS
METHOD2:
CLC
TXA
ADC METHOD_ADJUST2,Y
STA <KEY_VALUE
RTS
METHOD_ADJUST1:
DB 0*col+1,1*col+1,2*col+1,3*col+1
DB 4*col+1,5*col+1,6*col+1,7*col+1
METHOD_ADJUST2:
DB 0*row+1,1*row+1,2*row+1,3*row+1
DB 4*row+1,5*row+1,6*row+1,7*row+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -