打印

【CC2530强化实训01】普通延时函数实现按键的长按与短按

[复制链接]
1574|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ohy3686|  楼主 | 2018-9-10 15:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ohy3686 于 2018-9-30 21:11 编辑

【CC2530强化实训01】普通延时函数实现按键的长按与短按

【题目要求】
      用一个按键实现长按与短按的功能已经是很多嵌入式产品的常用手法。使用定时器的间隔定时来进行按键按下的时间是通用的做法,然而对于不太熟悉定时器使用,又没有严格的延时长度的情况下,使用普通的延时函数实现长短按键的区分也是一个不错的选择。按键SW1短按的时候,切换D3灯的开关状态;按键SW1长按的时候,切换D4灯的开关状态。其中:
    按键SW1--------P1_2
    D3灯-------------P1_0(高电平点亮)
    D4灯-------------P1_1(高电平点亮)


【实现思路】
  <1> 定义一个普通的延时函数Delay()和一个计算时间的变量count。
  <2> 在按键扫描函数中,当SW1按下的时候,不断调用延时函数Delay()并对调用的次数进行累计保存在count中。
  <3> 当SW1松开的时候,停止调用延时函数Delay(),对count变量进行判断,大于某个阈值属于长按,否则是短按。

【实现代码】
#include "ioCC2530.h"

#define D3 P1_0
#define D4 P1_1
#define K1 P1_2
#define TT 20
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设置为输出模式  
  P1SEL &= ~0x04;   //将P1_2设置为通用I/O端口
  P1DIR &= ~0x04;   //将P1_2设置为输入模式
}

void Scan_Keys()
{
  if(K1 == 0)
  {
    Delay(100);       //按键去抖动处理
    if(K1 == 0)       //确认有按键按下
    {
      count = 0;      //延时技术变量清0
      while(K1 == 0)  //按键按下状态
      {
        Delay(10000);
        count++;      //计算按键按下的时间
      }
      if(count < TT)  //短按
      {
        D3 = ~D3;
      }
      else            //长按
      {
        D4 = ~D4;
      }
    }
  }
}

void main()
{
  Init_Port();      //初始化端口
  D3 = 1;
  D4 = 1;
  Delay(50000);
  D3 = 0;
  D4 = 0;
  while(1)
  {
    Scan_Keys();    //扫描按键
  }
}
广东职业技术学院  欧浩源 <小蜜蜂老师>


评论
dirtwillfly 2018-9-11 23:06 回复TA
感谢分享 

相关帖子

沙发
quickman| | 2018-9-18 21:54 | 只看该作者
                        

使用特权

评论回复
板凳
backlugin| | 2018-9-18 21:55 | 只看该作者
使用定时器是不是更精确呢

使用特权

评论回复
地板
backlugin| | 2018-9-18 21:55 | 只看该作者
很多都是自带的延时函数。

使用特权

评论回复
5
dzfansman| | 2018-9-18 21:55 | 只看该作者
谢谢分享的。

使用特权

评论回复
6
ohy3686|  楼主 | 2018-9-19 09:21 | 只看该作者
backlugin 发表于 2018-9-18 21:55
使用定时器是不是更精确呢

正常的做法是应该用定时器,不但精确而且容易处理。帖子中的做法只是对于初学者或者不熟悉定时器使用的人来说,是个不错的选择。

使用特权

评论回复
7
dirtwillfly| | 2018-9-19 10:16 | 只看该作者
backlugin 发表于 2018-9-18 21:55
使用定时器是不是更精确呢

在demo程序中,用延时函数能简化程序,让初学者更容易理解

使用特权

评论回复
8
uptown| | 2019-1-8 21:51 | 只看该作者
学习一下无线通信。           

使用特权

评论回复
9
uptown| | 2019-1-8 21:51 | 只看该作者
感谢楼主分享的资料。                  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:广东职业技术学院 欧浩源(ohy3686@foxmail.com)    [Zigbee技术&物联网应用] 群:168225322    [技术交流微信]:gzyohy (暗号:宝塔镇河妖)

322

主题

899

帖子

2941

粉丝