CC2530定时器间隔定时实现按键长按与短按

题目:

虽然用普通的延时函数能够实现按键长按与短按的判别,但是在实际的工程应用和项目开发中并不好用也不灵活。更多得是借助定时器的间隔定时来计算按键从按下到松开的时间间隔,然后通过判断该时间值来区分按键长按与短按的状态。

新大陆国赛设备的黑色Zigbee模块,按键SW1短按,切换D5灯的开关状态;按键SW1长按,切换D6灯的开关状态。

按键SW1--->P1_2      D5灯--->P1_3(高电平点亮)     D6灯--->P1_4(高电平点亮)

思路:

<1> 定义一个变量F_key,标志按键状态。按键在按下状态时,值为1;按键在松开状态时,值为0。

<2> 定义一个变量count,计算按键处在按下状态的时间,也就是F_key为1时的时间。

<3> 在按键松开后,通过判断count的值来区分按键长按与短按状态。

<4> 每处理完一个按键状态,随即将count清0。

代码:

#include "iOCC2530.h"

#define D3 P1_0
#define D6 P1_4

#define sw1 P1_2

unsigned char F_key = 0; //按键状态
unsigned char count = 0; //定义计数标志位

//延时函数
void Delay(unsigned int t)
{
  while(t--);
}

//初始化端口函数
void Init_port()
{
  P1SEL &= ~0x1b;
  P1DIR |= 0x1b;
  P1 &= ~0x1b;
}

//初始化定时器
void Init_time1()
{
  T1CC0L = 0xd4;
  T1CC0H = 0x30; //16MHz时钟,128分频,定时0.1秒
  T1CCTL0 |= 0x04;
  T1IE = 1;      //开启通道0的输出比较模式
  EA = 1;
  T1CTL = 0x0e;  //分频系数是128,模模式    
}

//定时器1服务函数
#pragma vector = T1_VECTOR
__interrupt void Scever_time1()
{
  if(F_key == 1)//按键按下
  {
    count++; //开始计时
  }
}
//按键扫描函数
void Scan_keys()
{
  if(sw1 == 0)
  {
    Delay(200); //去抖动处理
    if(sw1 == 0)
    {
      F_key = 1; //按下
      while(sw1 == 0);//等待松开
      F_key = 0; //松开
      
      if(count > 5)//长按
      {
        D3 = ~D3;
      }
      else        //短按
      {
        D6 = ~D6;
      }
      count = 0; //标志位清零
    }
  }
}
//主函数
void main()
{
  Init_port(); //初始化端口
  Init_time1(); //初始化定时器
  while(1)
  {
    Scan_keys(); //按键扫描函数
  }
}

好的,使用定时器也是一种实现按键短按双击的方法。 具体实现方法可以参考以下步骤: 1. 初始化定时器。选择合适的定时器,并设置定时器的时钟源、计数模式、计数周期等参数。一般推荐使用定时器的计数模式为向上计数,并且设置一个合适的计数周期。 2. 初始化按键。选择合适的引脚作为按键输入,配置引脚的输入模式和上拉/下拉电阻。一般推荐使用上拉电阻,使按键默认为高电平。 3. 在定时器中断服务函数中实现按键状态的检测和处理。在定时器中断服务函数中,读取按键状态,并根据当前状态和前一次状态的变化,判断按键事件的类型。如果按键被按下,则记录按下时间;如果按键被释放,则记录释放时间,并根据时间间隔判断按键事件的类型。 4. 根据按键事件的类型,执行相应的操作。例如,按事件可以用于开启或关闭某个功能;短按事件可以用于切换不同的模式;双击事件可以用于执行快速操作。 注意事项: 1. 在定时器中断服务函数中,需要注意防抖处理。对于按键输入信号,由于存在抖动现象,因此需要使用软件或硬件方式进行防抖处理,以确保检测到的按键状态是稳定的。 2. 在定时器中断服务函数中,需要注意按键状态的检测间隔。检测间隔过短会导致系统负载过高,检测间隔会影响按键检测的灵敏度,因此需要选择一个合适的检测间隔。 3. 在定时器中断服务函数中,需要注意定时器的溢出问题。如果定时器的计数周期比较短,容易出现定时器溢出的情况,需要进行相应的处理。 总之,使用定时器实现按键短按双击需要结合具体的硬件平台和软件环境进行综合考虑,根据实际需求选择合适的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值