stm32一个按键控制切换多种不同工作模式
时间: 2023-07-20 12:42:36 浏览: 794
实现一个按键控制切换多种不同工作模式,可以采用状态机的方法,对于每个工作模式,都定义一个状态,当按键被按下时,状态机切换到下一个状态,从而实现多种工作模式的切换。
下面是一个简单的示例代码,实现了两种工作模式的切换:
```c
#include "stm32f10x.h"
#define KEY_GPIO_PORT GPIOA
#define KEY_GPIO_PIN GPIO_Pin_0
#define MODE1_LED_GPIO_PORT GPIOB
#define MODE1_LED_GPIO_PIN GPIO_Pin_12
#define MODE2_LED_GPIO_PORT GPIOB
#define MODE2_LED_GPIO_PIN GPIO_Pin_13
typedef enum
{
MODE1,
MODE2
} MODE_T;
static MODE_T current_mode = MODE1;
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure);
}
void MODE1_LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = MODE1_LED_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(MODE1_LED_GPIO_PORT, &GPIO_InitStructure);
}
void MODE2_LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = MODE2_LED_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(MODE2_LED_GPIO_PORT, &GPIO_InitStructure);
}
void KEY_Scan(void)
{
static uint8_t key_down = 0;
if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN) == RESET)
{
if (key_down == 0)
{
key_down = 1;
current_mode = (current_mode == MODE1) ? MODE2 : MODE1;
}
}
else
{
key_down = 0;
}
}
void LED_Display(void)
{
if (current_mode == MODE1)
{
GPIO_SetBits(MODE1_LED_GPIO_PORT, MODE1_LED_GPIO_PIN);
GPIO_ResetBits(MODE2_LED_GPIO_PORT, MODE2_LED_GPIO_PIN);
}
else
{
GPIO_ResetBits(MODE1_LED_GPIO_PORT, MODE1_LED_GPIO_PIN);
GPIO_SetBits(MODE2_LED_GPIO_PORT, MODE2_LED_GPIO_PIN);
}
}
int main(void)
{
KEY_GPIO_Config();
MODE1_LED_GPIO_Config();
MODE2_LED_GPIO_Config();
while (1)
{
KEY_Scan();
LED_Display();
}
}
```
在这个示例代码中,我们定义了两种工作模式:MODE1和MODE2。在`KEY_Scan()`函数中,检测按键是否被按下,如果被按下,则切换到下一个工作模式。在`LED_Display()`函数中,根据当前工作模式,控制LED的亮灭。在`main()`函数中,循环调用`KEY_Scan()`和`LED_Display()`函数,实现按键控制工作模式的切换。
阅读全文