真有人这么编写LED控制程序吗?

qq_38639975 2022-08-03 22:59:21

两个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;
}


 

...全文
38 1 打赏 收藏 举报
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 6天前

了解一下”有限状态自动机“

  • 打赏
  • 举报
回复
发帖
C语言

6.6w+

社区成员

C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
帖子事件
创建了帖子
2022-08-03 22:59
社区公告
暂无公告