你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
思时 提问时间:2021-7-20 20:22 / 未解决
#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 发布时间:2021-7-20 20:22

举报

5个回答
废鱼 回答时间:2021-7-21 08:52:24
楼主,应该是程序判断导致的。建议用中断,通过边沿触发来进行判断。当产生边中断和结束中断后的时间差。
wenyangzeng 回答时间:2021-7-21 08:12:01
需要同时判断2个按键状态的,比如:
if((!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5))  &&(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)))
思时 回答时间:2021-7-21 12:57:41
wenyangzeng 发表于 2021-7-21 08:12
需要同时判断2个按键状态的,比如:
if((!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5))  &&(!GPIO_ReadInputD ...

谢谢你帮我解答~~刚刚试了一下还是不亮、、、
思时 回答时间:2021-7-21 13:05:08
飞羽一条 发表于 2021-7-21 08:52
楼主,应该是程序判断导致的。建议用中断,通过边沿触发来进行判断。当产生边中断和结束中断后的时间差。
...

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

wenyangzeng 回答时间:2021-7-21 13:30:33
思时 发表于 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
{
}

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版