📄 1.asm
字号:
.include hardware.inc
.EXTERNAL _Hour;
.EXTERNAL _Min;
.EXTERNAL _Sec;
.EXTERNAL _Flag;
.EXTERNAL _stoptag;
.EXTERNAL _year;
.EXTERNAL _month;
.EXTERNAL _day;
.EXTERNAL _i3;
.EXTERNAL _i5;
.EXTERNAL _keycode
.data
keytable:.dw 0x00ee,0x00de,0x00be,0x007e
.dw 0x00ed,0x00dd,0x00bd,0x007d
.dw 0x00eb,0x00db,0x00bb,0x007b
.dw 0x00e7,0x00d7,0x00b7,0x0077
.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=0x0084; //开IRQ5的2HZ.IRQ3的中断
[P_INT_Ctrl]=r1;
IRQ ON;
RETI;
.text
.PUBLIC _IRQ5
_IRQ5:
PUSH R1,R5 TO [SP] //现场保护
R1=0x0001; //清看门狗
[P_Watchdog_Clear]=R1;
R1=0x0008; //屏蔽4HZ中断
TEST r1,[P_INT_Ctrl];
JNZ L_IRQ5_4HZ;
L_IRQ5_2HZ:
r1=0x0004
[P_INT_Clear]=r1
r1=[_Flag]
cmp r1,0
je loop
r1=0
[_Flag]=r1
pop r1,r5 from [sp]
reti
loop:
r1=1
[_i5]=r1
[_Flag]=r1
pop r1,r5 from [sp]
reti
L_IRQ5_4HZ:
[P_INT_Clear]=r1;
POP R1,R5 FROM [SP];
RETI;
.public _IRQ3
_IRQ3:
r2=0x0001
[P_Watchdog_Clear]=r2;
push r1,r4 to [sp]
r1=0x0100
test r1,[P_INT_Ctrl]
jnz L_IRQ3_Ext1
r1=0x0200
test r1,[P_INT_Ctrl]
jnz L_IRQ3_Ext2
r1=0x0080;
[P_INT_Clear]=r1
call Key_scan
R1=0x0001; //清看门狗
[P_Watchdog_Clear]=R1;
POP R1,R4 FROM [SP];
RETI;
L_IRQ3_Ext2:
[P_INT_Clear]=r1
reti
L_IRQ3_Ext1:
[P_INT_Clear]=r1
reti
.PUBLIC Key_scan
Key_scan:.proc
// r1=0x0080;
// [P_INT_Clear]=r1;
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;
R1=0x0001; //清看门狗
[P_Watchdog_Clear]=R1;
r1=0x00f0
[P_IOA_Data]=r1
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,900;
jne L_make_sure;
r4=0x0000;
r1=r1|r2 ;
bp=keytable
r2=0
getkeycodeloop:
r2+=1
r3=[bp++]
cmp r1,r3
jne getkeycodeloop;
[_keycode]=r2
r2=1
[_i3]=r2
r1=0x00f0
[P_IOA_Data]=r1
RETF
.endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -