📄 key.asm
字号:
.INCLUDE hardware.inc;
.PUBLIC F_Key_Scan_Initial;
.PUBLIC _Key_Scan_ServiceLoop;
.PUBLIC F_Key_Scan_ServiceLoop;
.PUBLIC F_Key_DebounceCnt_Down;
.PUBLIC _SP_GetCh;
.PUBLIC F_SP_GetCh;
.PUBLIC R_KeyStrobe;
//////////////////////////////////////////////////////////////////
// RAM Define Area
//////////////////////////////////////////////////////////////////
.RAM
.VAR R_DebounceReg; //for keyboard scan
.DEFINE C_DebounceCnt 0x0002;
.VAR R_DebounceCnt; //for keyboard scan
.VAR R_KeyBuf; //for keyboard scan
.VAR R_KeyStrobe; //for keyboard scan
.CODE
//////////////////////////////////////////////////////////////////
// Function: Initialization for F_Key_Scan_ServiceLoop
//////////////////////////////////////////////////////////////////
_Key_Scan_ServiceLoop:
F_Key_Scan_Initial:
r1 = 0x0000; //
[R_DebounceReg] = r1; //
[R_KeyBuf] = r1; //
[R_KeyStrobe] = r1; //
r1 = C_DebounceCnt; //
[R_DebounceCnt] = r1; //reset debounce counter
retf;
//////////////////////////////////////////////////////////////////
// Function: Get Key code from key pad(8 x 1 key pad)
// Input: Port IOA b7-b0
// Output: R_KeyStrobe b7-b0
// | | | |
// +Vcc --- x --- x ... x --- x ---
// | | | |
// IOA.7 IOA.0
// Note: 1)link F_DebounceCntDown is necessary
// Destory register: r1, r2
//////////////////////////////////////////////////////////////////
F_Key_Scan_ServiceLoop:
r1 = [P_IOA_Data]; // get key data from IOA
//r1 = [P_IOB_Data]; // get key data from IOB
r1 = r1 and 0xff; //
r2 = [R_DebounceReg]; //
[R_DebounceReg] = r1; //
cmp r2,[R_DebounceReg]; //
je L_KS_StableTwoSample; //
r1 = C_DebounceCnt; //debounce time setting
[R_DebounceCnt] = r1; //
retf; //
L_KS_StableTwoSample:
r1 = [R_DebounceCnt]; //
jz L_KS_StableOverDebounce; //
retf;
L_KS_StableOverDebounce:
[R_DebounceCnt] = r1; //
r2 = [R_DebounceReg]; //
r1 = [R_KeyBuf]; //
[R_KeyBuf] = r2; //
r1 = r1 xor 0x00ff; //
r1 = r1 and [R_KeyBuf]; //
r1 = r1 and 0x00ff; //
r1 = r1 or [R_KeyStrobe]; //
[R_KeyStrobe] = r1; //save stable key code to R_KeyStrobe
retf;
//////////////////////////////////////////////////////////////////
// Function: debounce counter down count
//////////////////////////////////////////////////////////////////
F_Key_DebounceCnt_Down:
r1 = [R_DebounceCnt]; // Debounce subroutine for F_IO_Key_Scan:
jz L_DebounceCntZero; // stop count if zero
r1 -= 0x0001; //
[R_DebounceCnt] = r1; //
L_DebounceCntZero: //
retf; //
//****************************************************************
// Function: Get Keycode for I/O Port
// Destory register: r1, r2
//****************************************************************
_SP_GetCh:
F_SP_GetCh:
//push BP,BP to [SP];
//BP = SP + 1;
r1 = [R_KeyStrobe]; // Get Key code
r2 = 0x0000; // Clear KeyStrobe for next key
[R_KeyStrobe] = r2; //
//pop BP,BP from [SP];
retf;
//========================================================================================
// End of key.asm
//========================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -