zhouzhou1122 发表于 2024-6-15 16:46:26

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

{:cry:}

/******************** 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;
                }
      }
               
      }
}
现在出现问题,有时候按键抬起等灭,有时候抬起按键等不灭,简单不能在简单的程序了{:cry:},


soma 发表于 2024-6-15 18:13:18

本帖最后由 soma 于 2024-6-15 18:18 编辑

用else if判断

乘风飞扬 发表于 2024-6-17 11:40:41

S1==0 与 !S1 是相同的功能,都是判断 S1 是否为 0
建议用相同的用法 if(S1==0) 与 if(S1==1)
或者:if(!S1) 与 if(S1)

soma 发表于 2024-6-17 14:25:12

没有按键释放检测,如果按键差会造成重复触发,可以在if判断完后面加个while(!S1);等待按键释放在执行判断。不然一直卡在等待按键释放。

嵌入式之路 发表于 2024-6-17 15:44:06

觉得可能还是抖动的锅

zhange 发表于 2024-6-17 16:22:37

你这是用的库函数吧{:5_278:}   寄存器会玩了????   stc32库我还真不会

lezjin 发表于 2024-6-17 18:36:37

本帖最后由 lezjin 于 2024-6-17 18:38 编辑

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;
                        }
                }
               
      }

你的代码缩进看着有点晕,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;
..........如此循环,程序到哪里停,全靠运气







Lkck8210 发表于 2024-6-18 13:28:21

不知道你的按键目的是啥,给两个代码给你参考
while(1)
{
        P33=S1;//按下亮,放手灭
}


while(1)
{
        if(!S1)
        {
                delay_ms(5);
                if(!S1)
                {
                        if(key_flag==0)
                        {
                                key_flag=1;
                                P33=!P33;//按下取反
                        }
                }
        }else{
                key_flag=0;
        }
}

soma 发表于 2024-6-18 14:24:14

Lkck8210 发表于 2024-6-18 13:28
不知道你的按键目的是啥,给两个代码给你参考

这段代码也有点问题,竟然按下按键取反就没必要标识位了。也就是else也可以去掉。然后最后加while(!S1)等待按键释放。不然还是很容易连击。
页: [1]
查看完整版本: 一个按键控制一个LED,搞不定