📄 main.asm
字号:
//======================================================================================
//
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
//
// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.
// ALL RIGHTS RESERVED
//
// The entire notice above must be reproduced on all authorized copies.
//
//========================================================================================
// 工程名称: many_int.spj
// 功能描述: FIQ有FIQ_PWM、FIQ_TMA和FIQ_TMB三个中断源,当定时器A或B
// 计满溢出时产生中断请求信号TA_TIMEOUT_INT或TA_TIMEOUT_INT,
// CPU响应后进入中断执行相应的子程序控制二极管发光。
// 文件来源: 《SPCE061单片机原理及应用技术》第五章 中断系统,第201页
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.0(or later)
//
// 涉及的库: CMacro.lib
//
// 组成文件:
// main.asm
//
//
// 日期: 2002-6-12
//===========================================================================================
.DEFINE P_IOA_Data 0x7000;
.DEFINE P_IOA_Dir 0x7002;
.DEFINE P_IOA_Attri 0x7003;
.DEFINE P_IOB_Data 0x7005;
.DEFINE P_IOB_Dir 0x7007;
.DEFINE P_IOB_Attri 0x7008;
.DEFINE P_INT_Ctrl 0x7010;
.DEFINE P_INT_Clear 0x7011;
.DEFINE P_TimerA_Data 0x700A;
.DEFINE P_TimerA_Ctrl 0x700B;
.DEFINE P_TimerB_Data 0x700C;
.DEFINE P_TimerB_Ctrl 0x700D;
.DEFINE timea_clk 0x020d; //1024hz
.DEFINE timeb_clk 0x0004; //4096hz
.DEFINE P_WatchDog_Clear 0x7012
.RAM
.VAR TA_Flag
.VAR TB_Flag
.CODE
.PUBLIC _main
_main:
int off
r1 = 0xffff //IOA口为输出口;
[P_IOA_Attri] = r1
[P_IOA_Dir] = r1
r1 = 0x0000
[P_IOA_Data] = r1
r1 = 0xffff //B口的低8位设置为输出
[P_IOB_Dir] = r1
[P_IOB_Attri] = r1
r1 = 0x0000
[P_IOB_Data] = r1
r1 = 0xff9f;
[P_TimerA_Data] = r1;
[P_TimerB_Data] = r1;
r1 = timea_clk;
[P_TimerA_Ctrl] = r1;
r2 = 0x0004 //开中断IRQ0_TMA、IRQ1_TMA、IRQ1_TMB
r1 = 0x2000 //开中断FIQ_PWM、FIQ_TMA、FIQ_TMB
r1 |= r2;
[P_INT_Ctrl] = r1
int IRQ,FIQ;
loop:
nop
r1=0x0001;
[P_WatchDog_Clear]=r1;
nop
jmp loop
.TEXT
.PUBLIC _FIQ
_FIQ:
push r1,r5 to [sp] //压栈保护
r1 = 0x0800
r2 = [P_INT_Ctrl]
test r1,[P_INT_Ctrl] //比较是否为FIQ_TMB
jnz FIQ_TMB //是,则转至对应程序段
r1 = 0x2000
test r1,[P_INT_Ctrl] //否,则比较是否为FIQ_TMA
jnz FIQ_TMA //是,则转至对应程序段
FIQ_PWM: //否,则进入FIQ_PWM中断
r1 = 0x8000
[P_INT_Clear] = r1
pop r1,r5 from [sp]
reti
FIQ_TMA:
r1 = [TA_Flag]
r1 ^= 0xffff
[P_IOA_Data] = r1
[TA_Flag] = r1
r1 = 0x2000
[P_INT_Clear] = r1
pop r1,r5 from [sp]
reti
FIQ_TMB:
r1 = 0x0800
[P_INT_Clear] = r1
pop r1,r5 from [sp]
reti
.TEXT
.PUBLIC _IRQ5
_IRQ5:
push r1,r5 to [sp] //压栈保护
r1 = 0x0008
test r1,[P_INT_Ctrl] //比较是否为4Hz的中断源
jnz l_irq5_4 //是,则转至对应程序段
l_irq5_2:
nop;
nop;
nop
r1 = 0xffff //否,则进入2Hz程序段
[P_IOA_Data]=r1
jmp l_irq5_2;
LED2Hz_RET:
r1=0x0004
[P_INT_Clear]=r1
pop r1,r5 from [sp]
RETI
l_irq5_4:
[P_INT_Clear]=r1
pop r1,r5 from [sp]
RETI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -