基于stm32通过一个按键,第一次按下,让LED1点亮,第二次按下让LED1熄灭,能够反复执行该能够
时间: 2024-03-27 16:35:38 浏览: 43
教程 4、stm32单片机之点亮1个LED
5星 · 资源好评率100%
实现这个功能可以通过以下步骤:
1. 初始化stm32的GPIO口,将LED1的引脚设为输出口,按键的引脚设为输入口。
2. 在主函数中设置一个变量flag,用于保存LED1的状态。初始时,将flag设为0,表示LED1是熄灭的状态。
3. 在主函数中使用while循环不断检测按键的状态。当检测到按键按下时,将flag的值取反。如果flag为1,表示需要点亮LED1;如果flag为0,表示需要熄灭LED1。
4. 根据flag的值来控制LED1的状态。如果flag为1,则将LED1的引脚输出高电平,LED1点亮;如果flag为0,则将LED1的引脚输出低电平,LED1熄灭。
5. 在程序结尾使用延时函数,以免按键的瞬间按下和松开造成的抖动干扰。
参考代码如下:
```c
#include "stm32f10x.h"
#define LED1_Pin GPIO_Pin_8
#define LED1_Port GPIOB
#define Key_Pin GPIO_Pin_0
#define Key_Port GPIOA
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED1_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED1_Port, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Key_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Key_Port, &GPIO_InitStructure);
}
int main(void)
{
int flag = 0;
GPIO_Configuration();
while (1)
{
if (GPIO_ReadInputDataBit(Key_Port, Key_Pin) == 0)
{
flag = !flag;
while (GPIO_ReadInputDataBit(Key_Port, Key_Pin) == 0)
; //等待按键松开
}
if (flag == 1)
GPIO_SetBits(LED1_Port, LED1_Pin);
else
GPIO_ResetBits(LED1_Port, LED1_Pin);
delay_ms(10);
}
}
void delay_ms(int ms)
{
int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 8000; j++)
;
}
```
注意:以上代码只是一个简单的示例,实际使用时需要考虑按键的抖动问题,以及如何更好地优化代码。
阅读全文