金豆大战斗帝 2023-01-17 13:08 采纳率: 33.3%
浏览 103
已结题

stmSTM32L476 按键控制led闪烁

下面的代码:
按一下按键,led一直保持闪烁。
怎样才能改成,按一下按键,led保持闪烁,然后再按一下,led停止闪烁。以此类推
我试过在while(1)里面加上一个另外一个while(GPIOC->IDR & (1 << BUTTON_PIN)); 去检测按键是否按下,但是没有按上述要求工作
谢谢

while(1){
        GPIOA->ODR |= 1 << LED_PIN;   //led亮
        delayMs(50); // Call the delay function
        GPIOA->ODR &= ~(1 << LED_PIN);  //led 灭
        delayMs(50); // Call the delay function
        while(GPIOC->IDR & (1 << BUTTON_PIN)); 
        GPIOA->ODR &= ~(1 << LED_PIN);   //led灭
    }

下面是按一下键可以让led循环闪烁

#include "stm32L476xx.h"

#define LED_PIN 5 
#define BUTTON_PIN 13

void delayMs(int n);

void toggleLed();

int main(void) {
    //enable clock for GPIOA and GPIOC
    RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; 
    RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN;    

    // Configure LED2 pin as output
    GPIOA->MODER &= ~(3UL << (2 * LED_PIN)); 
    GPIOA->MODER |=  (1UL << (2 * LED_PIN)); 

    // Configure button pin as input
    GPIOC->MODER &= ~(3UL << (2 * BUTTON_PIN)); 

    // Configure button with no pull-up or pull-down
    GPIOC->PUPDR &= ~(3UL << (2 * BUTTON_PIN));
    
        
    while(GPIOC->IDR & (1 << BUTTON_PIN)); //wait for button press
    while(1){
        GPIOA->ODR |= 1 << LED_PIN;
        delayMs(50); // Call the delay function
        GPIOA->ODR &= ~(1 << LED_PIN);
        delayMs(50); // Call the delay function
    }
}

        


/* 16 MHz SYSCLK */
void delayMs(int n) {
    int i;
    for (; n > 0; n--)
        for (i = 0; i < 3195; i++);
}

  • 写回答

6条回答 默认 最新

  • weixin_53295371 2023-01-20 09:35
    关注

    为了让LED在按一次按键后闪烁,再按一次按键后停止闪烁,您可以在代码中添加一个变量来跟踪LED的状态。每次按下按键时,您可以在代码中使用这个变量来切换LED的状态。在while循环中加入if语句来检测按键是否按下,如果按键按下,切换LED的状态,如果LED当前是灭的,就让它亮,如果LED当前是亮的,就让它灭。

    int led_state = 0;
    while(1){
        if(!(GPIOC->IDR & (1 << BUTTON_PIN))){
            led_state = !led_state;
            while(!(GPIOC->IDR & (1 << BUTTON_PIN)));
        }
        if(led_state){
            GPIOA->ODR |= 1 << LED_PIN;   //led亮
            delayMs(50); // Call the delay function
            GPIOA->ODR &= ~(1 << LED_PIN);  //led 灭
            delayMs(50); // Call the delay function
        }
    }
    
    
    

    这样就可以实现按键控制LED闪烁。
    另外,如果您想要在按键按下时立即停止闪烁,可以在if语句中将LED状态立即设置为灭,而不是等待下一个while循环迭代。

    int led_state = 0;
    while(1){
        if(!(GPIOC->IDR & (1 << BUTTON_PIN))){
            led_state = !led_state;
            if(led_state){
                GPIOA->ODR |= 1 << LED_PIN;   //led亮
            }else{
                GPIOA->ODR &= ~(1 << LED_PIN);  //led 灭
            }
            while(!(GPIOC->IDR & (1 << BUTTON_PIN)));
        }
        if(led_state){
            delayMs(50); // Call the delay function
            GPIOA->ODR ^= 1 << LED_PIN;   //led状态取反
            delayMs(50); // Call the delay function
        }
    }
    
    
    

    这样就可以实现按键控制LED闪烁。
    如果您还有其他问题,请随时告诉我。
    望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 1月28日
  • 已采纳回答 1月20日
  • 创建了问题 1月17日

悬赏问题

  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持