【CC2530强化实训03】定时器间隔定时实现按键长按与短按

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

【CC2530强化实训03】定时器间隔定时实现按键长按与短按

【题目要求】
    虽然用普通的延时函数能够实现按键长按与短按的判别,但是在实际的工程应用和项目开发中并不好用也不灵活。更多得是借助定时器的间隔定时来计算按键从按下到松开的时间间隔,然后通过判断该时间值来区分按键长按与短按的状态。
    在新大陆国赛设备的黑色Zigbee模块上,或者小蜜蜂制作的XMF09B和XMF09C中,按键SW1短按,切换D5灯的开关状态;按键SW1长按,切换D6灯的开关状态
    按键SW1----------P1_2
    D5灯-------------P1_3(高电平点亮)
    D6灯-------------P1_4(高电平点亮)


【实现思路】
  <1> 定义一个变量K_Press,标志按键状态。按键在按下状态时,值为1;按键在松开状态时,值为0。
  <2> 定义一个变量count_t,计算按键处在按下状态的时间,也就是K_Press为1时的时间。
  <3> 在按键松开后,通过判断count_t的值来区分按键长按与短按状态。
  <4> 每处理完一个按键状态,随即将count_t清0。

【实现代码】
  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. unsigned char K_Press = 0;
  8. unsigned char count_t = 0;

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

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

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

  40. /*====================定时器1服务函数========================*/
  41. #pragma vector = T1_VECTOR
  42. __interrupt void Timer1_int()
  43. {
  44.   T1STAT &= ~0x20;    //清除定时器1的溢出中断标志位
  45.   if(K_Press != 0)    //按键按下
  46.   {
  47.     count_t++;        //计算按下按下的时间值
  48.   }
  49. }
  50. /*====================按键扫描处理函数========================*/
  51. void Scan_Keys()
  52. {
  53.   if(SW1 == 0)
  54.   {
  55.     Delay(100);         //去抖动处理
  56.     if(SW1 == 0)
  57.     {
  58.       K_Press = 1;      //标志按键正在按下
  59.       while(SW1 == 0);  //等待按键松开
  60.       K_Press = 0;      //标志按键已经松开
  61.       
  62.       if(count_t > 5)   //按键长按
  63.       {   
  64.         D6 = ~D6;
  65.       }
  66.       else              //按键短按
  67.       {
  68.         D5 = ~D5;
  69.       }
  70.       count_t = 0;      //按键计数值清零
  71.     }
  72.   }
  73. }

  74. /*=========================主函数=============================*/
  75. void main()
  76. {
  77.   Init_Port();
  78.   Init_Timer1();

  79.   while(1)
  80.   {
  81.     Scan_Keys();
  82.   }
  83. }
广东职业技术学院  欧浩源 <小蜜蜂老师>



本帖子中包含更多资源

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

×

评论

老师幸苦了  发表于 2020-6-7 11:09
dirtwillfly 发表于 2018-10-3 14:34 | 显示全部楼层
辛苦啊。国庆节还在发教程。
cooldog123pp 发表于 2018-10-3 20:37 | 显示全部楼层
只能简单的项目上用,干扰复杂的,肯定不好用你这个,按键一多,就更头大了,教点大家优质代码。
 楼主| ohy3686 发表于 2018-10-3 23:18 | 显示全部楼层
cooldog123pp 发表于 2018-10-3 20:37
只能简单的项目上用,干扰复杂的,肯定不好用你这个,按键一多,就更头大了,教点大家优质代码。 ...

只针对初学者和入门者。
小小电子爱好者 发表于 2018-10-5 21:29 | 显示全部楼层
感觉初学者学习还行
sanfuzi 发表于 2018-10-10 16:28 | 显示全部楼层
这个长按与短按检测费劲了。
soodesyt 发表于 2018-10-10 16:28 | 显示全部楼层
小小板子越来越厉害了。
sanfuzi 发表于 2018-10-10 16:31 | 显示全部楼层
定时器判断逻辑也复杂。
soodesyt 发表于 2018-10-10 16:31 | 显示全部楼层
连续按键检测呢?
寂静海竹 发表于 2018-12-7 17:03 | 显示全部楼层
gygp 发表于 2020-7-2 22:10 | 显示全部楼层
真正的片上系统(SoC)解决方案  
chenci2013 发表于 2020-7-2 22:10 | 显示全部楼层
版主确实很牛呢。      
biechedan 发表于 2020-7-2 22:10 | 显示全部楼层
厉害了,跟着版主多多学习。   
wangdezhi 发表于 2020-7-2 22:11 | 显示全部楼层
CC2530芯片应用   
isseed 发表于 2020-7-2 22:11 | 显示全部楼层
CC2530是TI公司出的一款支持ZigBee技术的芯片。  
xietingfeng 发表于 2020-7-2 22:11 | 显示全部楼层
cc2530单片机如何定义一个标志变量
suzhanhua 发表于 2020-7-2 22:11 | 显示全部楼层
详细介绍下cc2530的硬件结构  
mituzu 发表于 2020-7-2 22:11 | 显示全部楼层
CC2530本身就是8051内核单片机+RF无线电部分组成的
hellosdc 发表于 2020-7-2 22:11 | 显示全部楼层
cc2430与cc2530的区别?  
uiint 发表于 2020-7-2 22:11 | 显示全部楼层
CC2530 ZIGBEE自组网模块如何使用?  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

322

主题

899

帖子

3548

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

322

主题

899

帖子

3548

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