c++ - 如何在按下并释放一次按钮时打开 LED,然后通过再次按下和释放将其关闭?
问题描述
我试图通过按下并释放一次按钮来打开 LED,然后通过再次按下并释放它来关闭它,依此类推。我一起写了一堆代码,但我不确定听起来是否正确。我的意思是我不知道这是我的面包板还是连接松动,但不确定它是否按预期工作。我知道接线是正确的,只需在按下按钮时将其打开,然后通过释放按钮将其关闭即可。任何帮助深表感谢。谢谢你。
这是代码:
//Reset and clock control - Advanced high-performance bus - Enabling GPIO Port C pin 6 and Port B pin 1
RCC -> AHBENR |= RCC_AHBENR_GPIOCEN;
RCC -> AHBENR |= RCC_AHBENR_GPIOBEN;
//Setup Control Registers for the LED output
//Mode register as Output
GPIOC -> MODER |= GPIO_MODER_MODER6_0;
GPIOC -> MODER &= ~(GPIO_MODER_MODER6_1);
//OtypeR - Push pull
GPIOC -> OTYPER &= ~(GPIO_OTYPER_OT_6);
//OspeedR - High
GPIOC -> OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6;
//PUPDR
GPIOC -> PUPDR &= ~(GPIO_PUPDR_PUPDR6);
//Setup control registers for the push button input
//Mode register as input
GPIOB -> MODER &= ~(GPIO_MODER_MODER1);
//Pull up pull down register
GPIOB -> PUPDR &= ~(GPIO_PUPDR_PUPDR1); // Connected to ground externally (no need for internal pupdr
int counter = 0;
while (1) {
//If the button is pressed (IDR - input data register)
if((GPIOB -> IDR & (GPIO_IDR_1)) && counter == 0) //If button is pressed
{
GPIOC -> BSRR |= GPIO_BSRR_BS_6; //Turn ON the LED
if(~(GPIOB->IDR &(GPIO_IDR_1))) // If the button is released
{
GPIOC -> BSRR |= GPIO_BSRR_BS_6; //LED stays ON
}
}
counter = 1;
if((GPIOB -> IDR & (GPIO_IDR_1)) && counter == 1) //If button is pressed
{
GPIOC -> BRR |= GPIO_BRR_BR_6; //Turn OFF the LED
if(~(GPIOB -> IDR &(GPIO_IDR_1))) // If the button is released
{
GPIOC -> BRR |= GPIO_BRR_BR_6; //LED stays OFF
}
}
counter = 0;
}
解决方案
你有几个问题。
第一个可能与去抖动有关。当您按下按钮时,电信号实际上在两个值之间振荡,最后,您的代码将认为“第二次按下按钮”可能只是开关的弹跳。
此外,当您的代码检测到按钮按下时,它不会等待按钮被释放,它只是打开 LED 并立即检查按钮是否已被释放。它不会在所有情况下都有效(无论如何你的代码在......中没有做任何新的事情if(~(GPIOB->IDR &(GPIO_IDR_1)))
)。
那么它可能无论如何都不起作用,因为你编码它的方式,你会丢失许多“新闻”事件。改用中断。
推荐阅读
- node.js - npm 安装本地子文件夹 eperm 符号链接
- jsonpath - JsonPath 从其他数组中获取数组元素
- python-3.x - Asyncio 任务的大列表,在每个任务中顺序结合 run_in_executor 和标准协程
- sql - 将日期设置为 SQL 中的变量以调用导出文件命名约定
- javascript - 如果不等待承诺,如何抛出错误?
- ruby-on-rails - How to update a specific field in Mongodb knowing it's name?
- python - python 3上的numba库安装问题
- javascript - 从 JavaScript 中的 math.matrix 获取元素
- php - 产品图片不显示我
- angular - MatBottomSheet 的自定义位置/父级