CC2530开发-----按键控制流水灯暂停

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();    
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值