📄 key0.asm
字号:
.include hardware.inc
.iram
.public KeyBuf //保存键值
.var KeyBuf = 0
.public key_delay; //扫描有键按下的次数
.var key_delay = 0
.external _KeyFlag //有键按下标识符
.code
.public F_Key_Scan;
F_Key_Scan: .proc
r1 = 0x00F0 //扫描键盘
[P_IOB_Data] = r1
r1 = 0x000f
r1 &= [P_IOB_Data]
jnz Have_Key_Pressed
NoKey_Press: //无键按下
r1 = 0
[KeyBuf] = r1 //清键盘缓冲区
[_KeyFlag] = r1
[key_delay]=r1;
retf
Have_Key_Pressed: //有键按下处理
call F_Key_Scaning //行扫描确定键
call Enter_Key; //确认有键按下
retf
.endp
//////////////////////////////////////////
.public F_Key_Scaning;
F_Key_Scaning:
F_Key_Scan_B7:
r2=0x0080 //扫描第一行
[P_IOB_Data] = r2
r1 = 0x000f
r1& =[P_IOB_Data]
cmp r1,0x0000 //是否该行有键按下
jnz F_Key_Pressed
F_Key_Scan_B6:
r2=0x0040 //扫描第二行
[P_IOB_Data] = r2
r1 = 0x000f
r1& =[P_IOB_Data]
cmp r1,0x0000 //是否该行有键按下
jnz F_Key_Pressed
F_Key_Scan_B5:
r2=0x0020 //扫描第三行
[P_IOB_Data] = r2
r1 = 0x000f
r1& =[P_IOB_Data]
cmp r1,0x0000 //是否该行有键按下
jnz F_Key_Pressed
F_Key_Scan_B4:
r2=0x0010 //扫描第四行
[P_IOB_Data] = r2
r1 = 0x000f
r1& =[P_IOB_Data]
cmp r1,0x0000 //是否该行有键按下
jnz F_Key_Pressed
retf
F_Key_Pressed:
r2|=r1 //r2--B11~B8:output r1--B0~B7,input
retf
Enter_Key:
Scan_first:
r3 = [key_delay]
cmp r3,0x0000
jnz Scan_many;
[KeyBuf] = r2;
r3 += 1;
[key_delay] = r3;
retf;
Scan_many:
r1 = [KeyBuf]
cmp r1,r2
jne Error_Key_pro;
r3 = [key_delay]
r3 += 1;
[key_delay] = r3;
cmp r3, 0x0010;
je Enter_Have_KeyDown;
retf;
Enter_Have_KeyDown:
r1 = 1;
[_KeyFlag] = r1
r3 = 0;
[key_delay]=r3
retf
Error_Key_pro:
r3 = 0;
[key_delay]=r3
[KeyBuf] = r3
retf;
.PUBLIC _F_Get_Key;
_F_Get_Key: .PROC
r3 = 1
r2 = [KeyBuf]
Key_value_Loop:
bp = r3 + Key_Table
r1 = [bp]
cmp r1,r2
je KeyCode_Return
r3 += 1
cmp r3,11
jbe Key_value_Loop
r3=0
KeyCode_Return:
r1 = 0;
[KeyBuf] = r1;
r1=r3
retf //清键盘缓冲区
.endp
// .data
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 + -