📄 key.asm
字号:
//=================================================================
// key.asm 键盘功能
//=================================================================
.INCLUDE hardware.inc
.PUBLIC _Key_Scan_ServiceLoop;
.DEFINE C_DebounceCnt 0x0050; //13ms 去抖
.DEFINE C_CONTINUE 0xB00; //第二次以后有效
.EXTERNAL _Key
.EXTERNAL _KeyPressFlag; //无键按下时清0;有键按下时B0=1;
//第二次以后有效B15=1
.EXTERNAL _SleepFlag
.RAM
.VAR Key_Buff; //本次键值暂存单元
.VAR Key_Debounce; //计数单元
.VAR KeyScanLineBuff;
.CODE
.PUBLIC Key_Scan_Init
Key_Scan_Init: .PROC
r1=0x0000
[_Key]=r1
[Key_Buff]=r1
[_KeyPressFlag]=r1
retf
.ENDP
_Key_Scan_ServiceLoop: .PROC
r1=0x0001; // Clear watch dog
[P_Watchdog_Clear]=r1;
r2=[P_IOA_Data]
r2&=0x00ff
jnz F_SomeKeyIsPressed
r1=0x0000
[Key_Buff]=r1
[_KeyPressFlag]=r1 //清0
r1=1
[_SleepFlag] = r1 //置睡眠标志
retf
//-----------------------------//
F_SomeKeyIsPressed:
r3=[_KeyPressFlag] //有键按下 B0=1
r3|=0x0001
[_KeyPressFlag]=r3 //置按键标志
r3=0
[_SleepFlag] = r3 //清睡眠标志
r1=[Key_Buff] //读上次键值
[Key_Buff]=r2 //暂存本次键值
cmp r1,r2
je L_KS_StableTwoSample
r1=0x0000
[_Key]=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:
[_Key]=r1 //存有效键值
r1=C_CONTINUE
[Key_Debounce]=r1
retf
.ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -