类似状态机检测按键的做法,但这里没有用定时器检测,状态位的切换放在main函数主循环里进行
main.c:包含main函数,主要系统逻辑,调用不同的状态函数
LED.c:包含打开运行指示灯,关闭运行指示灯,翻转运行指示灯函数
STA_Machine.c:包含不同状态的函数,函数里实现翻转运行指示灯
Sys_Init.c:系统初始化,包含GPIO初始化,运行指示灯引脚配置成推挽输出
public.c:包含延时函数,public.h文件包含数据类型的重定义
状态机用switch case 语句进行状态位的切换
/*
* @name main
* @brief 主函数
* @param void
* @retval int
*/
int main(void)
{
//系统初始化
Hardware_Init.Sys_Init();
//系统主循环
while(1)
{
//运行状态机
switch (STA_Machine.ucSTA_Machine_Status)
{
case STA1:STA_Machine.FUN_STA1(); break;
case STA2:STA_Machine.FUN_STA2(); break;
case STA3:STA_Machine.FUN_STA3(); break;
case STA4:STA_Machine.FUN_STA4(); break;
case STA5:STA_Machine.FUN_STA5(); break;
case STA6:STA_Machine.FUN_STA6(); break;
case STA7:STA_Machine.FUN_STA7(); break;
case STA8:STA_Machine.FUN_STA8(); break;
default:STA_Machine.ucSTA_Machine_Status = STA1;break;
}
}
}
状态机函数,分为8个状态,每个状态可以实现不同的功能,这里只是简单的指示灯翻转,不同状态翻转的时间不同而已
在每一个状态函数实现完功能后,将状态机的状态位变量切换到下一个状态,这样在main函数中才能根据状态位调用这里的函数
状态位一开始初始化为STA1
/* Includes ------------------------------------------------------------------*/
#include
/* Private define-------------------------------------------------------------*/
/* Private variables----------------------------------------------------------*/
static void FUN_STA1(void);
static void FUN_STA2(void);
static void FUN_STA3(void);
static void FUN_STA4(void);
static void FUN_STA5(void);
static void FUN_STA6(void);
static void FUN_STA7(void);
static void FUN_STA8(void);
/* Public variables-----------------------------------------------------------*/
STA_Machine_t STA_Machine =
{
STA1,
FUN_STA1,
FUN_STA2,
FUN_STA3,
FUN_STA4,
FUN_STA5,
FUN_STA6,
FUN_STA7,
FUN_STA8
};
/* Private function prototypes------------------------------------------------*/
/*
* @name FUN_STA1
* @brief 状态1函数
* @param None
* @retval None
*/
static void FUN_STA1()
{
LED.Run_LED_Flip();
public.Delay_ms(1000);
LED.Run_LED_Flip();
public.Delay_ms(1000);
STA_Machine.ucSTA_Machine_Status = STA2;
}
/*
* @name FUN_STA2
* @brief 状态2函数
* @param None
* @retval None
*/
static void FUN_STA2()
{
LED.Run_LED_Flip();
public.Delay_ms(100);
LED.Run_LED_Flip();
public.Delay_ms(100);
STA_Machine.ucSTA_Machine_Status = STA3;
}
/*
* @name FUN_STA3
* @brief 状态3函数
* @param None
* @retval None
*/
static void FUN_STA3()
{
LED.Run_LED_Flip();
public.Delay_ms(1000);
LED.Run_LED_Flip();
public.Delay_ms(1000);
STA_Machine.ucSTA_Machine_Status = STA4;
}
/*
* @name FUN_STA4
* @brief 状态4函数
* @param None
* @retval None
*/
static void FUN_STA4()
{
LED.Run_LED_Flip();
public.Delay_ms(100);
LED.Run_LED_Flip();
public.Delay_ms(100);
STA_Machine.ucSTA_Machine_Status = STA5;
}
/*
* @name FUN_STA5
* @brief 状态5函数
* @param None
* @retval None
*/
static void FUN_STA5()
{
LED.Run_LED_Flip();
public.Delay_ms(1000);
LED.Run_LED_Flip();
public.Delay_ms(1000);
STA_Machine.ucSTA_Machine_Status = STA6;
}
/*
* @name FUN_STA6
* @brief 状态6函数
* @param None
* @retval None
*/
static void FUN_STA6()
{
LED.Run_LED_Flip();
public.Delay_ms(100);
LED.Run_LED_Flip();
public.Delay_ms(100);
STA_Machine.ucSTA_Machine_Status = STA7;
}
/*
* @name FUN_STA7
* @brief 状态7函数
* @param None
* @retval None
*/
static void FUN_STA7()
{
LED.Run_LED_Flip();
public.Delay_ms(1000);
LED.Run_LED_Flip();
public.Delay_ms(1000);
STA_Machine.ucSTA_Machine_Status = STA8;
}
/*
* @name FUN_STA8
* @brief 状态8函数
* @param None
* @retval None
*/
static void FUN_STA8()
{
LED.Run_LED_Flip();
public.Delay_ms(100);
LED.Run_LED_Flip();
public.Delay_ms(100);
STA_Machine.ucSTA_Machine_Status = STA1;
}
/********************************************************
End Of File
********************************************************/
头文件中要定义状态位的枚举类型,并声明变量
#ifndef __STA_MACHINE_H_
#define __STA_MACHINE_H_
//定义状态位枚举类型
typedef enum
{
STA1 = (uint8_t)0x01,
STA2 = (uint8_t)0x02,
STA3 = (uint8_t)0x03,
STA4 = (uint8_t)0x04,
STA5 = (uint8_t)0x05,
STA6 = (uint8_t)0x06,
STA7 = (uint8_t)0x07,
STA8 = (uint8_t)0x08
}STA_Machine_Status_t;
//定义结构体
typedef struct
{
STA_Machine_Status_t ucSTA_Machine_Status;
void (*FUN_STA1)(void);
void (*FUN_STA2)(void);
void (*FUN_STA3)(void);
void (*FUN_STA4)(void);
void (*FUN_STA5)(void);
void (*FUN_STA6)(void);
void (*FUN_STA7)(void);
void (*FUN_STA8)(void);
}STA_Machine_t;
/* extern variables-----------------------------------------------------------*/
extern STA_Machine_t STA_Machine;
/* extern function prototypes-------------------------------------------------*/