stm32f103c8t6按键流水灯
时间: 2023-07-23 16:03:41 浏览: 87
好的,以下是基于STM32F103C8T6的按键流水灯的代码示例:
首先需要在CubeMX中配置GPIO口和Timer。我们假设使用PA0作为按键口,PB0~PB7作为流水灯口,使用TIM2作为计时器。
代码实现如下:
```c
#include "main.h"
int main(void)
{
HAL_Init();
MX_GPIO_Init();
MX_TIM2_Init();
HAL_TIM_Base_Start(&htim2);
uint16_t led = 0x01; // 初始灯状态
uint8_t key_state = 0; // 按键状态
uint32_t last_time = 0; // 上次计时时间
while (1)
{
if (HAL_GetTick() - last_time >= 100) // 定时100ms读取一次按键状态
{
last_time = HAL_GetTick();
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) // 按键按下
{
key_state = 1;
}
else // 按键释放
{
if (key_state == 1) // 检测到按键按下事件
{
led = led << 1; // 灯状态左移一位
if (led == 0x00) // 灯状态溢出,重新从第一个灯开始
{
led = 0x01;
}
key_state = 0;
}
}
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7, (GPIO_PinState)led);
}
}
```
在上述代码中,我们使用HAL库的HAL_GPIO_ReadPin()函数读取按键状态,使用HAL_GPIO_WritePin()函数控制流水灯的状态。在每次按键按下事件发生时,我们将灯状态左移一位,然后判断是否溢出,如果溢出了则重新从第一个灯开始。按键释放事件需要检测前面是否有按键按下事件,以避免误操作。
需要注意的是,GPIOB口的PB0~PB7必须在CubeMX中配置为推挽输出模式。同时,TIM2计时器的频率需要根据实际情况进行配置,例如本例中设置为1kHz。
阅读全文