今天我听别人说什么是状态机编程这个和我们的模块话编程有什么联系
比如我们这里举出一个很简单的例子
拿大家熟知的按键控制LED灯来说吧
这个正好满足模块化和状态机编程
我们可以把LED和按键分模块来使用,在keil里面我们会封装成为
Led.c,Key.c,Led.h,Key.h
之后对他们分别进行初始化,这里我使用标准库来给大家做演示
Led.c
cpp
#include "stm32f10x.h"
#include "Led.h"
void LedInit(){
RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef Led;
Led.GPIO_Mode=GPIO_Mode_Out_PP;
Led.GPIO_Pin=GPIO_Pin_0;
Led.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&Led);
// 初始化之后让灯亮
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}
void LedOFF(){
GPIO_SetBits(GPIOA,GPIO_Pin_0);
}
void LedON(){
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}
可以看出这个就是Led的三种状态
初始化,灯亮,灯灭这三种状态
Key.c
cpp
#include "stm32f10x.h"
#include "Key.h"
void KeyInit(){
RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef Key;
Key.GPIO_Mode=GPIO_Mode_IPU;
Key.GPIO_Pin=GPIO_Pin_1;
Key.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&Key);
}
bool KeyPress(){
bool KeyPress=False;
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){
delay_ms(20);
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
delay_ms(20);
KeyPress=Ture;
}
return KeyPress;
}
这把按下按键和按键初始化这两个状态给分开
但这两个是分别是两个模块
这就是我对模块化编程和状态机编程的简单理解欢迎批评指正