久芯网

STM32F103两个按键的程序分开都可以运行,合在一起没有报错但是只有第一个可以运行了

avatar 思时 提问时间: 2023-08-27 12:44:25 / 未解决
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"


int main (void){                                      //主程序
    u8 a,b;
        u16 t=1;
        u8 Menu,i,m,K; //ppppppppppppppppppp
        RCC_Configuration();                              //时钟设置
        LED_Init();
        KEY_Init();

        while(1){
          if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5))         //KEY0为PC5,若按下,则被清零
           {delay_ms(20);                                                                 //防抖动
          if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5))
           {a++;
            b=0;
           }
           }
          while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5));         //检测是否松开
          if(a%2==1)
          {
                  if(m<10)
          { GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(1));        //LED0为PA8,若清零,则亮
                GPIO_WriteBit(GPIOD,GPIO_Pin_2,(BitAction)(0));        //LED1为PD2,若清零,则亮
                for(K=0;K<10;K++)
                delay_ms(10);
                m++;
          }
                                                     //延时1秒
                if(m<20&&m>9)
          { GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(0));       
                GPIO_WriteBit(GPIOD,GPIO_Pin_2,(BitAction)(1));
                for(K=0;K<10;K++)
                delay_ms(10);
                m++;
          }
            
                if(m==20)
                m=0;
          }
          if(a!=0&&a%2==0)
          {
          GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(1));
          GPIO_WriteBit(GPIOD,GPIO_Pin_2,(BitAction)(1));
          }


          if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15))         //KEY1为PA15,若按下,则被清零
           {delay_ms(20);                                                                 //防抖动
          if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15))
           {b++;
            a=0;
           }
           }
           while(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15));   //检测是否松开
          if(b%2==1)
                  {
                        GPIO_WriteBit(GPIOD,GPIO_Pin_2,(BitAction)(1));
                        if(Menu==0)
                        {  for(i=0;i<10;i++)
                            {  GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(0));
                                   delay_us(t);
                                   GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(1));
                                   delay_us(501-t);
                                }
                                t++;
                                if(t==500)
                                { Menu=1;
                                  t=1;
                                }
                        }
                        if(Menu==1)
                        {  for(i=0;i<10;i++)
                            {  GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(1));
                                   delay_us(t);
                                   GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(0));
                                   delay_us(501-t);
                                }
                                t++;
                                if(t==500)
                                { Menu=0;
                                  t=1;
                                }
                        }
                  }
                  if(b!=0&&b%2==0)
                  { GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(1));
                GPIO_WriteBit(GPIOD,GPIO_Pin_2,(BitAction)(1));
                  }
        }
}


5个回答
  • avatar 废鱼
    回答时间: 2023-08-27 13:03:27

    楼主,应该是程序判断导致的。建议用中断,通过边沿触发来进行判断。当产生边中断和结束中断后的时间差。

  • avatar wenyangzeng
    回答时间: 2023-08-27 13:23:57

    需要同时判断2个按键状态的,比如: if((!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)) &&(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)))

  • avatar 思时
    回答时间: 2023-08-27 13:53:15
    wenyangzeng 发表于 2021-7-21 08:12
    需要同时判断2个按键状态的,比如: if((!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)) &&(!GPIO_ReadInputD ...

    谢谢你帮我解答~~刚刚试了一下还是不亮、、、

  • avatar 思时
    回答时间: 2023-08-27 14:11:11
    飞羽一条 发表于 2021-7-21 08:52
    楼主,应该是程序判断导致的。建议用中断,通过边沿触发来进行判断。当产生边中断和结束中断后的时间差。 ...

    谢谢呀,中断的方法应该挺好的,我今天把他加上。三楼同学有没有不加中断的方法呀从程序判断这里可以解决么、、

  • avatar wenyangzeng
    回答时间: 2023-08-27 14:30:02
    思时 发表于 2021-7-21 12:57
    谢谢你帮我解答~~刚刚试了一下还是不亮、、、

    要接下去判断呀: if((!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)) &&(!GPIO_ReadInputD ) { } else if((!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)) { } else if(!GPIO_ReadInputD { }

会员中心 微信客服
客服
回到顶部