现在很多嵌入式产品的按键不再是仅仅单一的一种功能,而是通过按键按下的时间去实现不同的功能。
/结合之前三个实验中所涉及到的LED、按键、定时器来实现按键的短按和长按对不同LED的控制。/
实验最后:
给小伙伴们补一下上节课被遗忘的关于定时/计数器T3的配置代码~~~
*按键SW1短按,切换LED1灯的亮灭状态;
*按键SW1长按,切换LED2灯的亮灭状态。
话不多说,直接上代码~~~
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0 //P1.0口控制LED1
#define LED2 P1_1 //P1.口控制LED2
#define SW1 P0_5 //P0.5口控制SW1
uchar SW1_count = 0; //定时计数
uchar SW1_flag = 0; //按键按下标志位
void Init_Led(); //声明初始化LED函数
void Init_Key(); //声明初始化按键函数
void Scan_Key(); //声明按键检测函数
void Init_Timer1(); //声明定时器T1初始化函数
void Delay(uint ms); //声明延时函数
/*===================主程序入口====================*/
void main()
{
Init_Led(); //初始化LED灯
Init_Key(); //初始化按键
while(1)
{
Scan_Key(); //一直检测按键
}
}
/*==================中断响应服务子程序===============*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_int()
{
T1STAT &= ~0x20; //清除定时器1的溢出中断标志位
if(SW1_flag != 0) //是否按键按下
{
SW1_count++; //定时计数值累加
}
}
/*================声明函数的具体实现================*/
void Init_Led()
{
P1SEL &=~ 0x03; //配置P1.0 P1.1为通用I/O口
P1DIR |= 0x03; //配置P1.0 P1.1为输出
LED1 = 0; //初始LED1为熄灭
LED2 = 0; //初始LED2为熄灭
}
void Init_Key()
{
P0SEL &= ~0x20; //P0.5设为普通输出口
P0DIR &= ~0x20; //按键在P05设为输入
P0INP |= 0x20; //P0.5为三态
}
void Init_Timer1()
{
T1CTL = 0X0E; //128分频,模模式
T1CC0L = 0XD4; //定时初值低8位
T1CC0H = 0X30; //定时初值高8位 定时:0.1s
T1CCTL0 |= 0X04; //开启通道0的输出比较模式
T1IE = 1; //开启定时器1中断
T1OVFIM = 1; //开启定时器1溢出中断
EA = 1; //开启总中断
}
void Scan_Key()
{
if(SW1 == 0)
{
Delay(100); //去抖动处理
while(SW1 == 0) //当是按键按下时
{
SW1_flag = 1; //按键按下标志位置1,表示按键按下
Init_Timer1(); //初始化定时器T1,开始定时
while(SW1 == 0); //等待按键松开
SW1_flag = 0; //按下标志位清0,表示按键已经松开
if(SW1_count > 5) //通过SW1_count判断按键长按
{
LED2 = ~LED2;
}
else //通过SW1_count判断按键短按
{
LED1 = ~LED1;
}
SW1_count = 0; //按键计数值清零
}
}
}
void Delay(uint ms)
{
uint i,j;
for(i=0; i<ms; i++)
for(j=0; j<535;j++);
}
定时/计数器T3:是一个8位的定时器,学过51的小伙伴就开心了,8位的想必都快配置吐了吧~
void Init_Timer3()
{
T3CTL = 0x06; //模模式,溢出中断禁止,清除计数器
T3CTL = 0X80; //时钟16分频
T3CTL &= ~0X03; //自动重装00~FF
T3CTL |= 0X08; //开T3中断
T3CCTL0 = 0X00; //通道0初值
T3CC0 = 0XF0; //定时器计数字节
EA = 1; //开总中断
T3IE = 1; //开T3中断
T3CTL = 0X10; //启动定时器T3
}
/*==================中断响应服务子程序===============*/
#pragma vector = T3_VECTOR
__interrupt void Timer3_int()
{
;//这里添加你自己想搞的事情~
}
我会每天更新一篇ZigBee入门-CC2530-的基础实验,让大家学习Zigbee技术不在是从入门到“入土”,而是从入门到巅峰~!!!
欢迎大家的留言和评论我会在看到的第一时间内答复。
看完后感觉得到帮助的小伙伴,要点点赞哦~
给笔者一些动力嘛!谢谢啦 ^ _ ^ ~