/****************************************************************************
* 文件名:EINT1_DEF.C
* 功能:使用外部中断1进行B1的控制,每当有一次中断时,即取反B1控制口,以便指示中断输入。
* 使用非向量中断方式。
* 说明:将跳线器JP9短接,JP4断开,然后短接/断开JP1(使EINT1为低/高电平)。
****************************************************************************/
#include "config.h"
#define BEEPCON 0x00000080 /* P0.7引脚控制B1,低电平蜂鸣 */
/****************************************************************************
* 名称:IRQ_Eint1()
* 功能:外部中断EINT1服务函数,取反B1控制口。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_Eint1(void)
{ uint32 i;
i = IO0SET; // 读取当前B1控制值
if( (i&BEEPCON)==0 ) // 控制B1输出取反
{ IO0SET = BEEPCON;
}
else
{ IO0CLR = BEEPCON;
}
/* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */
while( (EXTINT&0x02)!=0 )
{ EXTINT = 0x02; // 清除EINT1中断标志
}
VICVectAddr = 0; // 向量中断结束
}
/****************************************************************************
* 名称:main()
* 功能:初始化外部中断1(EINT1)为非向量中断,并设置为电平触发模式,然后等待外部中断。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int main(void)
{ PINSEL0 = 0x20000000; // 设置管脚连接,P0.14设置为EINT1
IO0DIR = BEEPCON; // 设置B1控制口为输出,其它I/O为输入
EXTMODE = 0x00; // 设置EINT1中断为电平触发模式
/* 打开EINT1中断(使用非向量IRQ) */
VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断
VICDefVectAddr = (int)IRQ_Eint1; // 设置中断服务程序地址
EXTINT = 0x02; // 清除EINT1中断标志
VICIntEnable = 0x00008000; // 使能EINT1中断
while(1); // 等待中断
return(0);
}