📄 isr.asm
字号:
//****************************************************************
// Function: Fast Interrupt Service routine Area
// Service for (1)PWM FIQ
// (2)Timer A FIQ
// (3)Timer B FIQ
// User's FIQ must hook on here
// _FIQ: // Fast interrupt entrence
// _IRQ1: // interrupt entrence
// _IRQ2: // interrupt entrence
// _IRQ3: // interrupt entrence
// _IRQ4: // interrupt entrence
// _IRQ5: // interrupt entrence
// _IRQ6: // interrupt entrence
// _IRQ7: // interrupt entrence
//****************************************************************
//+++++++++++++++++++++++++++++++++//
// SOME MACROS....... //
//---------------------------------//
SET_IOA_IN: .MACRO //USING R1 FOR TEMP
R1 = 0x00ff
[P_IOA_Dir] = R1
R1 = 0xFFFF
[P_IOA_Attrib] = R1
.ENDM
SET_IOA_OUT: .MACRO //USE R1 FOR TEMP
R1 = 0xFFFF
[P_IOA_Attrib] = R1
[P_IOA_Dir] = R1
.ENDM
RD_8279_FIFORAM: .MACRO //改变了 R1,R2的值,使用 R1 返回函数值
SET_IOA_IN;
R2 = C_RD_FIFORAM
[P_IOB_Data] = R2;
// R1 = 0x0000
// [P_IOA_Data] = R1;
R1 = [P_IOA_Data];
R2 = C_IOB_DEFAULT & ~C_8279_A0
[P_IOB_Data] = R2
.ENDM
RD_8279_STATUS: .MACRO //改变了 R1,R2的值,使用 R1 返回函数值
SET_IOA_IN;
R2 = C_RD_STATUS
[P_IOB_Data] = R2;
// R1 = 0x0000
// [P_IOA_Data] = R1;
R1 = [P_IOA_Data];
R2 = C_IOB_DEFAULT
[P_IOB_Data] = R2
.ENDM
WR_8279_DISPLAYRAM: .MACRO DATA //改变了 R1,R2 的值
.IFMA 0
.MACEXIT
.ENDIF
SET_IOA_OUT;
R2 = C_WR_RAM
[P_IOB_Data] = R2;
R1 = DATA;
R2 = [P_IOA_Data]
R2 = R2 & 0x00FF
R1 = R1 | R2
[P_IOA_Data] = R1;
R2 = C_IOB_DEFAULT & ~C_8279_A0
[P_IOB_Data] = R2;
.ENDM
WR_8279_CONTROL: .MACRO DATA //改变了 R1,R2 的值
.IFMA 0
.MACEXIT
.ENDIF
SET_IOA_OUT;
R2 = C_WR_CONTROL
[P_IOB_Data] = R2;
R1 = DATA;
R2 = [P_IOA_Data]
R2 = R2 & 0x00FF
R1 = R1 | R2
[P_IOA_Data] = R1;
R2 = C_IOB_DEFAULT ;
[P_IOB_Data] = R2;
.ENDM
//SCANKEY: .MACRO
// RD_8279_STATUS //读8279状态
// R1 = R1 & 0x0F00
// CMP R1,0x0000 //比较是否有键按下
// JNE RDKEY
// PC = SCANKEYexit
//RDKEY:
// r3 = r1&0x0700
// WR_8279_CONTROL 0x5000 //写入读 fifo ram 控制字
//Lop:
// r3 -= 0x0100
// RD_8279_FIFORAM //读 fifo ram
// cmp r3,0
// jne Lop
// R4 = R1 //保存在 R4 中
// WR_8279_CONTROL 0xC200
// WR_8279_CONTROL 0xF000 //写入8279中断结束命令字
// call F_TestState
// CALL DisplayKey //调用键值显示函数
//SCANKEYexit:
//.ENDM
CLEAR_WATCHDOG: .MACRO //USE R1
R1 = 0x0001
[P_Watchdog_Clear] = R1
.ENDM
MacroIRQ5: .macro
CLEAR_WATCHDOG
R1 = C_IRQ_2Hz;
Test R1,[P_INT_Ctrl];
JNZ IRQ5_2Hz;
R1 = C_IRQ_4Hz;
Test R1,[P_INT_Ctrl]
JNZ IRQ5_4Hz_mid;
PC = EXIT_5;
IRQ5_4Hz_mid:
pc = IRQ5_4Hz
.ENDM
MacroIRQ4: .macro
CLEAR_WATCHDOG
R1 = C_IRQ_1024Hz; // 1 KHz
Test R1,[P_INT_Ctrl];
JNZ IRQ4_1024;
R1 = C_IRQ_2048Hz; // 2 KHz
Test R1,[P_INT_Ctrl]
JNZ IRQ4_2048;
R1 = C_IRQ_4096Hz; // 4 KHz
Test R1,[P_INT_Ctrl];
JNZ IRQ4_4096;
PC = EXIT_4;
.ENDM
.EXTERNAL DisplayKey,CalV,Hex2Dec,discode,F_TestState
.EXTERNAL Stop,F_TestState,CalLong,AlertMetal,Stop5sec
.EXTERNAL F_Delay,TestObject,delay,gogogo,Stop5Sec,Time5SecFlag,LastIntCtrlStatus
.iram
.var TotalPules = 0
.var TotalMetal = 0
.var CurrentMetal = 0
.public CPointFlag
.var CPointFlag = 0
.public LastMetalFlag
.var LastMetalFlag = 0
.public abc
.var abc=0
.public Time
.var Time = 0
.TEXT
.INCLUDE hardware.asm; // include io information
.public _BREAK;
.public _FIQ;
.public _IRQ0;
.public _IRQ1;
.public _IRQ2;
.public _IRQ3;
.public _IRQ4;
.public _IRQ5;
.public _IRQ6;
.public _IRQ7;
_FIQ:
push r1,r4 to [sp];
R1 = [P_INT_Ctrl]
[P_INT_Clear] = R1
pop r1,r4 from [sp];
reti;
/////////////////////////////////////////////////////////////////////////////////////////
// Function: Interrupt Service routine Area
// Service for IRQ1 - IRQ7
// User's IRQ must hook on here
/////////////////////////////////////////////////////////////////////////////////////////
_BREAK:
push r1,r4 to [sp];
pop r1,r4 from [sp];
reti;
_IRQ0:
push r1,r4 to [sp];
pop r1,r4 from [sp];
reti;
//--------------------------------irq1
_IRQ1:
push r1,r4 to [sp];
pop r1,r4 from [sp];
reti;
//--------------------------------irq2
_IRQ2:
push r1,r4 to [sp];
pop r1,r4 from [sp];
reti;
//------------------------------irq3
_IRQ3:
push r1,r4 to [sp];
INT OFF
r1 = [P_INT_Ctrl]
R1=C_IRQ_Ext2;
TEST R1,[P_INT_Ctrl]; //测试B9,是否为EXT2中断
JNZ IRQ3_3; //
R1=C_IRQ_Ext1;
TEST R1,[P_INT_Ctrl]; //测试B8,是否为EXT1中断
JNE IRQ3_2;
R1=C_IRQ_KeyChange;
TEST R1,[P_INT_Ctrl]; //测试B7,是否为键唤醒信号
JNE IRQ3_1; //
IRQ3_1:
[P_INT_Clear] = R1
pc = EXIT
IRQ3_2:
[P_INT_Clear] = R1
PC = EXIT
IRQ3_3:
[P_INT_Clear] = R1
r1 = [LastMetalFlag]
test r1,1
jnz EXIT_1
jmp next_1
EXIT_1:
pc = EXIT
next_1:
r1 = [TotalMetal]
r1 += 1
[TotalMetal] = r1
[CurrentMetal] = r1
r3 = r1
r4 = r3
call AlertMetal
r1 = [CPointFlag]
test r1,1
jnz LastMetal
pc = EXIT
LastMetal:
r3 = [TotalMetal]
call Hex2Dec
[Time5SecFlag] = r1
r1 = [P_INT_Ctrl]
[LastIntCtrlStatus]= r1
r1 = 1
[LastMetalFlag] = r1
r1 =1
call Stop
SET_IOA_IN
R1 = [P_IOA_Data]
R2 = 0x00C0
r1 = R1|R2
r3 = r1
SET_IOA_OUT
[P_IOA_Data]= R3
r4 = 0x0280
golop10:
r4 -= 1
call delay
CLEAR_WATCHDOG
cmp r4,0
jne golop10
R2 = 0xff3f
r1 = R1&R2
r3 = r1
SET_IOA_OUT
[P_IOA_Data]= R3
r1 = 0x03ff
delaylop:
r1 -= 1
push r1 to [sp]
call delay
call gogogo
pop r1 from [sp]
cmp r1,0
jne delaylop
r1 =1
[abc]= r1
int off
r1 = 0x0004
[P_INT_Ctrl]=r1
call gogogo//????????????????????????????这里
EXIT:
CLEAR_WATCHDOG
IRQ ON
pop r1,r4 from [sp]
reti;
//----------------------------irq4
_IRQ4:
push r1,r4 to [sp];
INT OFF
MacroIRQ4
IRQ4_1024:
[P_INT_Clear] = R1
IRQ4_2048:
[P_INT_Clear] = R1
IRQ4_4096:
[P_INT_Clear] = R1
EXIT_4:
pop r1,r4 from [sp];
reti;
//----------------------------irq5
_IRQ5:
push r1,R5 to [sp];
INT OFF
MacroIRQ5
IRQ5_2Hz:
[P_INT_Clear] = R1
CLEAR_WATCHDOG;
// r1 = [Time5SecFlag]
// test r1,1
// jz NotAtC
// call Stop5Sec
NotAtC:
r1 = [P_TimerB_Data]
[TotalPules] = r1
r1 = [Time]
r1 += 1
[Time] = r1
call CalLong
// call CalV
// PUSH R3 TO [SP]
// BP = discode //换码
// r4 = r4 + bp //
// r4 = [r4] //
// POP R3 FROM [SP]
// CALL Hex2Dec
// R1 = 0x0000
// [P_TimerA_Data] = R1
CLEAR_WATCHDOG;
pc = EXIT_5
IRQ5_4Hz:
[P_INT_Clear] = R1
CLEAR_WATCHDOG;
r1 = [abc]
test r1,0
jne EXIT_5
call F_TestState
// r1 = [CPointFlag]
// test r1,1
// jnz TestObjectProgram
// pc = EXIT_5
TestObjectProgram:
// call TestObject
EXIT_5:
CLEAR_WATCHDOG
IRQ ON
pop r1,R5 from [sp];
reti;
//----------------------------irq6
_IRQ6:
push r1,r4 to [sp];
[P_INT_Clear] = R1
// CLEAR_WATCHDOG;
// call F_TestState
// CLEAR_WATCHDOG
pop r1,r4 from [sp];
reti;
//----------------------------irq7
_IRQ7:
push r1,r4 to [sp];
pop r1,r4 from [sp];
reti;
//========================================================================================
// End of isr.asm
//========================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -