📄 中断初始化键扫描.lst
字号:
< .EXTERNAL F_SP_Get_ADC
<
< .EXTERNAL F_SP_Set_P_TimerA_Ctrl
< .EXTERNAL F_SP_Set_P_TimerA_Data
< .EXTERNAL F_SP_Set_P_TimerB_Ctrl
< .EXTERNAL F_SP_Set_P_TimerB_Data
< .EXTERNAL F_SP_Set_P_INT_Ctrl
< .EXTERNAL F_SP_Set_P_INT_Clear
< .EXTERNAL F_SP_Set_P_SystemClock
< .EXTERNAL F_SP_Set_P_DAC_Ctrl
< .EXTERNAL F_SP_Set_P_ADC_Ctrl
<
<
<
< //--------------------------------------------
< SACM_MACRO1: .MACRO
<
< .ENDM
<
< SACM_MACRO2: .MACRO
<
< .ENDM
<
<
<
<
< //.define PC_Play_Enable_A2000 1 // Enable the PC-Play function for SACM-A2000 module
< //.define PC_Play_Enable_S480 1 // Enable the PC-Play function for SACM-S480 module
< //.define PC_Play_Enable_S240 1 // Enable the PC-Play function for SACM-S240 module
< //.define PC_Play_Enable_MS01 1 // Enable the PC-Play function for SACM-MS01 module
<
<
<
< //========================================================================================
< // End of 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
000087EE .code
_SystemInit:
000087EE 09 93 FF 07 r1=0x07ff; //IOB初始化
000087F0 19 D3 07 70 [P_IOB_Dir]=r1;
000087F2 19 D3 08 70 [P_IOB_Attrib]=r1;
000087F4 19 D3 05 70 [P_IOB_Data]=r1;
000087F6 4F 92 R1 = 0x000f; //IOA初始化
000087F7 19 D3 03 70 [P_IOA_Attrib] = R1;
000087F9 19 D3 02 70 [P_IOA_Dir] = R1;
000087FB 09 93 F0 00 r1=0x00f0;
000087FD 19 D3 00 70 [P_IOA_Data] = R1;
000087FF 40 F1 int off
00008800 09 93 88 00 r1=0x0088; //开IRQ5的2HZ.IRQ3的中断
00008802 19 D3 10 70 [P_INT_Ctrl]=r1;
00008804 49 F1 IRQ ON;
00008805 98 9A RETI;
0000808B .text
.public _IRQ3
_IRQ3:
0000808B A0 D8 push r1,r4 to [sp]
0000808C 09 93 00 01 r1 = 0x0100
0000808E 11 C3 10 70 TEST r1,[P_INT_Ctrl];
00008090 0E 4E jnz _IRQ3_EXT1
00008091 0A 95 00 02 r2 = 0x0200
00008093 11 C3 10 70 TEST r1,[P_INT_Ctrl];
00008095 0D 4E jnz _IRQ3_EXT2
00008096 09 93 80 00 r1=0x0080;
00008098 19 D3 11 70 [P_INT_Clear]=r1;
0000809A 41 92 r1=1
0000809B 19 D3 35 00 [_Keydown]=r1;
0000809D A0 90 POP R1,R4 FROM [SP];
0000809E 98 9A RETI;
_IRQ3_EXT1:
0000809F 19 D3 11 70 [P_INT_Clear]=r1;
000080A1 A8 90 POP R1,R5 FROM [SP];
000080A2 98 9A reti;
_IRQ3_EXT2:
000080A3 19 D3 11 70 [P_INT_Clear]=r1;
000080A5 A8 90 POP R1,R5 FROM [SP];
000080A6 98 9A reti;
.PUBLIC _IRQ5
_IRQ5:
000080A7 A8 DA PUSH R1,R5 TO [SP] //现场保护
000080A8 41 92 R1=0x0001; //清看门狗
000080A9 19 D3 12 70 [P_Watchdog_Clear]=R1;
000080AB 44 92 R1=0x0004; //屏蔽4HZ中断
000080AC 11 C3 10 70 TEST r1,[P_INT_Ctrl];
000080AE 13 4E JNZ L_IRQ5_2HZ;
L_IRQ5_4HZ:
000080AF 48 92 R1=0x0008; //清中断
000080B0 19 D3 11 70 [P_INT_Clear]=R1;
000080B2 11 93 33 00 R1=[_Flag];
000080B4 43 42 CMP R1,3
000080B5 10 4E JNE Half_Sec;
000080B6 40 94 R2=0;
000080B7 1A D5 33 00 [_Flag]=R2;
000080B9 11 93 29 00 R1=[_Sec];
000080BB 41 02 R1+=1;
000080BC 19 D3 29 00 [_Sec]=r1
000080BE 40 F0 25 81 call _Function
000080C0 A8 90 POP R1,R5 FROM [SP];
000080C1 98 9A RETI;
L_IRQ5_2HZ:
000080C2 19 D3 11 70 [P_INT_Clear]=r1;
000080C4 A8 90 POP R1,R5 FROM [SP];
000080C5 98 9A RETI;
Half_Sec: //不满1秒
000080C6 41 02 r1+=1;
000080C7 19 D3 33 00 [_Flag]=R1;
000080C9 40 94 r2=0
000080CA 1A D5 30 00 [_Funcflag]=r2
000080CC A8 90 POP R1,R5 FROM [SP];
000080CD 98 9A RETI;
.PUBLIC _Key_scan
00008806 .code
_Key_scan:
F_Key_Scan_A4:
00008806 40 98 r4=0x0000;
00008807 4E 94 R2=0x000e; //扫描第一行
00008808 1A D5 00 70 [P_IOA_Data] = R2 ;
0000880A 09 93 F0 00 R1 = 0x00f0;
0000880C 11 B3 00 70 R1& =[P_IOA_Data];
0000880E 09 43 F0 00 CMP R1,0x00f0; //是否该行有键按下
00008810 1F 4E JNZ L_make_sure;
F_Key_Scan_A5:
00008811 4D 94 R2=0x000d; //扫描第二行
00008812 1A D5 00 70 [P_IOA_Data] = R2;
00008814 09 93 F0 00 R1 = 0x00f0;
00008816 11 B3 00 70 R1& =[P_IOA_Data];
00008818 09 43 F0 00 CMP R1,0x00f0; //是否该行有键按下
0000881A 15 4E JNZ L_make_sure;
F_Key_Scan_A6:
0000881B 4B 94 R2=0x000b; //扫描第三行
0000881C 1A D5 00 70 [P_IOA_Data] = R2;
0000881E 09 93 F0 00 R1 = 0x00f0;
00008820 11 B3 00 70 R1& =[P_IOA_Data];
00008822 09 43 F0 00 CMP R1,0x00f0; //是否该行有键按下
00008824 0B 4E JNZ L_make_sure;
F_Key_Scan_A7:
00008825 47 94 R2=0x0007; //扫描第四行
00008826 1A D5 00 70 [P_IOA_Data] = R2;
00008828 09 93 F0 00 R1 = 0x00f0;
0000882A 11 B3 00 70 R1& =[P_IOA_Data];
0000882C 09 43 F0 00 CMP R1,0x00f0; //是否该行有键按下
0000882E 01 4E JnZ L_make_sure;
0000882F 90 9A RETF
L_make_sure: // 去抖
00008830 01 97 r3=r1;
00008831 1A D5 00 70 [P_IOA_Data] = R2;
00008833 09 93 F0 00 R1 = 0x00f0;
00008835 11 B3 00 70 R1& =[P_IOA_Data];
00008837 03 43 cmp r1,r3;
00008838 73 4E jne F_Key_Scan_A4
00008839 41 08 r4+=1;
0000883A 0C 49 FA 00 cmp r4,250;
0000883C 4D 4E jne L_make_sure;
0000883D 40 98 r4=0x0000;
0000883E 02 A3 r1=r1|r2 ;
0000883F 19 D3 31 00 [_Keycode]=r1
00008841 09 93 F0 00 r1=0x00f0
00008843 19 D3 00 70 [P_IOA_Data]=r1
00008845 40 92 r1=0
00008846 19 D3 35 00 [_Keydown]=r1
00008848 90 9A RETF
0 error(s), 0 warning(s).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -