cc2530强化实训03定时器间隔定时实现按键长按与短按(代码片段)

alittlebee alittlebee     2023-01-04     766

关键词:

【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 

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

技术分享图片

技术分享图片

cc2530强化实训02普通延时函数实现按键的长按与短按(代码片段)

...击与双击的功能已经是很多嵌入式产品的常用手法。使用定时器的间隔定时来计算按键按下的时间是通用的做法,然而,使用普通的延时函数实现按键单击与双击的区分也是一个快速的处理手段。按键SW1单击的时候,切换D3灯的... 查看详情

cc2530定时器(代码片段)

...p; 定时/计数器的最基本工作原理是进行计数。不管是定时器还是计数器,本质上都是计数器,可以进行加1(减1)计数,每出现一个计数信号,计数器就会自动加1(自动减1),当计数值从0变成最大值(或从最大值变成0)溢... 查看详情

cc2530定时器使用

??定时器学习 文件夹说明...1协议栈函数使用...2设置初始化定时器...2回调函数(中断服务函数)3启动定时器...3停止定时器...4寄存器操作...4查询方式...4中断方式(使用定时器3)7 说明    依据数据手冊可知CC2530... 查看详情

cc2530定时器的应用(代码片段)

【例1】利用定时器计数实现5中彩灯的变化形式,基于模模式的。两个标志位,一个是定时器计数,一个是彩灯的状态。1#include"ioCC2530.h"23#defineD3P1_04#defineD4P1_15#defineD5P1_36#defineD6P1_478unsignedcharcount=0;//长定时累计变量9unsignedcharled_st... 查看详情

cc2530t3定时器控制引脚p1_1的亮灭

/*****************************************************************************文件名:main.c*作者:Andy*修订:2013-01-08*版本:1.0*描述:操作IO口控制3盏LED灯的全亮和全灭、闪烁、流水灯***************************************************** 查看详情

qt按键长按功能的实现问题

...时间,如何实现,我看到是说用press,,按了pueshbutton后定时器开始工作,在判断时间,具体是怎么的,求代码我一般都是自己新建一个按钮类继承自QPushButton然后重写pressEvent和releaseEvent在pressEvent中启动定时器releaseEvent中判断是... 查看详情

cc2530入门教程-增强版基础技能综合实训案例(基础版)-上位机源码

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-上位机源码广东职业技术学院 欧浩源一、需求分析    按照指定参数打开串口,与测控终端建立数据传输通道,并根据应用要求实现程序逻辑,具体... 查看详情

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

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-终端源码广东职业技术学院欧浩源 一、关于硬件电路    关于这个综合实训案例,具体需求详见《【CC2530入门教程-增强版】基础技能综合实训案例(... 查看详情

cc2530芯片定时器1的输出比较模式怎么用?

定时器1的输出比较模式怎么用。利用这个功能输出一个1KHZ,占空比为10%的程序怎么写啊?求高人指点qiayouni来为你解答//byqiujietech.inc.#include<ioCC2530.h>#defineuintunsignedint#defineucharunsignedchar#defineRLEDP1_0 //定义LED1为P10口控制#defineYL... 查看详情

定时器之基于模模式的间隔定时(代码片段)

...;=~0x1b;//00011011->11100100关闭所有灯181920/*=====================定时器1初始化函数======================*/21voidInit_Timer1()2223T1CC0L=0xd4;//16MHz时钟128分频定时100ms24T1CC0H=0x30;//设先填低8位,再填高8位最大定时周期定时0.1s25T1CCTL0|=0x04;//开启通道0... 查看详情

cc2530入门教程-增强版基础技能综合实训案例(基础版)-题目需求

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-题目需求广东职业技术学院 欧浩源一、引用  不管是简单的单片机应用,还是复杂的嵌入式系统,在我看来它们的本质结构是差不多的,都离不开“内核+外... 查看详情

51单片机(cc2530)发送按键次数到串口助手显示实现功能:按1次按键串口助手显示1再按一次显示2以此

/*****************************************************************************描述:设置串口调试助手波特率:115200bps8N1*会收到CC2530发过来的按键次数****************************************************************************/#include<ioCC2530.h>#include<string.h>... 查看详情

单片机按键长短按得识别原理(代码片段)

stm32f103按键长短按得识别原理需要一个定时器,用来计算按键按下的时间,可以一秒钟检测100次,设置初始化为10ms的中断,比如使用定时4作为按键时间计算的定时器比如我们需要4种模式,轻触,短按,长按,超级长按 #defineclickTypeTouch1... 查看详情

stm32能通过按键中断实现连续按键吗

...间隔是否符合连续按键的要求罢了。但至少你还得开一个定时器或滴答时钟,用于间隔时间的判断。另外要是你的主循环速度快,也没必要使用外部中断,循环查询状态即可。要求高一点的才会使用外部中断 查看详情

cc2530学习路线-基础实验-gpio按键控制led灯亮灭(代码片段)

目录1.前期预备知识1.1新大陆Zigbee模块按键电路图1.2CC2530相关寄存器1.3CC2530中断走向图1.4使用C语言为51单片机编写中断程序1.5*函数指针2.程序代码THEEND1.前期预备知识1.1新大陆Zigbee模块按键电路图由上图可知,Zigbee模块的SW1按钮... 查看详情

cc2530入门教程-03cc2530的中断系统及外部中断应用

第3课 CC2530的中断系统及外部中断应用广东职业技术学院 欧浩源一、中断相关的基础概念     内核与外设之间的主要交互方式有两种:轮询和中断。 轮询的方式貌似公平,但实际工作效率很低,且... 查看详情

1cc2530单片机介绍

...器RAM、只读存储器ROM、输入输出I/O接口、中断控制系统、定时/计数器和通信等多种功能部件。本教程使用的单片机德州仪器生产的CC2530,其针脚分布如下:                  P0、P1各8个针脚(1字节=8位,针... 查看详情

cc2530的外部中断(代码片段)

...下降。中断相关的几个概念中断源发生中断的外设,例如定时器事件到了,那么中断源就是定时器。全局中断开关或总中断系统中有很多中断开关,如果需要一次性关闭所有的中断,那么就需要用全局中断才行,也就是一个总中... 查看详情