按键控制跑马灯的暂停与运行
ZigBee按键控制跑马灯的运行与暂停
#ZigBee按键控制流水的灯的运行与暂停
#ZigBee按键控制LED灯的运行与暂停
#CC2530按键控制跑马灯的运行与暂停
#CC2530按键控制流水的灯的运行与暂停
#CC2530按键控制LED灯的运行与暂停
最近刚好在复习这块的知识与内容,所以与大家分享一下。记得当时老师上课讲的时候自己也没怎么听懂,这会儿再看看也就当作是再学习一遍了。
下面进入今天的正题:
一、按要求完成以下功能:
1、程序开始时,4个灯全亮一会,
然后全灭,再开始进入跑马灯
2、跑马灯过程为D4亮,其余灭,延时;
D3亮,其余灭,延时;
D6亮,其余灭,延时;
D5亮,其余灭,延时;
3、s1按下松开后,跑马灯暂停保留当前状态,
再次按下松开后,从当前状态处继续运行跑马灯
(s1按下时,不能打断跑马灯的运行)
二、部分效果图:

三、代码如下:
#include "iocc2530.h"
#define D3 P1_0 //LED3
#define D4 P1_1 //LED4
#define D5 P1_3 //LED5
#define D6 P1_4 //LED6
#define s1 P1_2 //按键s1unsigned int count=0; //时间片计数变量
unsigned char f_LED=0; //0关、1开//端口初始化函数
void Init_Port()
{//LED灯端口配置P1SEL &=~0x1b; //功能设置:0通用、1外设P1DIR |= 0x1b; //方向设置:0输入、1输出P1 &=~0x1b; //熄灭4个LED灯//s1按键端口配置P1SEL &=~0x04; //功能设置:0通用、1外设P1DIR &=~0x04; //方向设置:0输入、1输出P1INP &=~0x04; //初步设置为上拉或下拉模式P2INP &=~0x40; //最终设置为上拉模式
}//毫秒级延时函数
void delay(unsigned int t)
{unsigned int x,y;for(x=t; x>0; x--)for(y=114; y>0; y--);
}//LED检测函数
void LED_Check()
{P1 |= 0x1b;delay(3000); //4个灯全亮,延时P1 &=~0x1b;delay(3000); //4个灯全灭,延时
}//跑马灯函数
void LED_Running()
{
/* (1)要想使跑马灯暂停下来,然后再从当前的状态继续运行,那么就要用时间片的思想来完成,就是在每小段时间中不断的扫描s1按键是否按下,如果s1被按下就停留在这,然后一直点亮在这个小段时间内被点亮的LED灯,这样就实现了暂停的功能;(2)而要想继续运行跑马灯程序,则需当每次s1按键被按下时都翻转s1标志位的状态。(注:时间片的概念:将一段时间拆分成N个小段的时间,不改变其本身时间数值)
*/delay(10); //每次进跑马灯函数时,先延时10毫秒if(f_LED==1) //判断f_LED标志位是否为1(即是否是打开的状态){ count++; //为1则开始计数}if(count<=100) //在0~1000(10 x 100)这个小段的时间中,D4=1,D3=0,D6=0,D5=0;//点亮D4灯,其余熄灭else if(count<=200) //在1000~2000((10 x 200)-1000)这个小段时间中,D4=0,D3=1,D6=0,D5=0;//点亮D3灯,其余熄灭else if(count<=300) //在2000~3000((10 x 300)-1000-1000)这个小段时间中,D4=0,D3=0,D6=1,D5=0;//点亮D6灯,其余熄灭else if(count<=400) //在3000~4000((10 x 400)-1000-1000-1000)这个小段时间中, D4=0,D3=0,D6=0,D5=1;//点亮D5灯,其余熄灭 else //当count计数变量大于4000时,count=0; //count清零以便下次计数
}//按键扫描函数
void Scan_Key()
{if(s1==0) //如果s1检测到低电平,则认为s1按下{delay(100); //按键消抖{if(s1==0) //再次判断,确认是否是s1被按下{while(s1==0) //按键按下时{LED_Running(); //按键按下松开前,继续运行跑马灯程序}
//--- 切换f_LED状态的方法一 ---//
// if(f_LED==0) //如果s1按下且f_LED标志位为0(关),则将标志位置1
// f_LED=1;
// else if(f_LED==1) //如果s1按下且f_LED标志位为1(开),则将标志位置0
// f_LED=0;//--- 切换f_LED状态的方法二 ---// f_LED=~f_LED; //切换f_LED标志位的状态(即翻转开关的状态,//就像是单联开关,非关即开的状态)}}}
}//主函数
void main()
{Init_Port(); //端口初始化函数LED_Check(); //LED检测函数f_LED=1; //开while(1){LED_Running(); //跑马灯函数Scan_Key(); //按键扫描函数}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
