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


    【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 
     3 #define D3  P1_0
     4 #define D4  P1_1
     5 #define D5  P1_3
     6 #define D6  P1_4
     7 #define SW1 P1_2
     8 
     9 unsigned char K_Press = 0;
    10 unsigned char count_t = 0;
    11 
    12 /*=======================简单的延时函数========================*/
    13 void Delay(unsigned int t)
    14 {
    15   while(t--);
    16 }
    17 
    18 /*======================端口初始化函数========================*/
    19 void Init_Port()
    20 {
    21   P1SEL &= ~0x1b;     //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
    22   P1DIR |= 0x1b;      //P1_0、P1_1、P1_3和P1_4端口输出
    23   
    24   P1SEL &= ~0x04;     //P1_2作为通用I/O端口
    25   P1DIR &= ~0x04;     //P1_2端口输入
    26   P1INP &= ~0x04;     //P1_2设置为上拉/下拉模式
    27   P2INP &= ~0x40;     //P1_2设置为上拉
    28   
    29   D3 = 0;
    30   D4 = 0;
    31   D5 = 0;
    32   D6 = 0;
    33 }
    34 
    35 /*=======================定时器1初始化========================*/
    36 void Init_Timer1()
    37 {
    38   T1CC0L = 0xd4;      
    39   T1CC0H = 0x30;        //16MHz时钟,128分频,定时0.1秒
    40   T1CCTL0 |= 0x04;      //开启通道0的输出比较模式
    41   T1IE = 1;
    42   EA = 1;
    43   T1CTL = 0x0e;         //分频系数是128,模模式
    44 }
    45 
    46 /*====================定时器1服务函数========================*/
    47 #pragma vector = T1_VECTOR
    48 __interrupt void Timer1_int()
    49 {
    50   T1STAT &= ~0x20;    //清除定时器1的溢出中断标志位
    51   if(K_Press != 0)    //按键按下
    52   {
    53     count_t++;        //计算按下按下的时间值
    54   }
    55 }
    56 /*====================按键扫描处理函数========================*/
    57 void Scan_Keys()
    58 {
    59   if(SW1 == 0)
    60   {
    61     Delay(100);         //去抖动处理
    62     if(SW1 == 0)
    63     {
    64       K_Press = 1;      //标志按键正在按下
    65       while(SW1 == 0);  //等待按键松开
    66       K_Press = 0;      //标志按键已经松开
    67       
    68       if(count_t > 5)   //按键长按
    69       {    
    70         D6 = ~D6;
    71       }
    72       else              //按键短按
    73       {
    74         D5 = ~D5;
    75       }
    76       count_t = 0;      //按键计数值清零
    77     }
    78   }
    79 }
    80 
    81 /*=========================主函数=============================*/
    82 void main()
    83 {
    84   Init_Port();
    85   Init_Timer1();
    86 
    87   while(1)
    88   {
    89     Scan_Keys();
    90   }
    91 }

    【广东职业技术学院  欧浩源 <小蜜蜂老师>  ohy3686@qq.com】

  • 相关阅读:
    css技巧---电子表体字体引入
    解决for循环,暂停3s,在执行下次循环
    node 将汉字转化为拼音
    针对CMS中的tag标签理解
    博客园上传markdown文件方法
    正则表达式匹配非某字符串的情况
    ubuntu 20.04 MySQL的workbench无法连接
    在ubuntu20.04上使用Navicat客户端
    如何提升git clone的速度
    jenkins出现故障,报错HTTP ERROR 403 No valid crumb was included in the request
  • 原文地址:https://www.cnblogs.com/ALittleBee/p/9737636.html
Copyright © 2020-2023  润新知