本帖最后由 holykay 于 2011-12-7 14:35 编辑
用的LPC2148的P0.14中断EINT1控制P0.21接口的LED灯,让其亮灭
但是为什么在硬件上没有反应呢?这里用的是IAR编译器,但是应该和编译器没什么关系,难道是我在写的程序中没有把p0.14设置写对么?
#include <NXP/iolpc2148.h>
#include <intrinsics.h>
#include <stdio.h>
#define LED 1<<21 //LED的正极接3.3V,负极接P0.21
void Delayn(unsigned long n);
void KeyIntHandler(void)
{
unsigned char i;
EXTINT_bit.EINT1=1;
__disable_interrupt();
for(i=0;i<100;i++)
{
if ((IO0PIN&LED)==0) //实现p0.14外部中断的时候,LED可以自己亮灭闪烁100次
{ //如果原先LED亮就灭,如果原先LED灭就亮
IO0SET =LED;
Delayn(10000); //时间延时
}
else
{
IO0CLR =LED;
Delayn(10000);
}
}
__enable_interrupt();
VICVectAddr=0;
}
void main(void)
{
PINSEL1=0; //连接到GPIO P0_21,P0_22都是在PINSEL1的控制下的
IO0DIR |=LED; //输出
IO0SET =LED;
__disable_interrupt();
//清除中断
VICIntSelect = 0; // Set all VIC interrupts to IRQ for now
VICIntEnClear = 0xFFFFFFFF; // Diasable all interrupts
VICProtection = 0; // VIC registers can be accessed in User or
// privileged mode
VICVectAddr = 0; // Clear interrupt
VICProtection = 0; // Accesss VIC in USR | PROTECT
//初始化中断
PINSEL0_bit.P0_14 = 2; //设置端口链接到到外部中断
EXTMODE = 0x5; //设置外部中断为边沿触发模式
EXTPOLAR = 0; //下降沿触发
VICIntSelect &= ~(1<<VIC_EINT1);//将中断安排到IRQ
//注册设置
VICVectAddr0 = (unsigned int)&KeyIntHandler; //中断处理函数
VICVectCntl0_bit.NUMBER = VIC_EINT1; //设置中断
VICVectCntl0_bit.ENABLED = 1;
EXTINT_bit.EINT1 = 1; //清中断标志位
VICIntEnable |= (1<<VIC_EINT1); //使能中断
__enable_interrupt();
while(1);
}
//延时周期数
void Delayn(unsigned long n)
{
while(n--);
}
//irq 中断入口
#pragma vector=IRQV
__irq __arm void irq_handler (void)
{
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; //获得中断向量.
interrupt_function = (void(*)())vector;
if(interrupt_function != NULL)//这里用到了NULL必须用stdio.h文件
{
interrupt_function(); //调用向量中断函数.
}
else
{
VICVectAddr = 0; //清除VIC中的中断.
}
}
//fiq中断入口
__fiq __arm void fiq_handler (void)
{
while(1);
} |