📄 key.asm
字号:
.INCLUDE hardware.inc
.IRAM
.VAR I_KeyBuf = 0 //保存键值
.VAR I_Key_Delay = 0 //扫描有键按下的次数
.EXTERNAL _KeyFlag //有键按下标识符
.CODE
//=============================================================================================
.PUBLIC F_Key_Scan;
F_Key_Scan: .PROC
r2=[P_IOB_Buffer] //扫描键盘
r2&=0x00ff
r2|=0xf000
[P_IOB_Data] = r2
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
//=============================================================================================
.PUBLIC F_Key_Scaning;
F_Key_Scaning:
F_Key_Scan_B7:
r2=[P_IOB_Data]
r2&=0x00ff
r2|=0x8000 //扫描第一行//changed by abin 扫描第四列
[P_IOB_Data] = r2
r2&=0xff00
r1 = 0x0f00
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
F_Key_Scan_B6:
r2=[P_IOB_Data]
r2&=0x00ff
r2|=0x4000 //扫描第二行
[P_IOB_Data] = r2
r2&=0xff00
r1 = 0x0f00
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
F_Key_Scan_B5:
r2=[P_IOB_Data]
r2&=0x00ff
r2|=0x2000 //扫描第三行
[P_IOB_Data] = r2
r2&=0xff00
r1 = 0x0f00
r1& =[P_IOB_Data]
CMP r1,0x0000 //是否该行有键按下
JNZ F_Key_Pressed
F_Key_Scan_B4:
r2=[P_IOB_Data]
r2&=0x00ff
r2|=0x1000 //扫描第四行
[P_IOB_Data] = r2
r2&=0xff00
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:
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:
CALL F_Key_Scaning ; //去抖;
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;
//============================================================================================
.PUBLIC _F_Get_Key;
_F_Get_Key: .PROC
r3 = 1
r2 = [I_KeyBuf]
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 0x8800,0x8400,0x8200,0x8100
.dw 0x4800,0x4400,0x4200,0x4100
.dw 0x2800,0x2400,0x2200,0x2100
.dw 0x1800,0x1400,0x1200,0x1100
///=================================================================================
.public _SP_INT_128Hz;
_SP_INT_128Hz:
r1 = 0x0040;
[P_TimeBase_Setup]=r1 // TMB2选择128Hz //TMB1选择8Hz,但不起作用
r1 = 0x0001 //开中断IRQ6_TMB2
[P_INT_Ctrl]= r1
INT IRQ
RETF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -