📄 keyscan_new.asm
字号:
//=================================================================
// key.asm 键盘功能
//=================================================================
.INCLUDE SPCE061A.inc
.PUBLIC _keyscan
.DEFINE C_DebounceCnt 0x0050; //13ms 去抖
.DEFINE C_CONTINUE 0xB00; //第二次以后有效
.EXTERNAL _keyvalue
.EXTERNAL _keypressflag; //无键按下时清0;有键按下时B0=1 //第二次以后有效B15=1
.RAM
.VAR Key_Buff; //本次键值暂存单元
.VAR Key_Debounce; //计数单元
.VAR KeyScanLineBuff;
.CODE
.PUBLIC _keyinitial
_keyinitial: .PROC
r1=0x0000
[_keyvalue]=r1
[Key_Buff]=r1
[_keypressflag]=r1
r1&=0xfff0
[P_IOA_Dir]=r1
[P_IOA_Attrib]=r1
[P_IOA_Data]=r1
retf
.ENDP
_keyscan: .PROC
r1=0x0001; // Clear watch dog
[P_Watchdog_Clear]=r1;
r2=[P_IOA_Data]
r2&=0x000f
jnz F_SomeKeyIsPressed
r1=0x0000
[Key_Buff]=r1
[_keypressflag]=r1 //清0
r1=1
retf
//-----------------------------//
F_SomeKeyIsPressed:
r3=[_keypressflag] //有键按下 B0=1
r3|=0x0001
[_keypressflag]=r3 //置按键标志
r1=[Key_Buff] //读上次键值
[Key_Buff]=r2 //暂存本次键值
cmp r1,r2
je L_KS_StableTwoSample //相等则跳转
r1=0x0000
[_keyvalue]=r1
r1=C_DebounceCnt //初始化计数单元
[Key_Debounce]=r1
retf
L_KS_StableTwoSample:
r1=[Key_Debounce]
jz L_KS_StableOverDebounce
r1-=1 //计数减 1
[Key_Debounce]=r1
retf
L_KS_StableOverDebounce: //形成键码
r1=[Key_Buff] //暂存值
r3=0x8000 //是第一次有效吗?
test r3,[_keypressflag]
jz Key_First_Avail
r1|=0x8000 //连续按键有效 ///////////////////////
jmp Key_Get_Value
Key_First_Avail: //第一次有效
r3=[_keypressflag] //有键按下 B15=1
r3|=0x8000
[_keypressflag]=r3
Key_Get_Value:
[_keyvalue]=r1 //存有效键值
r1=C_CONTINUE
[Key_Debounce]=r1
retf
.ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -