📄 中断初始化键扫描.asm
字号:
.include hardware.inc
.EXTERNAL _Hour;
.EXTERNAL _Min;
.EXTERNAL _Sec;
.EXTERNAL _Day;
.EXTERNAL _Mon;
.EXTERNAL _Year;
.EXTERNAL _Funcflag;
.EXTERNAL _Worked; //键值处理标志
.EXTERNAL _Keydown; //按键标志
.EXTERNAL _Funcflag; //进位判断标志
.EXTERNAL _Keycode; //键值保存标量
.EXTERNAL _stopflag; //半秒标志位,1表示已经有一次半秒响应
.EXTERNAL _Flag;
.EXTERNAL _Function;
.PUBLIC _SystemInit
.code
_SystemInit:
r1=0x07ff; //IOB初始化
[P_IOB_Dir]=r1;
[P_IOB_Attrib]=r1;
[P_IOB_Data]=r1;
R1 = 0x000f; //IOA初始化
[P_IOA_Attrib] = R1;
[P_IOA_Dir] = R1;
r1=0x00f0;
[P_IOA_Data] = R1;
int off
r1=0x0088; //开IRQ5的2HZ.IRQ3的中断
[P_INT_Ctrl]=r1;
IRQ ON;
RETI;
.text
.public _IRQ3
_IRQ3:
push r1,r4 to [sp]
r1 = 0x0100
TEST r1,[P_INT_Ctrl];
jnz _IRQ3_EXT1
r2 = 0x0200
TEST r1,[P_INT_Ctrl];
jnz _IRQ3_EXT2
r1=0x0080;
[P_INT_Clear]=r1;
r1=1
[_Keydown]=r1;
POP R1,R4 FROM [SP];
RETI;
_IRQ3_EXT1:
[P_INT_Clear]=r1;
POP R1,R5 FROM [SP];
reti;
_IRQ3_EXT2:
[P_INT_Clear]=r1;
POP R1,R5 FROM [SP];
reti;
.PUBLIC _IRQ5
_IRQ5:
PUSH R1,R5 TO [SP] //现场保护
R1=0x0001; //清看门狗
[P_Watchdog_Clear]=R1;
R1=0x0004; //屏蔽4HZ中断
TEST r1,[P_INT_Ctrl];
JNZ L_IRQ5_2HZ;
L_IRQ5_4HZ:
R1=0x0008; //清中断
[P_INT_Clear]=R1;
R1=[_Flag];
CMP R1,3
JNE Half_Sec;
R2=0;
[_Flag]=R2;
R1=[_Sec];
R1+=1;
[_Sec]=r1
call _Function
POP R1,R5 FROM [SP];
RETI;
L_IRQ5_2HZ:
[P_INT_Clear]=r1;
POP R1,R5 FROM [SP];
RETI;
Half_Sec: //不满1秒
r1+=1;
[_Flag]=R1;
r2=0
[_Funcflag]=r2
POP R1,R5 FROM [SP];
RETI;
.PUBLIC _Key_scan
.code
_Key_scan:
F_Key_Scan_A4:
r4=0x0000;
R2=0x000e; //扫描第一行
[P_IOA_Data] = R2 ;
R1 = 0x00f0;
R1& =[P_IOA_Data];
CMP R1,0x00f0; //是否该行有键按下
JNZ L_make_sure;
F_Key_Scan_A5:
R2=0x000d; //扫描第二行
[P_IOA_Data] = R2;
R1 = 0x00f0;
R1& =[P_IOA_Data];
CMP R1,0x00f0; //是否该行有键按下
JNZ L_make_sure;
F_Key_Scan_A6:
R2=0x000b; //扫描第三行
[P_IOA_Data] = R2;
R1 = 0x00f0;
R1& =[P_IOA_Data];
CMP R1,0x00f0; //是否该行有键按下
JNZ L_make_sure;
F_Key_Scan_A7:
R2=0x0007; //扫描第四行
[P_IOA_Data] = R2;
R1 = 0x00f0;
R1& =[P_IOA_Data];
CMP R1,0x00f0; //是否该行有键按下
JnZ L_make_sure;
RETF
L_make_sure: // 去抖
r3=r1;
[P_IOA_Data] = R2;
R1 = 0x00f0;
R1& =[P_IOA_Data];
cmp r1,r3;
jne F_Key_Scan_A4
r4+=1;
cmp r4,250;
jne L_make_sure;
r4=0x0000;
r1=r1|r2 ;
[_Keycode]=r1
r1=0x00f0
[P_IOA_Data]=r1
r1=0
[_Keydown]=r1
RETF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -