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

【CC2530强化实训03】定时器间隔定时实现按键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
  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 #define SW2 P0_1
  9
 10 unsigned char count_t = 0;
 11 unsigned char K_Num = 0;
 12
 13 /*=======================简单的延时函数========================*/
 14 void Delay(unsigned int t)
 15 {
 16   while(t--);
 17 }
 18
 19 /*======================端口初始化函数========================*/
 20 void Init_Port()
 21 {
 22   P1SEL &= ~0x1b;     //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
 23   P1DIR |= 0x1b;      //P1_0、P1_1、P1_3和P1_4端口输出
 24
 25   P1SEL &= ~0x04;     //P1_2作为通用I/O端口
 26   P1DIR &= ~0x04;     //P1_2端口输入
 27   P1INP &= ~0x04;     //P1_2设置为上拉/下拉模式
 28   P2INP &= ~0x40;     //P1_2设置为上拉
 29 }
 30
 31 /*=======================定时器1初始化========================*/
 32 void Init_Timer1()
 33 {
 34   T1CC0L = 0xd4;
 35   T1CC0H = 0x30;        //16MHz时钟,128分频,定时0.1秒
 36   T1CCTL0 |= 0x04;      //开启通道0的输出比较模式
 37   T1IE = 1;
 38   EA = 1;
 39   T1CTL = 0x0e;         //分频系数是128,模模式
 40 }
 41
 42 /*====================定时器1服务函数========================*/
 43 #pragma vector = T1_VECTOR
 44 __interrupt void Timer1_int()
 45 {
 46   T1STAT &= ~0x20;    //清除定时器1的溢出中断标志位
 47   if(K_Num != 0 && SW1 != 0)  //按键不松开不计算生命周期
 48   {
 49     count_t++;        //定时器1溢出一次加1,溢出周期为0.1S
 50   }
 51 }
 52
 53 /*====================按键扫描处理函数========================*/
 54 void Scan_Keys()
 55 {
 56   if(SW1 == 0)
 57   {
 58     Delay(100);         //去抖动处理
 59     if(SW1 == 0)
 60     {
 61       while(SW1 == 0);  //等待按键松开
 62       count_t = 0;      //重新开始计算按键的生命周期
 63       K_Num++;          //改变按键状态
 64       if(K_Num > 4)     //四连击以上均判为四连击
 65       {
 66         K_Num = 4;
 67       }
 68     }
 69   }
 70   if(count_t > 5)       //按键生命周期结束
 71   {
 72     switch(K_Num)
 73     {
 74       case 1:           //按键单击
 75         D5 = ~D5;
 76       break;
 77       case 2:           //按键双击
 78         D6 = ~D6;
 79       break;
 80       case 3:           //按键三连击
 81         D3 = ~D3;
 82       break;
 83       case 4:           //按键四连击
 84         D4 = ~D4;
 85       break;
 86     }
 87     K_Num = 0;     //每处理完一次按键,状态清零
 88     count_t = 0;   //计时清零
 89   }
 90 }
 91
 92 /*=========================主函数=============================*/
 93 void main()
 94 {
 95   Init_Port();
 96   Init_Timer1();
 97   D3 = 0;
 98   D4 = 0;
 99   D5 = 0;
100   D6 = 0;
101   while(1)
102   {
103     Scan_Keys();
104   }
105 }

【广东职业技术学院  欧浩源 <小蜜蜂老师>  [email protected]】

原文地址:https://www.cnblogs.com/ALittleBee/p/9733944.html

时间: 2024-07-29 13:58:53

【CC2530强化实训03】定时器间隔定时实现按键N连击的相关文章

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

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

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-终端源码

[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-终端源码 广东职业技术学院 欧浩源 一.关于硬件电路 关于这个综合实训案例,具体需求详见<[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-题目需求>. 我自己实在"全国职业院校技能大赛--物联网技术应用赛项"的Zigbee模块上实现的.该模块的电路应该和TI公司官方评估板的推荐电路差不多,我想现在市面上很多开发板也是参考这样的电路设计,只要您使用的开发板上有LED灯.按键输入.串口输出和一路A/

CentOS mdadm RAID1实训

场景 POC环境 CentOS 7 MDADM Raid1 查看版本 #uname -a Linuxzzsrv1.bigcloud.local 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014x86_64 x86_64 x86_64 GNU/Linux #cat /etc/redhat-release CentOSLinux release 7.0.1406 (Core) 挂载硬盘 yum 安装mdadm的支持包 #yum -y

可编程控制器实训

打开GX,新建工程,参数默认. 用 -||- -|/|- -()- — | 从电气控制实训的图转可编程的 例子: SB对应输入继电器    -||-       -|/|-   X0~X7,  X0~X17,X20~X7(注释:大小写会自动变换,序号会自动填充为X000,X007…) KM对应输出继电器    -||-       -|/|-     -()-    Y0~Y7,Y10~Y7(注释:大小写会自动变换,序号会自动填充为Y000,Y007…) KT对应定时器     -||- 长开和

Android基础知识【项目实训】【1】

[该项目实训是Android基础知识的一个综合练习] [项目题目]:校园订餐App设计 综合案例 [设计目标] 1.必要功能 ?快餐店浏览,与订餐 ?今天订餐活动查询与订餐,特价饭菜预定 ?分类订餐查询,预定 ?常定饭菜  预定 ?健康餐推荐 ?定时预定,提前预定 ?订单查看, ?餐馆与饭菜打分,评价 ?用户注册与登录 2.扩展选择功能 ?快速拨打电话 ?饮食跟踪,热量估算 ?系统设置 [项目说明] 该项目为实际应用项目的单机 简化版本,只需要完成Android平台App的设计与开发工作. Ap

[嵌入式高薪就业课程]嵌入式系统就业实训班

为培养适应企业需要.基础扎实.知识面宽.技能强.富有创新精神的嵌入式开发工程师, 通过本课程的系统学习,可以使学员由浅入深地对嵌入式ARM+Linux系统全面学习,能够独立胜任嵌入式底层开发.应用开发.系统开发.驱动开发等多方面工作,注重两大能力和敬业团队精神培养.  全面模拟IT公司的嵌入式软硬件开发.管理.组织.实施过程来强化个人能力和技术能力主要包括:工程实践能力团队协作能力 技术创新能力专业能力,编程能力 软硬件平台应用能力 项目开发能力 解决关键技术问题能力. 适合对象:理工科类专科(

2016年秋季软件工程专业实训分组及选题情况

实训意义 综合实训旨在为学生提供参与完整软件开发过程的实践经历,并对所涉及的应用领域进行初步了解,培养面向领域的工程能力.项目来源主要是学校或相关合作企业在校内设立专门的学生研究开发项目,可以聘请企业专家组织和指导学生模拟企业环境进行项目开发,给学生带来真实的企业研发的环境和流程.     实训目标 (1)训练学生软件开发流程和规范:体会企业开发流程:熟悉常用开发工具.模板和表格的使用: (2)体会企业中的团队合作规范:培养团队开发和协同工作的能力:熟悉团队成员在软件开发项目中的角色分工及沟通协

Python写的一个优美的定时器,定时精度可调

# -* coding: utf-8 -*- import sys import os import getopt import threading import time def Usage(): usage_str = '''说明: \t定时器 \timer.py -h 显示本帮助信息,也可以使用--help选项 \timer.py -d num 指定一个延时时间(以毫秒为单位) \t 也可以使用--duration=num选项 ''' print(usage_str) def args_p

Android电子书项目实训【项目说明】【1】

概述: 本实训项目是本科教学中,Android课程实训的项目,旨在训练Android App访问服务器,获取服务器数据,解析,并呈现的流程.主要包含的功能有: 1.用户注册 2.登录 3.查看文档 4.下载电子书 5.阅读电子书 6.用户管理 设计说明: 该实训项目需要开发Android客户端和服务器端应用. 服务器端采用Struts2,直接使用JDBC访问MySQL数据库. 客户端使用xutils框架,访问action,获取JSON字符串. 开发环境: 服务器端采用MyEclipse,版本可以