📄 main.c
字号:
/****************************************************************************
* 文 件 名:main.c
* 功 能:使用外部中断3进行B1的控制,每当有一次中断时,即取反B1控制口,以便指示中断输入。
* 使用非向量中断方式。
* 说 明:将跳线器JP2 JP4短接,JP7断开,然后反复按下与释放KEY1。
****************************************************************************/
#include "config.h"
#define BEEPCON 1<<7 // P0.7引脚控制B1,低电平蜂鸣,1<<7 等价于 0x80
/****************************************************************************
* 名 称:IRQ_Eint3()
* 功 能:外部中断EINT3服务函数,取反B1控制口。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_Eint3(void)
{
uint32 i;
i = IO0SET; // 读取当前B1控制值
if( (i&BEEPCON)==0 ) // 控制B1输出取反
{
IO0SET = BEEPCON;
}
else
{
IO0CLR = BEEPCON;
}
/* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */
while( (EXTINT&1<<3)!=0 )
{
EXTINT = 1<<3; // 清除EINT3中断标志,1<<3 等价于 0x08
}
VICVectAddr = 0; // 向量中断结束
}
/****************************************************************************
* 名 称:main()
* 功 能:初始化外部中断3(EINT3)为非向量中断,并设置为电平触发模式,然后等待外部中断。
* 说 明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int main(void)
{
PINSEL1 = 3<<8; // 设置管脚连接,P0.20设置为EINT3
// 3<<8 等价于 0x00000180
IO0DIR = BEEPCON; // 设置B1控制口为输出,其它I/O为输入
EXTMODE = 0x00; // 设置EINT3中断为电平触发模式
/* 打开EINT3中断(使用非向量IRQ) */
VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断
VICDefVectAddr = (int)IRQ_Eint3; // 设置中断服务程序地址
EXTINT = 1<<3; // 清除EINT3中断标志
VICIntEnable = 1<<17; // 使能EINT3中断,EINT3在Bit17上
while(1); // 等待中断
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -