📄 key.asm
字号:
.INCLUDE hardware.inc
.IRAM
.VAR I_KeyBuf = 0 //保存键值
.VAR I_Key_Delay = 0 //扫描有键按下的次数
.EXTERNAL _KeyFlag //有键按下标识符
.CODE
//============================================================================================
//函数: F_Key_Scan()
//语法:void F_Key_Scan()
//描述:键盘扫描函数
//参数:无
//返回:无
//=============================================================================================
.PUBLIC F_Key_Scan;
F_Key_Scan: .PROC
r1 = 0xF000 //扫描键盘
[P_IOB_Data] = r1
r1 = 0x0f00
r1 &= [P_IOB_Data]
JNZ L_Have_Key_Pressed
L_NoKey_Press: //无键按下
r1 = 0
[I_KeyBuf] = r1 //清键盘缓冲区
[_KeyFlag] = r1
[I_Key_Delay]=r1;
RETF
L_Have_Key_Pressed: //有键按下处理
CALL F_Key_Scaning //行扫描确定键
CALL Enter_Key; //确认有键按下
RETF
.ENDP
//============================================================================================
//函数: unsigned F_Key_Scaning()
//语法:void unsigned F_Key_Scaning()
//描述:行扫描函数
//参数:无
//返回:扫描键值
//=============================================================================================
.PUBLIC F_Key_Scaning;
F_Key_Scaning:
F_Key_Scan_B7:
r2=0x8000 //扫描第一行//changed by abin 扫描第四列
[P_IOB_Data] = r2
r1 = 0x0f00
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
F_Key_Scan_B6:
r2=0x4000 //扫描第二行
[P_IOB_Data] = r2
r1 = 0x0f00
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
F_Key_Scan_B5:
r2=0x2000 //扫描第三行
[P_IOB_Data] = r2
r1 = 0x0f00
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
F_Key_Scan_B4:
r2=0x1000 //扫描第四行
[P_IOB_Data] = r2
r1 = 0x0f00
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
RETF
F_Key_Pressed:
r2|=r1 //r2--B11~B8:输出 r1--B0~B7,输入
RETF
//============================================================================================
//函数: Enter_Key()
//语法:Enter_Key()
//描述:确定有键按下函数
//参数:无
//返回:无
//============================================================================================
Enter_Key:
Scan_first:
r3 = [I_Key_Delay]
CMP r3,0x0000
JNZ L_Scan_many;
[I_KeyBuf] = r2;
r3 += 1;
[I_Key_Delay] = r3;
RETF;
L_Scan_many: //去抖
r1 = [I_KeyBuf]
CMP r1,r2
JNE L_Error_Key_pro;
r3 = [I_Key_Delay]
r3 += 1;
[I_Key_Delay] = r3;
CMP r3, 0x0010;
JE L_Enter_Have_KeyDown;
RETF;
L_Enter_Have_KeyDown:
r1 = 1;
[_KeyFlag] = r1
r3 = 0;
[I_Key_Delay]=r3
RETF
L_Error_Key_pro:
r3 = 0;
[I_Key_Delay]=r3
[I_KeyBuf] = r3
RETF;
//============================================================================================
//函数: unsigned F_Get_Key()
//语法:unsigned F_Get_Key()
//描述:取键值函数
//参数:无
//返回:键值
//============================================================================================
.PUBLIC _F_Get_Key;
_F_Get_Key: .PROC
r3 = 1
r2 = [I_KeyBuf]
r2=r2 lsr 4
r2=r2 lsr 4
L_Key_value_Loop:
bp = r3 + Key_Table
r1 = [bp]
CMP r1,r2
JE L_KeyCode_Return
r3 += 1
CMP r3,16
JBE L_Key_value_Loop
r3=0
L_KeyCode_Return:
r1 = 0;
[I_KeyBuf] = r1;
r1=r3
RETF //清键盘缓冲区
.ENDP
Key_Table:
.DW 0x0000,0x0014,0x0024,0x0044
.DW 0x0012,0x0022,0x0042,0x0011
.DW 0x0021,0x0041,0x0028,0x0018
.DW 0x0081,0x0082,0x0084,0x0048
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -