OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5172|回复: 19

一个按键按下led1亮,松开后再次按下led1灭?程序怎么写?

[复制链接]

4

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-5-7
在线时间
5 小时
发表于 2018-5-15 11:31:16 | 显示全部楼层 |阅读模式
1金钱

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,true] while (1) { if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==0)//KEY1 { delay_ms(100); if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==0)//KEY1 { if(HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_11)) HAL_GPIO_WritePin(GPIOF, GPIO_PIN_11, GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOF, GPIO_PIN_11,GPIO_PIN_SET); } } }[/mw_shl_code] 麻烦低级但实测可 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2018-3-5
在线时间
59 小时
发表于 2018-5-15 11:31:17 | 显示全部楼层
[mw_shl_code=c,true]  while (1)
  {
   if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==0)//KEY1
    {
         delay_ms(100);
     if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==0)//KEY1
          {
           if(HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_11))  
            HAL_GPIO_WritePin(GPIOF, GPIO_PIN_11, GPIO_PIN_RESET);
           else
                HAL_GPIO_WritePin(GPIOF, GPIO_PIN_11,GPIO_PIN_SET);
          }
        }
  }[/mw_shl_code]

麻烦低级但实测可靠
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2018-5-15 11:42:55 | 显示全部楼层
加判断 按键松~
判断按下~ led取反~
还有比这更简单的程序?
记得除抖~
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-5-15 11:44:51 | 显示全部楼层
按键按下一次,LED取反一次。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
发表于 2018-5-15 12:08:48 | 显示全部楼层
for(;;)
{
key=Key_san();
if(key==你用来控制的KEY)
     GPIO_WriteBit(GPIOx, GPIO_Pin, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin))));   //把你控制LED的GPIO端口及引脚替换一下
}
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-5-7
在线时间
5 小时
 楼主| 发表于 2018-5-15 13:47:27 | 显示全部楼层
动次打次歌 发表于 2018-5-15 12:06
[mw_shl_code=c,true]  while (1)
  {
   if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==0)//KEY1

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
   
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
  
        {
      if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)//免提按下
                                 
                                         HAL_Delay(50);                                                                                          
                                                                 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)//免提按下
                                                                  {
                                                                                        HAL_Delay(10);
                                                                                        while(!(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)==0){
                                                                                        HAL_GPIO_WritePin(GPIOA, led3_Pin, GPIO_PIN_SET);//led3
                                                                          }       
                                                                  }
                                                                 else
                                                                 {
                                                                 (HAL_GPIO_WritePin(GPIOA,Tel_HFI_Pin,GPIO_PIN_SET)); //led3Ãe
                                                                  }
                 
}
        }         
  /* USER CODE END 3 */

}
回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2016-9-19
在线时间
10 小时
发表于 2018-5-15 13:48:17 | 显示全部楼层
# define LED_ON  0
# define LED_OFF 1
u8 led_status = LED_OFF; //LED灯默认熄灭

/*通常设计成按键按下时,I/O口被强行拉至低电平,我以一般情况为例*/
/*LED电路也一般设计为,低电平LED导通,高电平LED熄灭*/
/*我不适用"!"运算符或"~"运算符,我猜你也在学习库函数版本*/
/*我只是在这里写个程序的雏形,你需要将其转换为相应的stm32平台代码才能正常运作*/
if(key==0) //按键可能被按下
{
   delay_ms(10);  //消抖
   if(key==0)       //确认按键已经按下
   {
       if (led_status)   //led_status为1时,LED灯关闭
       {
           led = LED_ON;
           led_status = LED_ON;
       }
       else
      {
          led = LED_OFF;
          led_status = LED_OFF;
      }
   }
}
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-5-7
在线时间
5 小时
 楼主| 发表于 2018-5-15 13:48:56 | 显示全部楼层
动次打次歌 发表于 2018-5-15 12:06
[mw_shl_code=c,true]  while (1)
  {
   if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==0)//KEY1

我按你的方式写不行啊 ,你帮我看看 程序
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-5-7
在线时间
5 小时
 楼主| 发表于 2018-5-15 13:58:01 | 显示全部楼层
1014507200 发表于 2018-5-15 13:48
# define LED_ON  0
# define LED_OFF 1
u8 led_status = LED_OFF; //LED灯默认熄灭

学习用stm32cube软件  hal库去写,不习惯,不知道各个函数写在哪里?都写在while(1)里吗 ?
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2018-5-15 13:59:28 | 显示全部楼层
monodramal 发表于 2018-5-15 13:48
我按你的方式写不行啊 ,你帮我看看 程序

缺少 GPIO口 的初始化,就是缺设置 成 指定IO口推挽输出。速度。这样。你加上就行了
回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2016-9-19
在线时间
10 小时
发表于 2018-5-15 14:00:09 | 显示全部楼层
monodramal 发表于 2018-5-15 13:58
学习用stm32cube软件  hal库去写,不习惯,不知道各个函数写在哪里?都写在while(1)里吗 ?

按键是不停循环检测嘛,当然要写在死循环里
回复

使用道具 举报

3

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2018-3-5
在线时间
59 小时
发表于 2018-5-15 14:00:50 | 显示全部楼层
monodramal 发表于 2018-5-15 13:48
我按你的方式写不行啊 ,你帮我看看 程序

消抖时间长一点试一下
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-5-7
在线时间
5 小时
 楼主| 发表于 2018-5-15 14:28:12 | 显示全部楼层
森海有眼泉 发表于 2018-5-15 13:59
缺少 GPIO口 的初始化,就是缺设置 成 指定IO口推挽输出。速度。这样。你加上就行了

为什么有个错误啊 ,程序是没错的额
QQ截图20180515142202.png
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-5-7
在线时间
5 小时
 楼主| 发表于 2018-5-15 14:40:19 | 显示全部楼层
动次打次歌 发表于 2018-5-15 14:00
消抖时间长一点试一下

QQ截图20180515144057.png
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-5-15 14:41:05 | 显示全部楼层
这是一点基础都没有啊。。。
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-5-7
在线时间
5 小时
 楼主| 发表于 2018-5-15 14:43:32 | 显示全部楼层

有个错误,所有函数的初始化hal_init();里完成吗?我初学用stm32cubemx软件,一些简单的问题都不知道
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-5-7
在线时间
5 小时
 楼主| 发表于 2018-5-15 14:44:59 | 显示全部楼层
a5820736 发表于 2018-5-15 14:41
这是一点基础都没有啊。。。

为什么有错误?
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-5-7
在线时间
5 小时
 楼主| 发表于 2018-5-15 14:57:58 | 显示全部楼层
a5820736 发表于 2018-5-15 14:41
这是一点基础都没有啊。。。

没有用过hal库写程序,不知道怎么使用?以前用mdk5
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2914
金钱
2914
注册时间
2016-5-13
在线时间
184 小时
发表于 2018-5-15 16:45:35 | 显示全部楼层
本帖最后由 电脑小白 于 2018-5-15 16:54 编辑

要有标志位的才行。前面回答的没有一个可以用的。不仅要考虑按下松手还要考虑按下不松手。上面几位都没有考虑按下不松手,不松手他们写的都是会一直反转的。
加标志位的作用就是锁死当前的输入状态,一直有输入也不会反转(直到松手后释放锁死状态)。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2914
金钱
2914
注册时间
2016-5-13
在线时间
184 小时
发表于 2018-5-15 16:49:04 | 显示全部楼层
本帖最后由 电脑小白 于 2018-5-15 17:01 编辑

我给你说下思路吧。
思路如下:
char in1_flag=0;
whie(1){

    if ((IN1==0)&&(in1_flag==0)){
         in1_flag=1;
        LED0=!LED0;
    }
    if ((IN1!=0)&&(in1_flag==1)){
        in1_flag=0;
    }   
    other_fun();//之所以不在if ((IN1==0)&&(in1_flag==0))里加while(也就是死等,直到松手),是因为在这里可以跑别的函数或者去忙别的事情。
   //写程序多了,你就发现不要在按键输入时加while,那样做代码执行真的会有问题(比如还要操作显示屏什么的,屏幕显示会卡顿)。
}
去抖动什么的,你自己加上。


虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 05:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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