找回密码
 立即注册
查看: 320|回复: 8

一个按键控制一个LED,搞不定

[复制链接]

1

主题

0

回帖

5

积分

新手上路

积分
5
发表于 2024-6-15 16:46:26 | 显示全部楼层 |阅读模式


/******************** IO¿ÚÅäÖÃ ********************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                                //½á¹¹¶¨Òå

        GPIO_InitStructure.Pin  = GPIO_Pin_3|GPIO_Pin_7;                        //Ö¸¶¨Òª³õʼ»¯µÄIO, GPIO_Pin_0 ~ GPIO_Pin_7, »ò²Ù×÷
        GPIO_InitStructure.Mode = GPIO_PullUp;                        //Ö¸¶¨IOµÄÊäÈë»òÊä³ö·½Ê½,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP


        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //³õʼ»¯
        P0_PULL_UP_ENABLE(S1);
}

void main(void){        
        EAXSFR();                /* À©Õ¹¼Ä´æÆ÷·ÃÎÊʹÄÜ */
        GPIO_config();
        while(1)
        {
                if(S1==0&&key_flag==0)
                {delay_ms(5);
                        if(S1==0&&key_flag==0)
                {
                 key_flag=1;
                 P33=0;
                }
        }
                if(!S1&&key_flag==1)
                {
                        delay_ms(5);
                        if(!S1&&key_flag==1)
                {
                key_flag=0;
                 P33=1;
                }
        }
               
        }
}
现在出现问题,有时候按键抬起等灭,有时候抬起按键等不灭,简单不能在简单的程序了


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:428
  • 最近打卡:2025-05-07 00:13:45
已绑定手机

19

主题

3194

回帖

4948

积分

论坛元老

积分
4948
发表于 2024-6-15 18:13:18 来自手机 | 显示全部楼层
本帖最后由 soma 于 2024-6-15 18:18 编辑

用else if判断
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:416
  • 最近打卡:2025-05-06 08:57:51
已绑定手机

39

主题

2010

回帖

6859

积分

论坛元老

积分
6859
发表于 2024-6-17 11:40:41 | 显示全部楼层
S1==0 与 !S1 是相同的功能,都是判断 S1 是否为 0
建议用相同的用法 if(S1==0) 与 if(S1==1)
或者:if(!S1) 与 if(S1)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:428
  • 最近打卡:2025-05-07 00:13:45
已绑定手机

19

主题

3194

回帖

4948

积分

论坛元老

积分
4948
发表于 2024-6-17 14:25:12 | 显示全部楼层
没有按键释放检测,如果按键差会造成重复触发,可以在if判断完后面加个while(!S1);等待按键释放在执行判断。不然一直卡在等待按键释放。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:450
  • 最近打卡:2025-05-06 04:24:11

17

主题

533

回帖

1330

积分

金牌会员

积分
1330
发表于 2024-6-17 15:44:06 | 显示全部楼层
觉得可能还是抖动的锅
自信就会温和,温和就会坚定!
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-07 07:20:07

61

主题

818

回帖

1514

积分

金牌会员

积分
1514
发表于 2024-6-17 16:22:37 | 显示全部楼层
你这是用的库函数吧{:5_278:}     寄存器会玩了????   stc32库我还真不会
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:339
  • 最近打卡:2025-05-06 20:07:45

23

主题

296

回帖

1168

积分

金牌会员

积分
1168
发表于 2024-6-17 18:36:37 | 显示全部楼层
本帖最后由 lezjin 于 2024-6-17 18:38 编辑
  1. while(1)
  2.         {
  3.                 if(S1==0&&key_flag==0)
  4.                 {       delay_ms(5);
  5.                         if(S1==0&&key_flag==0)
  6.                         {
  7.                                key_flag=1;
  8.                                P33=0;
  9.                          }
  10.                 }
  11.                 if(!S1&&key_flag==1)
  12.                 {
  13.                         delay_ms(5);
  14.                         if(!S1&&key_flag==1)
  15.                        {
  16.                               key_flag=0;
  17.                               P33=1;
  18.                         }
  19.                 }
  20.                
  21.         }
复制代码


你的代码缩进看着有点晕,S1是定义的管脚吗?

你的逻辑有点问题, if(S1==0&&key_flag==0)判断后 key_flag=1;
随后跳进if(!S1&&key_flag==1),然后 key_flag=0;
然后再循环 if(S1==0&&key_flag==0)判断后 key_flag=1;
再跳进if(!S1&&key_flag==1),然后 key_flag=0;
..........如此循环,程序到哪里停,全靠运气







回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-6-18 13:28:21 | 显示全部楼层
不知道你的按键目的是啥,给两个代码给你参考
  1. while(1)
  2. {
  3.         P33=S1;//按下亮,放手灭
  4. }
  5. while(1)
  6. {
  7.         if(!S1)
  8.         {
  9.                 delay_ms(5);
  10.                 if(!S1)
  11.                 {
  12.                         if(key_flag==0)
  13.                         {
  14.                                 key_flag=1;
  15.                                 P33=!P33;//按下取反
  16.                         }
  17.                 }
  18.         }else{
  19.                 key_flag=0;
  20.         }
  21. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:428
  • 最近打卡:2025-05-07 00:13:45
已绑定手机

19

主题

3194

回帖

4948

积分

论坛元老

积分
4948
发表于 2024-6-18 14:24:14 来自手机 | 显示全部楼层
Lkck8210 发表于 2024-6-18 13:28
不知道你的按键目的是啥,给两个代码给你参考

这段代码也有点问题,竟然按下按键取反就没必要标识位了。也就是else也可以去掉。然后最后加while(!S1)等待按键释放。不然还是很容易连击。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 11:56 , Processed in 0.153627 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表