您的位置:首页 > 其它

利用ARM外部中断控制流水灯的闪烁速度(基于LPC2134)

2011-03-14 01:43 357 查看
#include "config.h"

void __irq Eint0_IRQ(void);   //INT0中断函数声明
void delay(int dly);   //delay延时函数声明

//流水灯数值表
int Led_Table[]={
0x00fe0000,0x00fd0000,0x00fb0000,0x00f70000,0x00ef0000,
0x00df0000,0x00bf0000,0x007f0000};
int Delaytime=70;

//主函数

int main(void)
{
int i=0;
PINSEL0=0X000CC0CC;  //使能p0.1 p0.3 p0.7 p0.8分别为外部中断0.1.2.3
PINSEL1=0X00000000;     //使能p1.16~23为IO功能
IO1DIR=0XFF<<16;   //这个写法很清楚,推荐
IRQEnable();
VICIntSelect=0x00000000; //设置所有的终端都为IRQ中断
VICVectCntl0=0x20|14;   //设置INT0为IRQ中断,使用slot0
VICVectAddr0=(uint32)Eint0_IRQ; //设置终端服务程序地址
VICIntEnable=0x00004000;   //使能INT0
EXTMODE=0x00;  //INT0电平触发
EXTPOLAR=0x00;    //触发电平为低电平
EXTINT=0x0f;  //清除所有中断标志
while(1)
{
IO1SET=Led_Table[i];//设置高电平引脚
IO1CLR=~Led_Table[i];    //设置低电平引脚
delay(Delaytime);
i+=1;
if(i==8)
{
i=0;
}

}
return 0;
}

/****************************************************************************
# * 名称:delay
# * 功能:延时函数
# * 入口参数:延时时间
# * 出口参数:无
# ****************************************************************************/
void delay(int dly)
{
int i,j;
for(i=0; i<dly; i++)
for(j=0; j<25000; j++);

}

/****************************************************************************
# * 名称:Eint0_IRQ()
# * 功能:外部中断1中断处理程序。
# * 入口参数:无
# * 出口参数:无
# ****************************************************************************/
void __irq Eint0_IRQ(void)
{

if(Delaytime>20)
{
Delaytime-=20;  //加快流水灯的闪烁速度
}
while((EXTINT&0x01)!=0)   //不断被清除标志位,直到外部恢复高电平,此时EXTINT的最低位位0
{
EXTINT=0x01;

}
VICVectAddr=0;  //必须操作
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐