cc2530的第三次实验,按键中断控制流水灯

cc2530的第三次实验:按键中断控制流水灯

效果为按一次按键,流水灯亮一次

实验相关电路图:
alt 实验三电路图

实验相关寄存器:
alt 实验三寄存器

初始化函数

//初始化LED灯
    //设置P1SEL,通用为0,外设为1 11111100
    P1SEL &=~0x03;

    //设置P0SEL,    11101111
    P0SEL &= ~0x10;

    //设置P1DIR,输出为1,输入为0  00000011
    P1DIR |= 0x03;

    //设置P0DIR     00010000
    P0DIR |= 0x10;     


//初始化按钮和中断
//初始化按钮
    //初始化P0SEL,通用为0     11111101
    P0SEL&=~0x02;
    //初始化P0DIR,输入为0     11111101
    P0DIR&=~0x02;

//初始化中断
    //设置引脚中断 1为中断使能 00000010
    P0IEN |= 0x02;
    //设置端口中断
    IEN1=1;
    //设置端口中断触发方式 1为中断使能
    IEN1|=0x20;
    //设置总中断
    EA=1;
    //清空标志位
    P0IFG=0;

中断服务函数


//中断服务函数
#pragma vector = P0INT_VECTOR        //这一行的P0INT_VECTOR是中断源的名称吗?
__interrupt void P0ISR(void)
{
  //清除端口中断标志位
  P0IFG=0;
  
  //LED灯流水亮一遍
  BLink();

  //清除端口中断标志位
  P0IF=0;


}

上面的代码一定要注意P0IFG一定要在P0IF之前清除,话说P0IF与P0IFG到底是干啥用的?他们之间什么关系,端口的标志寄存器?(记得查一下)
P0IFG是端口0中断状态标志,P0IF是cpu内中断标志寄存器,什么鬼,没弄明白啊,问一下老师吧!

全部代码


#include <ioCC2530.h>

typedef unsigned int uint;
typedef unsigned char uchar;
#define LED1 P1_0
#define LED2 P1_1 
#define LED3 P0_4
#define BUTTON1 P0_1 

uint time=300;

//延迟函数
void Delay(uint time)
{
  for(uint i=0;i<time;i++)
      for(uint j=0;j<1070;j++);
}



//初始化函数
void Init(void)
{
//初始化LED灯
    //设置P1SEL,通用为0,外设为1 11111100
    P1SEL &=~0x03;

    //设置P0SEL,    11101111
    P0SEL &= ~0x10;

    //设置P1DIR,输出为1,输入为0  00000011
    P1DIR |= 0x03;

    //设置P0DIR     00010000
    P0DIR |= 0x10;     


//初始化按钮和中断
//初始化按钮
    //初始化P0SEL,通用为0     11111101
    P0SEL&=~0x02;
    //初始化P0DIR,输入为0     11111101
    P0DIR&=~0x02;

//初始化中断
    //设置引脚中断 1为中断使能 00000010
    P0IEN |= 0x02;
    //设置端口中断
    IEN1|=0x20;
    //设置端口中断触发方式 1为下降沿触发
    PICTL|=0x01;
    //设置总中断
    EA=1;
    //清空标志位
    P0IFG=0;


}




void BLink()
{
  Delay(time);
  LED1=0;
  LED2=1;
  LED3=1;
  Delay(time);
  LED1=0;
  LED2=0;
  LED3=1;
  Delay(time);
  LED1=0;
  LED2=0;
  LED3=0;
  Delay(time);
  LED1=1;
  LED2=1;
  LED3=1;



}

//中断服务函数
#pragma vector = P0INT_VECTOR        //这一行的P0INT_VECTOR是中断源的名称吗?
__interrupt void P0ISR(void)
{
  //清除端口中断标志位
  P0IFG=0;
  
  //LED灯流水亮一遍
  BLink();

  //清除端口中断标志位
  P0IF=0;

}







//主函数
void main()
{
  
 
  Init(); 
  LED3=0;
  while(1)
  {
  //LED3=0;
  }



  //return ;

}






这个实验的难点以及重点主要是在初始化中断这个过程,
初始化引脚的寄存器P0IEN|=0x02;
设置端口中断的寄存器IEN1|=0x20;
设置端口中断触发方式PICTL|=0x01;
设置总中断EA=1
清空标志位:P0IFG=0;

猜你喜欢

转载自www.cnblogs.com/longbaoshushu/p/12076394.html