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

[复制链接]
 楼主| 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变量进行判断,大于某个阈值属于长按,否则是短按。

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

  2. #define D3 P1_0
  3. #define D4 P1_1
  4. #define K1 P1_2
  5. #define TT 20
  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.       count = 0;      //延时技术变量清0
  26.       while(K1 == 0)  //按键按下状态
  27.       {
  28.         Delay(10000);
  29.         count++;      //计算按键按下的时间
  30.       }
  31.       if(count < TT)  //短按
  32.       {
  33.         D3 = ~D3;
  34.       }
  35.       else            //长按
  36.       {
  37.         D4 = ~D4;
  38.       }
  39.     }
  40.   }
  41. }

  42. void main()
  43. {
  44.   Init_Port();      //初始化端口
  45.   D3 = 1;
  46.   D4 = 1;
  47.   Delay(50000);
  48.   D3 = 0;
  49.   D4 = 0;
  50.   while(1)
  51.   {
  52.     Scan_Keys();    //扫描按键
  53.   }
  54. }
广东职业技术学院  欧浩源 <小蜜蜂老师>


本帖子中包含更多资源

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

×

评论

感谢分享  发表于 2018-9-11 23:06
quickman 发表于 2018-9-18 21:54 | 显示全部楼层
                        
backlugin 发表于 2018-9-18 21:55 | 显示全部楼层
使用定时器是不是更精确呢
backlugin 发表于 2018-9-18 21:55 | 显示全部楼层
很多都是自带的延时函数。
dzfansman 发表于 2018-9-18 21:55 | 显示全部楼层
谢谢分享的。
 楼主| ohy3686 发表于 2018-9-19 09:21 | 显示全部楼层
backlugin 发表于 2018-9-18 21:55
使用定时器是不是更精确呢

正常的做法是应该用定时器,不但精确而且容易处理。帖子中的做法只是对于初学者或者不熟悉定时器使用的人来说,是个不错的选择。
dirtwillfly 发表于 2018-9-19 10:16 | 显示全部楼层
backlugin 发表于 2018-9-18 21:55
使用定时器是不是更精确呢

在demo程序中,用延时函数能简化程序,让初学者更容易理解
uptown 发表于 2019-1-8 21:51 | 显示全部楼层
学习一下无线通信。           
uptown 发表于 2019-1-8 21:51 | 显示全部楼层
感谢楼主分享的资料。                  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

322

主题

899

帖子

3548

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

322

主题

899

帖子

3548

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