ZigBee CC2530学习(一) 按键中断控制LED实验

一、相关寄存器介绍

1.寄存器PxSEL

  • x为端口标号0~2;
  • 用来设置端口的每个引脚为通用I/O或者是外部设备I/O;
  • 默认时,每当复位后,所有数字输入输出引脚都设置为通用输入引脚。

2.寄存器PxDIR

  • 设置每个端口引脚为输入或者输出,设置PxDIR指定位为1,其对应引脚就被设置为输出。

3.中断屏蔽寄存器

  • 中断请求可通过设置中断使能寄存器IEN0、IEN1或IEN2的中断使能位使能或禁止。
    IEN0

IEN1
IEN2

4.中断标志寄存器

  • 中断产生时,cpu会在中断标志寄存器中设置中断标志位,可通过中断标志位来判断是否发生了相应的中断;
  • TCON、S0CON、S1CON、IRCON、IRCON2是CC2530的五个中断标志寄存器;
    TCON

S0CON、S1CON
IRCON
IRCON2

  • P0IFG、P1IFG、P2IFG是端口0、1、2每一位的中断标志寄存器。

二、电路图

  • LED电路图
    LED电路图
  • 按键电路图
    按键电路图

三、程序思路

程序实现按键中断控制两盏灯的亮灭,按一次,LED1亮,第二次,LED2亮,LED灭,第三次,全亮,第四次,全灭。

  1. 初始化LED;
  2. 初始化按键为中断方式;
  3. 初始化中断标志位;
  4. 进入死循环,检测是否有中断;
    4.1 若有,执行中断处理函数;
    4.2 否则,继续循环检测;

四、程序代码

#include<ioCC2530.h>

#define uchar unsigned char
#define uint  unsigned int
#define LED1 P1_0 
#define LED2 P1_1
#define Key1 P1_2

uchar count=0;    //计数器

void Delay(unsigned int time)
{
  unsigned int i,j;
  for(i=0;i<time;i++)
    for(j=0;j<10000;j++);
}
void main()
{
  
  P1SEL &=  ~0x07;    //设置P1_0 P1_1为通用IO口
  P1DIR |=  0x03;    //设置P1_0 P1_1为输出模式,P1_2输入
  LED1  = 0;
  LED2  = 0;
  P1INP |= 0x04;     //P1_3为上拉
  P1IEN |= 0x04;     //P1_3设置为中断方式
  PICTL |= 0x04;	 //下降沿触发
  
  EA = 1;			//打开总中断
  IEN2 |= 0x10;     //P1设置为中断方式
  P1IFG |= 0x00;    //初始化中断标志位
  
  
  while(1)
  {
    ;
  }
}

#pragma vector= P1INT_VECTOR        //端口P0中断处理函数
__interrupt void P1_ISR(void)
{
   Delay(5);
   if(Key1==0)
   {
      count++;
      if(count%4==0)		//按四次,全灭;
      {
         LED1 = 0;
         LED2 = 0;
      }
      else if(count%4==1)	//按一次,LED1亮
      {
         LED1 = 1;
         LED2 = 0;
      }
      else if(count%4==2)	//按两次,LED2亮
      {
         LED2 = 1;
         LED1 = 0;
      }
      else if(count%4==3)	//按三次,全亮
      {
         LED1 = 1;
         LED2 = 1;
      }
      P1IFG = 0;			//清除P1_3中断标志
      P1IF = 0;				//清除P1中断标志
   }
}

注意:中断处理函数最后一定要清除标志位。

发布了6 篇原创文章 · 获赞 12 · 访问量 681

猜你喜欢

转载自blog.csdn.net/weixin_43871310/article/details/102962102