任务目标:

(1)掌握关键字interrupt的用法,设计中断服务函数

(2)对按键对应引脚设计对应外部中断

(3)对中断函数进行初步了解,将LED1常亮,LED2进行按键中断控制

具体步骤:

(1)首先明确此次任务目标,分别对需要控制的引脚进行中断初始化

void Init_INTP1()
{
  EA = 1;//使能总中断
  IEN2 |= 0X10;//将P1端口组使能中断
  P1IEN |= 0X04;//对应的P1引脚使能中断
  PICTL |= 0X04;//将端口设置为下降沿触发
}

外部中断如套娃式写法:总中断--外部中断(此处忽略了外部中断,但不影响代码执行)--端口组中断--具体引脚中断--具体中断的触发类型。

这里对中断触发类型做个具体解释:

触发类型分为上升沿触发和下降沿触发,通俗来说就是信号从从低电平到高电平(上升沿触发),高电平到低电平(下降沿触发)两种过程中所触发的动作。因此根据实际情况PICTL的中断触发方式:0为上升沿触发;1下降沿触发(可上网查讯)

(2)根据实际设计中断服务函数

确定端口组后将对应的外部中断向量赋值给它;使用关键字interrupt定义中断服务函数,实现中断功能,具体代码中可以去判断对应的引脚是否被置位,然后进行下一步,最后将外部中断请求置为零,实现按键的中断开关效果。

#pragma vector = P1INT_VECTOR//中断服务函数的赋值向量为P1端口组
__interrupt void Service_INTP1()
{
  if((P1IFG & 0X04) == 0X04)//判断操作是否为0x04,如果是那么P1_2位产生中断事件
  {
    P1_1 = ~P1_1;
  }
  P1IFG = 0x00;
  //最后将外部中断请求置为0,无中断操作实现中断P1_2开关
}

(3)进行最后的操作完善程序所需代码。(全代码如下)

#include <ioCC2530.h>

void delay(unsigned int time)//进行简单延时
{
  while(time--);
}

void Init_port()//引脚初始化
{
  P1DIR |= 0X03;
  P1SEL &= ~0X03;
  P1 &= ~0X1B;
}

void Init_INTP1()
{
  EA = 1;//使能总中断
  IEN2 |= 0X10;//将P1端口组使能中断
  P1IEN |= 0X04;//对应的P1引脚使能中断
  PICTL |= 0X04;//将端口设置为下降沿触发
}

#pragma vector = P1INT_VECTOR//中断服务函数的赋值向量为P1端口组
__interrupt void Service_INTP1()
{
  if((P1IFG & 0X04) == 0X04)//判断操作是否为0x04,如果是那么P1_2位产生中断事件
  {
    P1_1 = ~P1_1;
  }
  P1IFG = 0x00;
  //最后将外部中断请求置为0,无中断操作实现中断P1_2开关
}
void main(void)
{
    Init_port();//引脚初始化
    Init_INTP1();//中断初始化
    while(1)
    {
      delay(60000);
      P1_0 = 1;
    }
}

 

 

Logo

宁波官方开源宣传和活动阵地,欢迎各位和我们共建开源生态体系!

更多推荐