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

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 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。