本帖最后由 流年丶 于 2019-7-7 20:52 编辑
游客,如果您要查看本帖隐藏内容请
回复
用了几年的前后台程序框架,稳定可靠,保证每次执行的任务都为最高优先级任务,楼下会对该程序框架做一些说明。
按键状态机:支持短按,长按,双击处理,程序简洁,简单易懂。
LED状态机:支持各个频率的LED闪烁,常亮,常暗操作。
注:该程序是从 基于2G通讯项目中截取下来的两个模块,项目源码不好分享,有兴趣可以加我Q
:842936992。
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//引用请注明出处,有问题可在本帖中提出讨论,也可加我Q一起交流探讨。
Function name : APP_LED_Task
Description: APP LED模块的任务函数,在HCI_Task中当HCI_LED事件被置位的时候,将被执行
Input: NONE
Return: NONE
Notes:
******************************************************************************/
void APP_LED_Task(void)
{
U8 HWOpMode;
U8 ucIndex;
for(ucIndex = 0; ucIndex < LED_MAX; ucIndex++)
{
HWOpMode = LED_OFF;
if(APP_LED_FLASH == s_AppLedTB[ucIndex].OpMode)
{
if(s_AppLedTB[ucIndex].usDelayCnt >= TASK_HCI_LED_TB)
{
s_AppLedTB[ucIndex].usDelayCnt -= TASK_HCI_LED_TB;
}
else
{
s_AppLedTB[ucIndex].usDelayCnt = 0;
}
if(s_AppLedTB[ucIndex].usDelayCnt > 0)
{
continue;
}
HWOpMode = ((LED_ON == s_AppLedTB[ucIndex].HWState) ? (LED_OFF) : (LED_ON));
s_AppLedTB[ucIndex].usDelayCnt = s_AppLedTB[ucIndex].usPeriod;
if(255 == s_AppLedTB[ucIndex].ucTime)
{
continue;
}
if(--s_AppLedTB[ucIndex].ucTime == 0)
{
s_AppLedTB[ucIndex].OpMode = APP_LED_OFF;
}
}
else
{
if(s_AppLedTB[ucIndex].ulTimeCnt >= TASK_HCI_LED_TB)
{
s_AppLedTB[ucIndex].ulTimeCnt -= TASK_HCI_LED_TB;
}
else
{
s_AppLedTB[ucIndex].ulTimeCnt = 0;
}
if((s_AppLedTB[ucIndex].ulTimeCnt > 0) || (~0 == s_AppLedTB[ucIndex].ulTimeOut))
{
continue;
}
HWOpMode = LED_OFF;
}
if(HWOpMode == s_AppLedTB[ucIndex].HWState)
{
continue;
}
BSP_LED_Operate(ucIndex, HWOpMode);
s_AppLedTB[ucIndex].HWState = HWOpMode;
}
}
一周热门 更多>