stm32一个按键控制8个流水灯代码
时间: 2023-10-22 20:08:06 浏览: 59
以下是一个基于STM32的按键控制8个流水灯的示例代码:
```c
#include "stm32f10x.h"
#define LED_GPIO_PORT GPIOB
#define LED_GPIO_PIN GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7
#define KEY_GPIO_PORT GPIOA
#define KEY_GPIO_PIN GPIO_Pin_0
void GPIO_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
// Configure LED pins
GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
// Configure key pin
GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure);
}
int main(void) {
GPIO_Configuration();
while (1) {
if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN) == RESET) {
GPIO_Write(LED_GPIO_PORT, 0xFF00); // turn off all LEDs
GPIO_WriteBit(LED_GPIO_PORT, GPIO_Pin_0, Bit_RESET); // turn on first LED
for (int i = 0; i < 7; i++) {
while (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN) == RESET); // wait for key release
GPIO_WriteBit(LED_GPIO_PORT, GPIO_Pin_0 << i, Bit_SET); // turn on next LED
}
while (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN) == RESET); // wait for key release
GPIO_Write(LED_GPIO_PORT, 0x00FF); // turn off all LEDs
}
}
}
```
这段代码中,我们使用了GPIOB的0~7号引脚作为8个流水灯的输出,使用GPIOA的0号引脚作为按键输入。在主循环中,我们不断检测按键状态,如果按键被按下,则先将所有LED灯关闭,然后依次点亮每个LED灯,等待按键释放后再点亮下一个。最后再将所有LED灯关闭。