打印
[ZLG-ARM]

LPC2148de 外部中断控制一个led灯的亮灭,为什么不行呢?

[复制链接]
2283|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
holykay|  楼主 | 2011-12-7 13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

1

粉丝