70,024
社区成员




两个LED灯,一个NRF2401无线模块,接收到不同信息时闪烁状态不同;
这哥们用了一个操作系统,用了4个进程 LED100ms 、LEDdouble100ms 、LED200ms。调用时间如下
我是看不到这些cnt、flag是干嘛用的,请高手评价一下这个LED控制程序
void Led100Ms(void) //LED灯闪烁100毫秒执行一次
{
static u8 cnt=0,ledflag=0;
cnt++;
if(cnt>=10)
{
if(ledflag)
{
GPIOA->BSRR = GPIO_Pin_14; //黄灯亮蓝灯灭
GPIOA->BRR = GPIO_Pin_15;
ledflag=0;
}
else
{
GPIOA->BRR = GPIO_Pin_14;
GPIOA->BSRR = GPIO_Pin_15;
ledflag++;
}
cnt=0;
}
}
void Led200Ms(void) //遥控器数据进来指示函数
{
static u8 cnt=0;
cnt++;
if(cnt>=5)
{
cnt=0;
GPIOA->ODR^=GPIO_Pin_15;
}
}
void LedDouble100Ms(void) //双闪函数
{
static u8 cnt1=0,cnt2=0,ledflag=0;
cnt1++;
if(cnt1==0||cnt1==LedSpeed||cnt1==2*LedSpeed||cnt1==3*LedSpeed||cnt1==4*LedSpeed)
{
cnt2++;
if(ledflag)
{
// GPIOA->BRR = GPIO_Pin_14;
GPIOA->BRR = GPIO_Pin_15;
ledflag=0;
}
else
{
// GPIOA->BSRR = GPIO_Pin_14;
GPIOA->BSRR = GPIO_Pin_15;
ledflag=1;
}
}
if(cnt2==4&&cnt1==LedSpeedL*LedSpeed)
{
cnt1=0;
cnt2=0;
}
}
void LedSetFre(u16 ledfre) //设置LED运行频率
{
SetTaskFre(CTaskLisst,0,ledfre);
LedSetDouble(0); //关闭双闪
}
void LedSetDouble(u8 ledflag) //Flag为1启动双闪,禁用普通模式,为0启动普通模式,警用双闪
{
if(ledflag)
{
SetTaskSta(CTaskLisst,0,0);
if(!CheakTaskRun(CTaskLisst,5)) //当任务5没有运行时才能启用双闪
SetTaskSta(CTaskLisst,4,1);
}
if(ledflag==0)
{
SetTaskSta(CTaskLisst,0,1); //启用任务0
SetTaskSta(CTaskLisst,5,0); //关闭任务4和5
SetTaskSta(CTaskLisst,4,0);
}
}
void LedSetNor(u8 flag) //一切正常指示灯函数
{
if(flag)
{
if(CheakTaskRun(CTaskLisst,0)) //检查任务1是否运行,在运行时禁用任务4和5?否者禁用任务4启用任务5
{
SetTaskSta(CTaskLisst,4,0);
SetTaskSta(CTaskLisst,5,0);
}
else
{
SetTaskSta(CTaskLisst,4,0);
SetTaskSta(CTaskLisst,5,1);
}
}
else
{
if(CheakTaskRun(CTaskLisst,0)) //还原双闪,在任务0没有运行的情况下
{
SetTaskSta(CTaskLisst,4,0);
SetTaskSta(CTaskLisst,5,0);
}
else
{
SetTaskSta(CTaskLisst,4,1);
SetTaskSta(CTaskLisst,5,0);
}
}
}
void LedSet(void)
{
GPIOA->BSRR = GPIO_Pin_14; //黄灯亮蓝灯灭
GPIOA->BRR = GPIO_Pin_15;
}
了解一下”有限状态自动机“