STM32单片机通过一个按键控制LED灯实现状态的正反切换的代码
时间: 2024-11-15 20:25:47 浏览: 10
STM32F429BI单片机按键检测和LED控制软件例程工程源码.zip
5星 · 资源好评率100%
STM32单片机通过按键控制LED灯实现正反切换的基本思路是利用中断处理程序配合GPIO口驱动LED,并结合按键的状态变化。这里给出一个简化的示例代码,假设我们使用的是Keypad矩阵键盘和一个LED作为输入输出:
```c
#include "stm32f10x.h" // 包含STM32的头文件
// LED配置
#define LED_PIN GPIO_Pin_0
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_CLK RCC_AHB1Periph_GPIOA
// 按键配置
#define KEY_PIN_1 GPIO_Pin_1
#define KEY_PIN_2 GPIO_Pin_2
#define KEY_PORT GPIOB
#define KEY_GPIO_CLK RCC_AHB1Periph_GPIOB
void LedInit(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 初始化LED
RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 输出推挽模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
// 初始化按键
RCC_AHB1PeriphClockCmd(KEY_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY_PIN_1 | KEY_PIN_2; // 或者是整个键矩阵的Pin
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_In_FLOATING; // 浮空输入
GPIO_Init(KEY_PORT, &GPIO_InitStructure);
}
// 按键中断服务函数
void EXTI0_IRQHandler(void) {
if (GPIO_ReadInputDataBit(KEY_PORT, KEY_PIN_1)) { // 检查第一个按键是否按下
if (!GPIO_ReadOutputDataBit(LED_GPIO_PORT, LED_PIN)) {
GPIO_SetBits(LED_GPIO_PORT, LED_PIN); // LED点亮
} else {
GPIO_ResetBits(LED_GPIO_PORT, LED_PIN); // LED熄灭
}
}
}
int main(void) {
LedInit();
NVIC_EnableIRQ(EXTI0_IRQn); // 开启按键中断
while (1) {
// 循环等待按键触发中断
}
}
阅读全文