STC15单片机-状态机点灯

状态机点灯

类似状态机检测按键的做法,但这里没有用定时器检测,状态位的切换放在main函数主循环里进行

程序

文件结构

在这里插入图片描述

main.c:包含main函数,主要系统逻辑,调用不同的状态函数

LED.c:包含打开运行指示灯,关闭运行指示灯,翻转运行指示灯函数

STA_Machine.c:包含不同状态的函数,函数里实现翻转运行指示灯

Sys_Init.c:系统初始化,包含GPIO初始化,运行指示灯引脚配置成推挽输出

public.c:包含延时函数,public.h文件包含数据类型的重定义

main.c

状态机用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;
		}
	}
}

STA_Machine.c

状态机函数,分为8个状态,每个状态可以实现不同的功能,这里只是简单的指示灯翻转,不同状态翻转的时间不同而已

在每一个状态函数实现完功能后,将状态机的状态位变量切换到下一个状态,这样在main函数中才能根据状态位调用这里的函数

状态位一开始初始化为STA1

/* Includes ------------------------------------------------------------------*/
#include <main.h>

/* 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
********************************************************/

STA_Machine.h

头文件中要定义状态位的枚举类型,并声明变量

#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-------------------------------------------------*/ 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值