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

[复制链接]
 楼主| ohy3686 发表于 2018-9-30 21:00 | 显示全部楼层 |阅读模式
本帖最后由 ohy3686 于 2018-9-30 21:12 编辑

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

【题目要求】
      用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法。使用定时器的间隔定时来计算按键按下的时间是通用的做法,然而,使用普通的延时函数实现按键单击与双击的区分也是一个快速的处理手段。按键SW1单击的时候,切换D3灯的开关状态;按键SW1双击的时候,切换D4灯的开关状态。其中:
      按键SW1--------P1_2
      D3灯-----------P1_0(高电平点亮)
      D4灯-----------P1_1(高电平点亮)




【实现思路】
  <1> 定义一个普通的延时函数Delay()、一个计算时间的变量count和一个延时阈值TT。
  <2> 当SW1第1次按下的时候,等待按键松开,只要count小于TT时,调用Delay()进行延时,累计count变量。
  <3> 在count小于TT时,发现SW1按键再次按下,则为双击按键。
  <4> 如果在count大于等于TT的延时过程中都没有第二次按键按下,则为单击按键。


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

  2. #define D3 P1_0
  3. #define D4 P1_1
  4. #define K1 P1_2
  5. #define TT 2000
  6. unsigned int count = 0;

  7. void Delay(unsigned int t)
  8. {
  9.   while(t--);
  10. }

  11. void Init_Port()
  12. {
  13.   P1SEL &= ~0x03;   //将P1_0和P1_1设置为通用I/O端口
  14.   P1DIR |= 0x03;    //将P1_0和P1_1设置为输出模式  
  15.   P1SEL &= ~0x04;   //将P1_2设置为通用I/O端口
  16.   P1DIR &= ~0x04;   //将P1_2设置为输入模式
  17. }

  18. void Scan_Keys()
  19. {
  20.   if(K1 == 0)
  21.   {
  22.     Delay(100);       //按键去抖动处理
  23.     if(K1 == 0)       //确认有按键按下
  24.     {
  25.       while(K1 == 0);
  26.       while(count < TT)
  27.       {
  28.         Delay(100);
  29.         count++;
  30.         
  31.         if(K1 == 0)         //双击处理
  32.         {
  33.           Delay(100);
  34.           if(K1 == 0)
  35.           {
  36.             while(K1 == 0);
  37.             D4 = ~D4;
  38.             count = 0;
  39.             break;
  40.           }
  41.         }
  42.       }
  43.       
  44.       if(count >= TT)       //单击处理
  45.       {
  46.         D3 = ~D3;
  47.         count = 0;
  48.       }
  49.     }
  50.   }
  51. }

  52. void main()
  53. {
  54.   Init_Port();      //初始化端口
  55.   D3 = 1;
  56.   D4 = 1;
  57.   Delay(50000);
  58.   D3 = 0;
  59.   D4 = 0;
  60.   while(1)
  61.   {
  62.     Scan_Keys();    //扫描按键
  63.   }
  64. }
广东职业技术学院  欧浩源 <小蜜蜂老师>


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
uptown 发表于 2018-10-7 21:46 | 显示全部楼层
                                                   
backlugin 发表于 2018-10-11 21:55 | 显示全部楼层
                           
jstgotodo 发表于 2018-10-11 21:55 | 显示全部楼层
长按与短按只能通过定时器实现吗
backlugin 发表于 2018-10-11 21:56 | 显示全部楼层
多谢楼主分享的资料。     
jstgotodo 发表于 2018-10-11 21:56 | 显示全部楼层
一个按键可以实现多个功能了。
寂静海竹 发表于 2018-12-7 17:03 | 显示全部楼层
ayb_ice 发表于 2018-12-11 10:34 | 显示全部楼层
延时,严重影响其它任务
木子123 发表于 2020-1-9 17:49 | 显示全部楼层
您好,想请教您一个问题,就是CC2530在IAR开发的时候,出现IdataStack is outside这个怎么解决
The stack pointer for stack 'IdataStack' (currently IData:0x07) is outside the stack range (IData:0xC0 to IData:0x100)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

322

主题

899

帖子

3548

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:广东职业技术学院 欧浩源(ohy3686@foxmail.com)    [Zigbee技术&物联网应用] 群:168225322    [技术交流微信]:gzyohy (暗号:宝塔镇河妖)

322

主题

899

帖子

3548

粉丝
快速回复 在线客服 返回列表 返回顶部