⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _scan_key.a51

📁 使用PROTEUS仿真的推箱子游戏,全汇编格式,通过按钮操作,1602显示
💻 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 + -