编程笔记|【CC2530强化实训04】定时器间隔定时实现按键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秒,生命周期结束的时候才确定按键的最终状态。如果在按键的生命周期内有新的按键按下,将会重新计算生命周期,这时候就是双击。在双击的生命周期中,又有新的按键按下,则生命周期会重新计算,这时候就是三连击。在整个生命周期中如果没有新的按键按下,那么最终的按键状态就是三连击。如此类推。
文章图片
【实现代码】
#include "ioCC2530.h"#define D3P1_0
#define D4P1_1
#define D5P1_3
#define D6P1_4
#define SW1 P1_2
#define SW2 P0_1unsigned char count_t = 0;
unsigned char K_Num = 0;
/*=======================简单的延时函数========================*/
void Delay(unsigned int t)
{
while(t--);
}/*======================端口初始化函数========================*/
void Init_Port()
{
P1SEL &= ~0x1b;
//P1_0、P1_1、P1_3和P1_4作为通用I/O端口
P1DIR |= 0x1b;
//P1_0、P1_1、P1_3和P1_4端口输出P1SEL &= ~0x04;
//P1_2作为通用I/O端口
P1DIR &= ~0x04;
//P1_2端口输入
P1INP &= ~0x04;
//P1_2设置为上拉/下拉模式
P2INP &= ~0x40;
//P1_2设置为上拉
}/*=======================定时器1初始化========================*/
void Init_Timer1()
{
T1CC0L = 0xd4;
T1CC0H = 0x30;
//16MHz时钟,128分频,定时0.1秒
T1CCTL0 |= 0x04;
//开启通道0的输出比较模式
T1IE = 1;
EA = 1;
T1CTL = 0x0e;
//分频系数是128,模模式
}/*====================定时器1服务函数========================*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_int()
{
T1STAT &= ~0x20;
//清除定时器1的溢出中断标志位
if(K_Num != 0 && SW1 != 0)
{
count_t++;
//定时器1溢出一次加1,溢出周期为0.1S
}
}/*====================按键扫描处理函数========================*/
void Scan_Keys()
{
if(SW1 == 0)
{
Delay(100);
//去抖动处理
if(SW1 == 0)
{
while(SW1 == 0);
//等待按键松开
count_t = 0;
//每次有按键按下,计时重新开始
K_Num++;
//改变按键状态
if(K_Num > 4)//四连击以上均判为四连击
{
K_Num = 4;
}
}
}
if(count_t > 5)//按键间隔时间到
{
switch(K_Num)
{
case 1://按键单击
D5 = ~D5;
break;
case 2://按键双击
D6 = ~D6;
break;
case 3://按键三连击
D3 = ~D3;
break;
case 4://按键四连击
D4 = ~D4;
break;
}
K_Num = 0;
//每处理完一次按键,状态清零
count_t = 0;
//计时清零
}
}/*=========================主函数=============================*/
void main()
{
Init_Port();
Init_Timer1();
D3 = 0;
D4 = 0;
D5 = 0;
D6 = 0;
while(1)
{
Scan_Keys();
}
}
【广东职业技术学院欧浩源 <小蜜蜂老师>ohy3683@qq.com】
文章图片
【编程笔记|【CC2530强化实训04】定时器间隔定时实现按键N连击】
文章图片
推荐阅读
- 宽容谁
- 我要做大厨
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘