📄 _scan_key.a51
字号:
;===========================================================
;scan key in timer interrupt and the interrupt time=40/(row*deb_time) msecond
;scan key or led subroutine
;output:KEY_FLAG and KEY_VALUE
;if bit KEY_FLAG =1 there is key pressed and key value store in KEY_VALUE
;otherwise no key pressed.
SCAN_KEY:
MOV R2,KEY_ROW_COUNT ;use R2 to record number of current row
MOV A,KEY_ROW_COUNT
INC A
CJNE A,#key_row_num,GET_NEW_STATE
MOV A,#00H
GET_NEW_STATE:
MOV KEY_ROW_COUNT,A
MOV A,KEY_INPUT_PORT
MOV KEY_NEW_STATE,A
MOV A,KEY_ROW_COUNT
MOV DPTR,#KEY_SCAN_TABLE
MOVC A,@A+DPTR
MOV KEY_OUTPUT_PORT,A
;^^^^^^judge key press,release or no change when need to scan key
MOV A,R2
CLR C
ADD A,#KEY_OLD_STATE1 ;use R0 to record old state of current row
MOV R0,A
MOV A,R2
CLR C
ADD A,#KEY_DEB_TIME1 ;use R1 to record debounce time of current row
MOV R1,A
MOV A,KEY_NEW_STATE
XRL A,@R0
JNZ KEY_CHANGE
MOV @R1,#00H
JMP SCAN_KEY_RET
KEY_CHANGE:
INC @R1
CJNE @R1,#debounce_time,SCAN_KEY_RET
MOV @R1,#00H
MOV R3,#0FFH ;use R3 to record column value
GET_COL_VALUE: ;value range 0~col-1
INC R3
CLR C
RRC A ;???
JNC GET_COL_VALUE
MOV @R1,#00H
MOV A,R3
MOV DPTR,#KEY_BIT_TABLE
MOVC A,@A+DPTR
PUSH ACC
XRL A,@R0
MOV @R0,A
POP ACC
if(trigger_type==0)
ANL A,@R0 ;1: means 0->1(release key);0: means 1->0(press key)
JNZ SCAN_KEY_RET ;return if release key(using falling trigger)
endif
if(trigger_type==1)
ANL A,@R0 ;1: means 0->1(release key);0: means 1->0(press key)
JZ SCAN_KEY_RET ;return if press key(using rising trigger)
endif
if(trigger_type==2)
; if(nst_sk_enkey_sel==1)
; LDA NST_SK_BIT_TAB,Y
; BIT NST_SK_SCAN_OLD,X
; BEQ 5;falling
; AND NST_SK_KEYR_ENABLE,X
; BRA 3
; AND NST_SK_KEYF_ENABLE,X
; BEQ NST_SK_SCAN_KEY_RTN
; endif
endif
LCALL ADJUST_KEY_VALUE
JC SCAN_KEY_RET ;if key_value larger than max_keyvalue,return
LCALL GET_HOLD_KEYS_NUM
JC SCAN_KEY_RET ;if hold key number >=max_hkn then jump to SCAN_KEY_RET
SETB KEY_FLAG
SCAN_KEY_RET:
RET
;===========================================================
GET_HOLD_KEYS_NUM:
;return R1: R1 stores the number of hold keys
MOV R0,#KEY_OLD_STATE1
MOV R1,#00H
DETECT_NEXT_ROW:
MOV A,#01H
DETECT_NEXT_COL:
ANL A,@R0
JNZ SHIFT_COLUMN
INC R1
SHIFT_COLUMN:
CLR C
RLC A
JNC DETECT_NEXT_COL
INC R0
CJNE R0,#KEY_OLD_STATE1+key_row_num,DETECT_NEXT_ROW
if(trigger_type==0)
CMPR R1,#max_hkn
else
CMPR KEY_VALUE,#max_keyvalue+1
JC 4;??
CMPR R1,#max_hkn
AJMP 2;??
CMPR R1,#max_hkn-1
; LDA NST_SK_KEY_VALUE
; CMP #max_keyvalue+1
; BCS 4
; CPY #max_hkn
; BRA 2
; CPY #max_hkn-1
endif
GET_HOLD_KEYS_NUM_RET:
RET
;===========================================================
;input:R2,R3(R2:record row number; R3:record column number)
;output KEY_VALUE and cf
ADJUST_KEY_VALUE:
CLR C
if(key_method==1)
MOV A,R2
MOV DPTR,#KEY_ADJUST_TABLE
MOVC A,@A+DPTR
ADD A,R3
else
MOV A,R3
MOV DPTR,#KEY_ADJUST_TABLE
MOVC A,@A+DPTR
ADD A,R2
endif
MOV KEY_VALUE,A
if(trigger_type!=2)
; CMP #max_keyvalue+1 ;
else
MOV A,R3
MOV DPTR,#KEY_BIT_TABLE
MOVC A,@A+DPTR
ANL A,@R0
JZ ADJUST_KEY_VALUE_1
CLR C
ADD KEY_VALUE,#max_keyvalue
ADJUST_KEY_VALUE_1:
MOV A,KEY_VALUE
; CMP #max_keyvalue*2+1
endif
ADJUST_KEY_VALUE_RET:
RET
;===========================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -