sten32按键控制八个灯,摁一下亮一个代码不使用hal库
时间: 2024-10-20 18:05:11 浏览: 5
custom-elements:这是一个Stencil JS组件库示例
在编写不使用HAL库的STM32控制8个LED灯的按键控制程序时,你需要手动管理GPIO、中断以及定时器等硬件资源。以下是一个简单的示例,假设你有一个按键连接到PA0,8个LED分别连接到PB0-PB7:
```c
#include "stm32f1xx.h"
// 定义GPIO口和引脚
GPIO_TypeDef *led_port = GPIOA; // LED GPIO
GPIO_PinDef_t led_pins[] = {GPIO_PIN_0, GPIO_PIN_1, ... , GPIO_PIN_7}; // LED对应引脚数组
GPIO_TypeDef *key_port = GPIOB; // 按键GPIO
GPIO_PinDef_t key_pin = GPIO_PIN_0; // 按键引脚
void init_GPIO(void) {
// 初始化GPIO配置为推挽输出
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE);
for (int i = 0; i < 8; i++) {
GPIO_Init(led_port, &GPIO_InitStructure Led_InitStruct); // LED初始化
GPIO_PinAFConfig(led_port, GPIO_PinSource0, GPIO_AF_PP); // 配置LED的中断
GPIO_PinModeSet(led_port, led_pins[i], GPIO_MODE_OUTPUT_PP, GPIO_PULLUP);
}
GPIO_Init(key_port, &GPIO_InitStructure Key_InitStruct); // 按键初始化
GPIO_PinAFConfig(key_port, GPIO_PinSource0, GPIO_AF_NONE); // 防止按键触发中断
GPIO_PinModeSet(key_port, key_pin, GPIO_MODE_INPUT, GPIO_PULLUP);
}
// 判断按键是否按下
bool is_key_pressed(void) {
return !(GPIO_ReadInputDataBit(key_port, key_pin));
}
void blink_led(int led_num) {
if (led_num >= 0 && led_num < 8) {
GPIO_SetBits(led_port, led_pins[led_num]); // 点亮LED
}
}
int main(void) {
init_GPIO();
while (1) {
if (is_key_pressed()) {
blink_led(GPIO_PinGetPos(led_port, led_pins[0])); // 当按键按下时,点亮第一个LED
while (is_key_pressed()); // 按住按键直到释放
}
// 可以在这里添加其他LED控制逻辑,比如延时或按顺序循环点亮
}
return 0;
}
```
阅读全文