标题: 求助大佬,怎么利用一个按钮来控制led点一下长亮点一下长灭 [打印本页]

作者: hahawofeile    时间: 2024-11-26 14:24
标题: 求助大佬,怎么利用一个按钮来控制led点一下长亮点一下长灭
我的这个程序有问题吗?

屏幕截图 2024-11-26 142338.png (25.4 KB, 下载次数: 0)

屏幕截图 2024-11-26 142338.png

作者: IdeaMing    时间: 2024-11-26 21:14
  1. int main(void)
  2. {
  3.         u8 flag;

  4.         while(1)
  5.         {
  6.                 if(key==0)
  7.                 {
  8.                         if(flag)
  9.                         {
  10.                                 led=0;//灭
  11.                                 flag=0;
  12.                         }else
  13.                         {
  14.                                 led=1;//亮
  15.                                 flag=1;
  16.                         }
  17.                         while(key==0);
  18.                 }
  19.         }
  20. }
复制代码

作者: tianxiazone    时间: 2024-11-26 21:44
第100行 写错了吧 ,这个逻辑有有点问题,  按键可以用中断
作者: hahawofeile    时间: 2024-11-26 21:47
tianxiazone 发表于 2024-11-26 21:44
第100行 写错了吧 ,这个逻辑有有点问题,  按键可以用中断

就是我这个按键接的地,所以按下去读取的应该是0,所以用的reset,这个中断是什么意思啊,请教一下,我们老师上可就讲了这几个函数》

作者: lkc8210    时间: 2024-11-26 23:21
有问题
没消抖
没松手检测
作者: yaosongjin    时间: 2024-11-27 09:44
判断按键里面加个延时再判断一次就实现你的功能了,你目前的程序因为没有延时,单片机跑太快按键可能会乱变灯
作者: zpwgf    时间: 2024-11-28 10:17
本帖最后由 zpwgf 于 2024-11-28 10:21 编辑

HAL_GPIO_TogglePin使用这个函数就方便撒。比如:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11) == 0)
    {
        HAL_Delay(10);
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11) == 0)
        {
            HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_10);
        }
    }
没错的话应该这样也可以。当然,这样不松手的话理论上会一直来回跳
作者: 会飞的鱼KKK    时间: 2024-11-28 11:21
按按键的时间和HAL_Delay(150),最好延时时间大于按键时间,让按一次只进入一次A11接地判定,还有A10一般做串口用,点灯有点大材小用了
作者: 会飞的鱼KKK    时间: 2024-11-28 11:25
在第一个if里面加延时,保证按一次按键只执行第一个一次if
作者: hahawofeile    时间: 2024-11-28 15:33
会飞的鱼KKK 发表于 2024-11-28 11:21
按按键的时间和HAL_Delay(150),最好延时时间大于按键时间,让按一次只进入一次A11接地判定,还有A10一般做 ...

哈哈哈,小白一个,老师上课都没讲什么直接就让我们写了
作者: ohh132    时间: 2024-12-13 13:32
发表于 2024-11-28 15:33
哈哈哈,小白一个,
  1. u8 flag1 = 0;
  2. void key1_control (void)
  3. {
  4.         if (GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_0) != 0)
  5.         {
  6.                 delay_ms (10);
  7.                 if (GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_0) != 0)
  8.                 {
  9.                         while (GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_0) != 0) {}
  10.                         flag1++;
  11.                 }
  12.         }
  13.         if (flag1 % 2 == 1)
  14.                 GPIO_ResetBits (GPIOE, GPIO_Pin_2 | GPIO_Pin_3) ;
  15.         else
  16.                 GPIO_SetBits (GPIOE, GPIO_Pin_2 | GPIO_Pin_3);
  17. }
复制代码





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1