小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

【感知层备赛训练题】CC2530开发基础-按键嵌套复合应用

任务要求

选择找到一个国赛Zigbee节点盒或者小蜜蜂的XMF09C赛教套件,新建IAR工程并编写、编译代码,实现按键嵌套复合应用,完成以下任务要求:
【1】程序开始运行时,LED1闪烁2下后熄灭,LED2闪烁3下后熄灭,此时SW1按键处于锁定状态,即单击或双击该按键均不能控制2个LED灯的开关状态。
【2】在按键锁定的状态下,长按SW1按键松开后,LED1闪烁1下后熄灭,SW1按键处于解锁状态。
【3】在按键解锁状态下,单击SW1按键,可切换LED1的开关状态;双击SW1按键,可切换LED2的开关状态。
【4】在按键解锁的状态下,长按SW1按键松开后,LED1和LED2同时闪烁1下后熄灭,SW1按键重新回到锁定状态。

注:原创题目,转载请注明出处:www.xmf393.com

参考源码

#include "ioCC2530.h"

#define LED1  P1_0
#define LED2  P1_1
#define SW1   P1_2
#define TT    1000

unsigned char F_Lock = 0;   //锁定状态标志
unsigned int count = 0;     //时间片计数
/*=======================简单的延时函数========================*/
void Delay(unsigned int t)
{
  while(t--);
}
/*=======================端口初始化函数========================*/
void Init_Port()
{
  P1SEL &= ~0x03;         //将P1_0,P1_1设置为通用I/O端口  
  P1DIR |= 0x03;          //将P1_0,P1_1设置为输出方向
  P1 &= ~0x03;            //关闭2个LED灯
  
  P1SEL &= ~0x04;         //将P1_2设置为通用I/O端口
  P1DIR &= ~0x04;         //将P1_2设置为输入方向
  P1INP &= ~0x04;         //将P1_2设置为上拉/下拉
  P2INP &= ~0x40;         //将P1_2设置为上拉
}
/*========================LED灯闪烁函数========================*/
void LED_ShanSuo()
{
  unsigned char i;
  for(i = 0; i < 2; i++)  //LED1灯闪烁2下
  {
    LED1 = 1;
    Delay(60000);
    LED1 = 0;
    Delay(60000);
  }
  for(i = 0; i < 3; i++)  //LED2灯闪烁3下
  {
    LED2 = 1;
    Delay(60000);
    LED2 = 0;
    Delay(60000);
  }
}
/*=======================按键扫描函数=========================*/
void Scan_Keys()
{
  if(SW1 == 0)            //发现有SW1按键信号
  {
    Delay(100);           //延时片刻,去抖动处理
    if(SW1 == 0)          //确认为SW1按键信号
    {
      count = 0;          //按键生命周期清0
      while(SW1 == 0)     //按键按下时,计算生命周期
      {
        Delay(200);
        count++;
      }
      
      if(count > TT)            //按下时间比生命周期长,长按
      {
        if(F_Lock == 0)   
        {
          F_Lock = 1;           //解锁
          LED1 = 1;
          Delay(60000);
          LED1 = 0;
          Delay(60000);
        }
        else 
        {
          F_Lock = 0;           //锁定
          LED1 = 1;
          LED2 = 1;
          Delay(60000);
          LED1 = 0;
          LED2 = 0;
          Delay(60000);
        }
      }
      else if(F_Lock == 1)
      {
        while(count <= TT)      //生命周期未结束
        {
          Delay(200);
          count++;
          
          if(SW1 == 0)          //在生命周期内有按键按下,双击
          {
            Delay(100);
            while(SW1 == 0);
            LED2 = ~LED2;
            break;
          }
        }
        
        if(count > TT)           //单击
        {
          LED1 = ~LED1;
        }
      }   
    }
  }       
}
/*==========================主函数============================*/
void main()
{
  Init_Port();            //端口初始化
  LED_ShanSuo();          //LED灯闪烁
 
  while(1)
  {
    Scan_Keys();          //按键扫描
  }
}
赞(30)
未经允许不得转载:小蜜蜂笔记 » 【感知层备赛训练题】CC2530开发基础-按键嵌套复合应用

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店