OpenEdv-开源电子网

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

关于按键和LED的实验,一个是按下就明暗变化,一个是松开才变化

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-9-7 16:29:05 | 显示全部楼层 |阅读模式
1金钱
代码如下,用的STM32CUBEMX做按键控制灯闪烁实验,功能可以实现,有一个地方有点儿疑惑。一个是把while判断放在led翻转的前面,一个是把while放在led翻转的后面,结果就是一个是我按下的那一刻,led翻转,松开手没反应;一个是按下的那一刻没反应,松手才翻转,自己理解不了,求指导~

复制代码
  1.     if(KEY2 == GPIO_PIN_RESET)
  2.     {
  3.         HAL_Delay(5);
  4.         if(KEY2 == GPIO_PIN_RESET)
  5.         {
  6.             HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
  7.             while(KEY2 == GPIO_PIN_RESET);
  8.         }
  9.     }
  10.     if(KEY3 == RESET)
  11.     {
  12.         HAL_Delay(5);
  13.         if(KEY3 == RESET)
  14.         {
  15.             while(KEY3 == RESET);
  16.             HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
  17.         }
  18.     }
复制代码

最佳答案

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

因为你的代码顺序是两种,一种先阻塞一种后阻塞。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2020-9-7 16:29:06 | 显示全部楼层
王大爷爱吃鱼 发表于 2020-9-7 17:35
恩,你的说法可以解释按下进入循环,按住不松(没反应),松了(然后跳出循环),然后翻转。
那为什么会 ...

因为你的代码顺序是两种,一种先阻塞一种后阻塞。
微信截图_20200907174716.png
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2020-9-7 17:01:28 | 显示全部楼层
while(KEY3 == RESET);阻塞了。当按键按下的时候一直满足循环条件,所以不会向下执行会卡在这句。松开后循环条件不满足。就继续往下走了
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-9-7 17:35:14 | 显示全部楼层
thisisdemo 发表于 2020-9-7 17:01
while(KEY3 == RESET);阻塞了。当按键按下的时候一直满足循环条件,所以不会向下执行会卡在这句。松开后循 ...

恩,你的说法可以解释按下进入循环,按住不松(没反应),松了(然后跳出循环),然后翻转。
那为什么会出现另外一种情况是按下的就会翻转,然后按住不松,松了没反应。
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-9-8 10:07:51 | 显示全部楼层
  1.     if(KEY2 == GPIO_PIN_RESET)
  2.     {
  3.         HAL_Delay(5);
  4.         if(KEY2 == GPIO_PIN_RESET)
  5.         {
  6.             HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
  7.             while(KEY2 == GPIO_PIN_RESET);
  8.         }
  9.     }
  10.     if(KEY3 == RESET)
  11.     {
  12.         HAL_Delay(5);
  13.         if(KEY3 == RESET)
  14.         {
  15.             while(KEY3 == RESET);
  16.             HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
  17.         }
  18.     }
复制代码

要注意 while(KEY3 == RESET);后面的分号不能去掉。加上分号就说明是阻塞,在while里面空跑。如果去掉分号的话,就变成了在while里面执行翻转了,可能出现的现象就是led非常快的闪烁,快到眼睛都跟不上的那种
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-17 14:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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