stm32按键控制流水灯
时间: 2023-09-10 12:11:31 浏览: 39
下面是一个使用STM32控制流水灯的示例代码,其中包含按键控制:
```c
#include "stm32f10x.h"
void Delay(uint32_t nCount);
int main()
{
// 初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; // 灯的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50MHz输出速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 初始化按键
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 按键引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入模式
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 循环显示流水灯
uint8_t LedState = 0;
while (1)
{
// 检测按键状态
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == RESET) // 按键按下
{
LedState = !LedState; // 反转灯的状态
while (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == RESET); // 等待按键释放
}
// 显示流水灯
if (LedState)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
Delay(100000);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
Delay(100000);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_SetBits(GPIOA, GPIO_Pin_2);
Delay(100000);
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
GPIO_SetBits(GPIOA, GPIO_Pin_3);
Delay(100000);
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
}
else
{
GPIO_SetBits(GPIOA, GPIO_Pin_3);
Delay(100000);
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
GPIO_SetBits(GPIOA, GPIO_Pin_2);
Delay(100000);
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
Delay(100000);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_SetBits(GPIOA, GPIO_Pin_0);
Delay(100000);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
}
}
// 延时函数
void Delay(uint32_t nCount)
{
for (uint32_t i = 0; i < nCount; i++);
}
```
在这个示例中,我们使用了4个GPIO引脚控制4个LED灯,另一个GPIO引脚控制一个按键。通过循环显示流水灯,并在按键按下时反转灯的状态。
需要注意的是,这个示例中使用了一个简单的延时函数来控制灯的亮灭。实际上,这并不是一个好的实现方式,因为在代码中使用的循环延时会占用CPU资源并且不够准确。更好的实现方式是使用定时器来控制灯的亮灭。