【CC2530强化实训04】定时器间隔定时实现按键N连击

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

【CC2530强化实训04】定时器间隔定时实现按键N连击

【题目要求】
    2018年全国职业院校技能大赛“物联网技术应用”国赛(高职组)中关于感知层开发的难度陡然增大,三个题目均在Zigbee协议栈下完成。其中第一个题目“仓库温湿度智能控制系统”考查了按键单击、双击和三连击。为了让大家更好的掌握按键的复杂处理思路,在这里通过一个具体的实训案例,讲述通过间隔定时实现按键N连击的基本思路。
    在新大陆国赛设备的黑色Zigbee模块上,或者小蜜蜂制作的XMF09B和XMF09C中,按键SW1单击,切换D5灯的开关状态;按键SW1双击,切换D6灯的开关状态;按键SW1三连击,切换D3灯的开关状态;按键SW1四连击,切换D4灯的开关状态
      按键SW1-----------P1_2
      D5灯--------------P1_3(高电平点亮)
      D6灯--------------P1_4(高电平点亮)
      D3灯--------------P1_0(高电平点亮)
      D4灯--------------P1_1(高电平点亮)

【实现思路】
    每个按键按下都定义一个生命周期,假如是0.5秒,生命周期结束的时候才确定按键的最终状态。如果在按键的生命周期内有新的按键按下,将会重新计算生命周期,这时候就是双击。在双击的生命周期中,又有新的按键按下,则生命周期会重新计算,这时候就是三连击。在整个生命周期中如果没有新的按键按下,那么最终的按键状态就是三连击。如此类推。


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

  2. #define D3  P1_0
  3. #define D4  P1_1
  4. #define D5  P1_3
  5. #define D6  P1_4
  6. #define SW1 P1_2
  7. #define SW2 P0_1

  8. unsigned char count_t = 0;
  9. unsigned char K_Num = 0;

  10. /*=======================简单的延时函数========================*/
  11. void Delay(unsigned int t)
  12. {
  13.   while(t--);
  14. }

  15. /*======================端口初始化函数========================*/
  16. void Init_Port()
  17. {
  18.   P1SEL &= ~0x1b;     //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
  19.   P1DIR |= 0x1b;      //P1_0、P1_1、P1_3和P1_4端口输出
  20.   
  21.   P1SEL &= ~0x04;     //P1_2作为通用I/O端口
  22.   P1DIR &= ~0x04;     //P1_2端口输入
  23.   P1INP &= ~0x04;     //P1_2设置为上拉/下拉模式
  24.   P2INP &= ~0x40;     //P1_2设置为上拉
  25. }

  26. /*=======================定时器1初始化========================*/
  27. void Init_Timer1()
  28. {
  29.   T1CC0L = 0xd4;      
  30.   T1CC0H = 0x30;        //16MHz时钟,128分频,定时0.1秒
  31.   T1CCTL0 |= 0x04;      //开启通道0的输出比较模式
  32.   T1IE = 1;
  33.   EA = 1;
  34.   T1CTL = 0x0e;         //分频系数是128,模模式
  35. }

  36. /*====================定时器1服务函数========================*/
  37. #pragma vector = T1_VECTOR
  38. __interrupt void Timer1_int()
  39. {
  40.   T1STAT &= ~0x20;    //清除定时器1的溢出中断标志位
  41.   if(K_Num != 0 && SW1 != 0)      
  42.   {
  43.     count_t++;        //定时器1溢出一次加1,溢出周期为0.1S
  44.   }
  45. }

  46. /*====================按键扫描处理函数========================*/
  47. void Scan_Keys()
  48. {
  49.   if(SW1 == 0)
  50.   {
  51.     Delay(100);         //去抖动处理
  52.     if(SW1 == 0)
  53.     {
  54.       while(SW1 == 0);  //等待按键松开
  55.       count_t = 0;      //重新计算按键的生命周期
  56.       K_Num++;          //改变按键状态
  57.       if(K_Num > 4)     //四连击以上均判为四连击
  58.       {
  59.         K_Num = 4;
  60.       }
  61.     }
  62.   }
  63.   if(count_t > 5)       //按键的生命周期结束
  64.   {   
  65.     switch(K_Num)
  66.     {
  67.       case 1:           //按键单击
  68.         D5 = ~D5;
  69.       break;
  70.       case 2:           //按键双击
  71.         D6 = ~D6;
  72.       break;
  73.       case 3:           //按键三连击
  74.         D3 = ~D3;
  75.       break;
  76.       case 4:           //按键四连击
  77.         D4 = ~D4;
  78.       break;
  79.     }
  80.     K_Num = 0;     //每处理完一次按键,状态清零
  81.     count_t = 0;   //计时清零
  82.   }
  83. }

  84. /*=========================主函数=============================*/
  85. void main()
  86. {
  87.   Init_Port();
  88.   Init_Timer1();
  89.   D3 = 0;
  90.   D4 = 0;
  91.   D5 = 0;
  92.   D6 = 0;
  93.   while(1)
  94.   {
  95.     Scan_Keys();
  96.   }
  97. }

广东职业技术学院  欧浩源 <小蜜蜂老师>

本帖子中包含更多资源

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

×
jimmhu 发表于 2018-10-7 21:47 | 显示全部楼层
以前想过,没有实践过,谢谢分享。                  
jemhad 发表于 2018-10-11 11:15 | 显示全部楼层
我也这么想的 谢谢分享
houjiakai 发表于 2018-10-14 16:22 | 显示全部楼层
N连击厉害了。
i1mcu 发表于 2018-10-14 16:23 | 显示全部楼层
最多可以实现几连击呢?
houjiakai 发表于 2018-10-14 16:23 | 显示全部楼层
                              
i1mcu 发表于 2018-10-14 16:23 | 显示全部楼层
只能定义到0.5ms吗?
寂静海竹 发表于 2018-12-7 17:02 | 显示全部楼层
点赞,感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

322

主题

899

帖子

3548

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

322

主题

899

帖子

3548

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