ZigBee入门-CC2530-实验(四)-按键的长按与短按控制LED代码

现在很多嵌入式产品的按键不再是仅仅单一的一种功能,而是通过按键按下的时间去实现不同的功能。

/结合之前三个实验中所涉及到的LED、按键、定时器来实现按键的短按和长按对不同LED的控制。/

实验最后:
给小伙伴们补一下上节课被遗忘的关于定时/计数器T3的配置代码~~~

*按键SW1短按,切换LED1灯的亮灭状态;
*按键SW1长按,切换LED2灯的亮灭状态。
话不多说,直接上代码~~~
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char

#define LED1 P1_0      //P1.0口控制LED1
#define LED2 P1_1      //P1.口控制LED2
#define SW1 P0_5       //P0.5口控制SW1

uchar SW1_count = 0;   //定时计数
uchar SW1_flag = 0;    //按键按下标志位

void Init_Led();       //声明初始化LED函数
void Init_Key();       //声明初始化按键函数
void Scan_Key();       //声明按键检测函数
void Init_Timer1();    //声明定时器T1初始化函数
void Delay(uint ms);   //声明延时函数

/*===================主程序入口====================*/
void main()            
{

  Init_Led();           //初始化LED灯
  Init_Key();           //初始化按键

  while(1)
  {
    Scan_Key();        //一直检测按键
  }
}
/*==================中断响应服务子程序===============*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_int()
{
   T1STAT &= ~0x20;     //清除定时器1的溢出中断标志位
   if(SW1_flag != 0)    //是否按键按下
   {
     SW1_count++;       //定时计数值累加
   }
}
/*================声明函数的具体实现================*/
void Init_Led()
{
  P1SEL &=~ 0x03;     //配置P1.0 P1.1为通用I/O口
  P1DIR |=  0x03;     //配置P1.0 P1.1为输出
  LED1 = 0;           //初始LED1为熄灭
  LED2 = 0;           //初始LED2为熄灭
}
void Init_Key()
{
  P0SEL &= ~0x20;     //P0.5设为普通输出口
  P0DIR &= ~0x20;     //按键在P05设为输入 
  P0INP |= 0x20;      //P0.5为三态
}
void Init_Timer1()
{
  T1CTL = 0X0E;      //128分频,模模式
  
  T1CC0L = 0XD4;     //定时初值低8位
  T1CC0H = 0X30;     //定时初值高8位 定时:0.1s
  
  T1CCTL0 |= 0X04;   //开启通道0的输出比较模式
  T1IE = 1;          //开启定时器1中断
  T1OVFIM = 1;       //开启定时器1溢出中断
  EA = 1;            //开启总中断
}
void Scan_Key()
{
  if(SW1 == 0)
  {
    Delay(100);         //去抖动处理
    while(SW1 == 0)     //当是按键按下时 
    {   
      SW1_flag = 1;     //按键按下标志位置1,表示按键按下
      Init_Timer1();    //初始化定时器T1,开始定时
      
      while(SW1 == 0);  //等待按键松开
      SW1_flag = 0;     //按下标志位清0,表示按键已经松开
      
      if(SW1_count > 5) //通过SW1_count判断按键长按
       {    
         LED2 = ~LED2;
       }
      else              //通过SW1_count判断按键短按
       {
         LED1 = ~LED1;
       }
      SW1_count = 0;      //按键计数值清零
    }
  } 
}
void Delay(uint ms)
{
  uint i,j;
  for(i=0; i<ms; i++)
    for(j=0; j<535;j++);
}
定时/计数器T3:是一个8位的定时器,学过51的小伙伴就开心了,8位的想必都快配置吐了吧~
void Init_Timer3()
{
  T3CTL = 0x06;      //模模式,溢出中断禁止,清除计数器
  T3CTL = 0X80;      //时钟16分频
  T3CTL &= ~0X03;    //自动重装00~FF
  T3CTL |= 0X08;     //开T3中断
  
  T3CCTL0 = 0X00;    //通道0初值
  T3CC0 = 0XF0;      //定时器计数字节
  
  EA = 1;			 //开总中断
  T3IE = 1;          //开T3中断
  
  T3CTL = 0X10;      //启动定时器T3
}
/*==================中断响应服务子程序===============*/
#pragma vector = T3_VECTOR
__interrupt void Timer3_int()
{
   ;//这里添加你自己想搞的事情~
}
我会每天更新一篇ZigBee入门-CC2530-的基础实验,让大家学习Zigbee技术不在是从入门到“入土”,而是从入门到巅峰~!!!

欢迎大家的留言和评论我会在看到的第一时间内答复。
看完后感觉得到帮助的小伙伴,要点点赞哦~
给笔者一些动力嘛!谢谢啦 ^ _ ^ ~

原创文章 13 获赞 10 访问量 548

猜你喜欢

转载自blog.csdn.net/weixin_45636395/article/details/105800339