这个代码是。怎么用按键控制LED灯能亮灭,按下之后返回时不应该是0,然后LED不是亮吗,为什么还能控制他灭




uint8_t KEY_SCAN(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)  //改过需重新写,  OFF-->ON
{
      if( GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_OFF)
        {
             delay(500000);//消抖
            if( GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_OFF)
             //松手检测
            {
         while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_OFF);//松手时会变成KEY_ON,跳出这个while循环
             return KEY_OFF;//当为KEY_ON跳出循环时,返还成KEY_OFF进入主函数的while循环
            }
        }
}
int main(void)
{      
        KEY_GPIO_Config();
        LED_GPIO_Config();
    
      while(1)
        {
            if(KEY_SCAN(GPIOE,KEY1) == KEY_OFF)     0
                LED_G_TOGGLE;
      }
}
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7646003
  • 这篇博客你也可以参考下:51单片机、外部中断的使用(使用外部中断对LED灯进行操作,当按键按下灯亮、再次按下灯熄灭)
  • 除此之外, 这篇博客: 按键控制LED灯的亮灭中的 按键控制LED灯的亮灭 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 新建库函数的工程文件,在《利用固件库点亮LED灯》文章的基础上加上一个key.c文件和key.h文件。
    2. 初始化KEY的GPIO函数
    void KEY_GPIO_Config(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct;
      
      RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK, ENABLE);
      
      GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
      GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStruct);
      
      GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
      GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStruct);   
    }
    
    1. 按键扫描函数
    //按键扫描
    uint8_t key_scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    {
      if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
      {
        //松手检测
        while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
        return KEY_ON;
      }
      else
        return KEY_OFF;
    }
    
    1. 在main函数中调用
    int main(void)
    {
      LED_GPIO_Config();
      KEY_GPIO_Config();
      while(1)
      {
        if(key_scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON)
        {
          LED_TOGGLE;
        }
        if(key_scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == KEY_ON)
        {
          LED_TOGGLE;
        }
      }
    }
    

    其中LED_TOGGLE是利用宏定义的方式实现。
    这里需要注意的是不要掉;
    并且是控制LED的GPIO端口。

    #define LED_TOGGLE {LED_GPIO_PORT->ODR^=LED_GPIO_PIN;}
    

根据提供的代码,请注意以下几点:

  1. 函数没有返回值:KEY_SCAN函数声明为返回uint8_t类型,但在代码中没有使用return语句返回任何值。你需要添加返回语句并确保返回正确的值。

  2. KEY_SCAN函数内部缺少else块:当前的逻辑是,如果按键被按下,进入了第一个if语句块,延时后再次检测按键状态。这时候如果按键仍然按下,会进入第二个if语句块并返回KEY_OFF。但如果按键已经松开,会继续执行下面的代码,没有返回值。你应该根据需要添加一个else块,并在其中返回相应的值。

修改后的代码示例:

uint8_t KEY_SCAN(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
    if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_OFF)
    {
        delay(500000); // 消抖
        if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_OFF)
        {
            while (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_OFF); // 松手时会变成KEY_ON,跳出这个while循环
            return KEY_OFF; // 当为KEY_ON跳出循环时,返回KEY_OFF
        }
        else
        {
            return KEY_ON; // 其他情况,返回KEY_ON(按键未按下)
        }
    }
    else
    {
        return KEY_ON; // 按键未按下
    }
}

int main(void)
{
    KEY_GPIO_Config();
    LED_GPIO_Config();

    while(1)
    {
        if (KEY_SCAN(GPIOE, KEY1) == KEY_OFF)
        {
            LED_G_TOGGLE;
        }
    }
}