stm32f103c8t6按键流水灯
时间: 2023-08-24 18:04:52 浏览: 112
好的,下面是 STM32F103C8T6 按键流水灯的代码示例:
```c
#include "stm32f10x.h"
#define LED_GPIO_Port GPIOB
#define LED_Pin GPIO_Pin_12
#define KEY_GPIO_Port GPIOA
#define KEY_Pin GPIO_Pin_0
void delay(uint32_t time) {
while (time--);
}
int main(void) {
GPIO_InitTypeDef GPIO_InitStruct;
// 初始化 LED 引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin = LED_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
// 初始化按键引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = KEY_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);
uint8_t led_state = 0x01; // 初始流水灯状态
uint8_t key_state = 1; // 初始按键状态
while (1) {
// 检测按键状态
if (GPIO_ReadInputDataBit(KEY_GPIO_Port, KEY_Pin) == 0) {
delay(10000); // 延时去抖
if (GPIO_ReadInputDataBit(KEY_GPIO_Port, KEY_Pin) == 0) {
key_state = !key_state; // 反转按键状态
}
while (GPIO_ReadInputDataBit(KEY_GPIO_Port, KEY_Pin) == 0); // 等待按键释放
}
// 更新流水灯状态
if (key_state == 0) { // 如果按键按下
led_state = (led_state << 1) | 0x01; // 向左移动一位,并将最高位设置为 1
if (led_state == 0x80) { // 如果到达最高位
led_state = 0x01; // 回到初始状态
}
} else { // 如果按键未按下
led_state = (led_state >> 1) | 0x80; // 向右移动一位,并将最低位设置为 1
if (led_state == 0x01) { // 如果到达最低位
led_state = 0x80; // 回到最高位
}
}
// 更新 LED 输出
GPIO_Write(LED_GPIO_Port, led_state);
delay(100000); // 延时一段时间
}
}
```
这个代码示例中,我们使用 PB12 引脚控制 LED,PA0 引脚作为按键输入。程序会不断检测按键状态,如果按键按下,则流水灯向左移动,如果按键未按下,则流水灯向右移动。在移动流水灯的同时,程序会不断更新 LED 的输出,从而实现流水灯的效果。
阅读全文