?? 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 + -