CC2530开发—按键控制流水灯
今天所要实现的效果如下
一、导入CC2530的包以及定义按键和LED的位置
#include "iocc2530.h"
#define D3 P1_0
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4
#define SW1 P1_2
注:每个开发板当中的LED和按键的位置都不相同,请以自己开发所使用到的开发板为准
二、定义全局变量
unsigned int count=0; //时间片计数
unsigned char switch_LED=0; //控制流水灯开关标志
unsigned int flag=0; //led检测标识
三、对按键和LED进行配置
void Init_Port()
{
//LED配置
P1SEL &=~0x1b; //将P1_0,P1_1,P1_3,P1_4设置为通用I/O端口
P1DIR |= 0x1b; //将P1_0,P1_1,P1_3,P1_4设置为输出方向
P1 &=~0x1b; //P1端口设置为低电平
flag=1;
//按键配置
P1SEL &=~0x04; //将P1_2设置为通用I/O端口
P1DIR &=~0x04; //将P1_2设置为输入方向
P1INP &=~0x04; //将P1_2设置为上拉/下拉
P2INP &=~0x40; //将P1_2设置为上拉
}
四、延时函数
void delay(unsigned int xms)
{
while(xms--)for(unsigned int i=0;i<533;i++);
}
五、流水灯函数
void LED_Running()
{
delay(10);
if(switch_LED==1) //当开关标志为1时
{
count++; //时间片开始计数
}
if(count<=50) //当累加到50的时候 D4亮 其余灭
D4=1,D3=0,D6=0,D5=0;
else if(count<=100) //当累加到100时侯 D3亮 其余灭
D4=0,D3=1,D6=0,D5=0;
else if(count<=150) //当累加到150的时候 D6亮其余灭
D4=0,D3=0,D6=1,D5=0;
else if(count<=200) //当累加到200的时候 D5亮 其余灭
D4=0,D3=0,D6=0,D5=1;
else
count=0; //时间片清零 便于下次计数
}
注:要实现流水灯的按键控制流水灯的开始与停止,便用时间片的思想来解决这个问题,不断对按键SW1进行实时扫描当在其中个灯亮的时间片内按下被按下时便让唯独让当前时间片中LED灯常亮,这样就实现了流水灯的暂停效果。
补:时间片的概念:CPU分配给每个程序的时间,每个程序都会有一个自己的时间段,而在时间段就是所谓的时间片
六、按键扫描函数
void Scan_Keys()
{
if(SW1==0) //当按键1被按下
{
delay(100);
if(SW1==0)
{
while(SW1==0)
{
LED_Running(); //执行流水灯函数
}
switch_LED=~switch_LED; //开关翻转 如果为0的时候再次按下为1也就是开启 如果为1再次按下也就是关闭
}
}
}
七、main函数
void main()
{
Init_Port();
if(flag==1) //当flag==1时 一开始全亮然后全灭执行流水灯
{
P1 |= 0x1b;
delay(500);
P1 &=~0x1b;
delay(500);
flag=0;
}
switch_LED=1; //默认为1也就是开
while(1)
{
LED_Running();
Scan_Keys();
}
}
八、全部代码
#include "iocc2530.h"
#define D3 P1_0
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4
#define SW1 P1_2
unsigned int count=0;
unsigned char switch_LED=0; //控制流水灯开关标志
unsigned int flag=0;
void Init_Port()
{
//LED配置
P1SEL &=~0x1b;
P1DIR |= 0x1b;
P1 &=~0x1b;
flag=1;
//按键配置
P1SEL &=~0x04;
P1DIR &=~0x04;
P1INP &=~0x04;
P2INP &=~0x40;
}
void delay(unsigned int xms)
{
while(xms--)for(unsigned int i=0;i<533;i++);
}
void LED_Running()
{
delay(10);
if(switch_LED==1) ///当开关标志为1时
{
count++;
}
if(count<=50)
D4=1,D3=0,D6=0,D5=0;
else if(count<=100)
D4=0,D3=1,D6=0,D5=0;
else if(count<=150)
D4=0,D3=0,D6=1,D5=0;
else if(count<=200)
D4=0,D3=0,D6=0,D5=1;
else
count=0;
}
void Scan_Keys()
{
if(SW1==0)
{
delay(100);
if(SW1==0)
{
while(SW1==0)
{
LED_Running(); //执行流水灯函数
}
switch_LED=~switch_LED; //开关翻转
}
}
}
void main()
{
Init_Port();
if(flag==1) //当flag==1时 一开始全亮然后全灭执行流水灯
{
P1 |= 0x1b;
delay(500);
P1 &=~0x1b;
delay(500);
flag=0;
}
switch_LED=1; //默认为1也就是开
while(1)
{
LED_Running();
Scan_Keys();
}
}