微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在按下和释放按钮的同时打开 LED,然后通过再次按下和释放它来关闭它?

如何解决如何在按下和释放按钮的同时打开 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))) ... 中没有做任何新的事情)。

那么它可能无论如何都不会工作,因为您编码的方式,您将丢失许多“新闻”事件。改用中断。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?