OpenEdv-开源电子网

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

?为什么有了if(mode)key_up=1; 这个语句 ,就支持连按了??

[复制链接]

29

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2014-9-11
在线时间
8 小时
发表于 2014-10-1 10:20:56 | 显示全部楼层 |阅读模式
5金钱

为什么有了if(mode)key_up=1;  这个语句 ,就支持连按了?


u8 KEY_Scan(u8 mode)
{  
static u8 key_up=1;
if(mode)key_up=1;     
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))
{
delay_ms(10); 
key_up=0;
if(KEY0==0)return KEY_RIGHT;
else if(KEY1==0)return KEY_DOWN;
else if(KEY2==0)return KEY_LEFT;
else if(KEY3==1)return KEY_UP;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;    
  return 0;
}

最佳答案

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

回复【6楼】心染红尘: --------------------------------- model  就是两种模式啊 !! 一个不支持连按  一个支持连按!!! 楼主看不懂,我觉得你是看不懂static这个含义
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-10-1 10:20:57 | 显示全部楼层
回复【6楼】心染红尘:
---------------------------------
model  就是两种模式啊 !!

一个不支持连按  一个支持连按!!!

楼主看不懂,我觉得你是看不懂static这个含义
学无止境
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-10-1 11:14:40 | 显示全部楼层
一行一行的看,看它怎样执行,一定可以看懂的。
回复

使用道具 举报

29

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2014-9-11
在线时间
8 小时
 楼主| 发表于 2014-10-1 14:05:34 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
就是if(mode)key_up=1; 这条语句不明白
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-10-1 15:39:58 | 显示全部楼层
回复【3楼】心染红尘:
---------------------------------
看不明白,找C语言的书来看,还不明白,你可以自己写一个按键扫描程序出来,不用例程的,也许写完了,这个也明白了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-2 00:03:19 | 显示全部楼层
回复【3楼】心染红尘:
---------------------------------
这就是恢复按键检测。
如果key_up,说明按键没松开。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

29

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2014-9-11
在线时间
8 小时
 楼主| 发表于 2014-10-2 10:45:01 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
那mode有什么特别的含义呢?
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-10-2 12:24:46 | 显示全部楼层
回复【6楼】心染红尘:
---------------------------------
去查查  static的效果吧
学无止境
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2014-10-30
在线时间
1 小时
发表于 2014-11-3 21:17:48 | 显示全部楼层
在(mode)后加几个空格你就会明白了
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-11-22
在线时间
0 小时
发表于 2014-11-22 13:35:48 | 显示全部楼层
你把keyup改成KeyupFlag也许更好理解,其实mode就是控制了keyupflag这个标志位,mode=1会自动置位KeyupFlag,而mode=0则跳过执行这一句
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-4-17 20:42:02 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
看不懂啊  真心不懂
@@@
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-4-18 09:23:05 | 显示全部楼层
回复【11楼】飞岛主:
---------------------------------
看它执行2次就知道了,就是进入函数2次你就能看得出来了,不过我不用这样的按键扫描方法。
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-4-18 10:16:49 | 显示全部楼层
回复【12楼】TinyBoy:
--------------------------------我可否请教一下 你是怎么扫描的呢  谢谢
@@@
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-4-18 13:57:10 | 显示全部楼层
回复【13楼】飞岛主:
---------------------------------
中断定时扫
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-4-18 20:47:38 | 显示全部楼层
回复【13楼】飞岛主:
---------------------------------
你可以用定时器做个节拍,在主函数里面扫描就行了。
回复

使用道具 举报

15

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2014-11-2
在线时间
24 小时
发表于 2015-6-16 20:48:17 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥 static u8 key_up=1;//按键松开标志  为什么松开了key_up=1 ??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-16 22:28:11 | 显示全部楼层
回复【16楼】过客:
---------------------------------
因为这个变量用来控制是否支持连按。全送开的话,key_up就必须置1,保证下次扫描可以返回正常按键值。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2014-11-2
在线时间
24 小时
发表于 2015-6-17 10:18:13 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
谢谢
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-7-2
在线时间
0 小时
发表于 2015-8-15 10:34:22 | 显示全部楼层
都说的废话,没解决问题
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-8-15 10:40:44 | 显示全部楼层
回复【19楼】DTZXDF:
---------------------------------
那是因为你C语言基础太差!
学无止境
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-7-2
在线时间
0 小时
发表于 2015-8-15 10:51:06 | 显示全部楼层
回复【20楼】jermy_z:
---------------------------------那麻烦你解释一下,if(mode)key_up=1;这一句中mode的取值对key_up有影响吗?我mode=0,这句不执行,key_up=1;mode=1,这句执行,key_up还是=1;这什么意思?
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-7-2
在线时间
0 小时
发表于 2015-8-15 10:58:18 | 显示全部楼层
回复【21楼】DTZXDF:
---------------------------------
查了一下static,懂了。。。这真是极好的
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-8-15 11:18:10 | 显示全部楼层
回复【22楼】DTZXDF:
---------------------------------
呵呵
学无止境
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2015-11-3
在线时间
0 小时
发表于 2015-11-12 16:14:28 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
static u8 key_up = 1;//按键松开标志位
if (mode) key_up = 1;//支持连续按键

你好,这样的话,不管mode是1还是0,key_up都是1,那这样的话没有区别啊,请教了,谢谢!
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2015-11-3
在线时间
0 小时
发表于 2015-11-12 16:33:28 | 显示全部楼层
回复【6楼】心染红尘:
---------------------------------
把mode设置为1,在case里面加个长delay,就看出效果了
case KEY2_PRES: //控制LED0翻转
LED0=!LED0;
 delay_ms(1000000);
回复

使用道具 举报

12

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2016-5-12
在线时间
27 小时
发表于 2016-5-12 16:44:32 | 显示全部楼层
楼主,你把if(mode)key_up=1;
分开,成
if(mode)
key_up=1;
就知道了,这就是个条件判断语句。如果mode是0,就不会执行这个if语句。如果mode是1,每次key_up会被还原成1
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-8-3
在线时间
1 小时
发表于 2016-8-3 23:29:28 | 显示全部楼层
if(mode)key_up=1;  把这个屏蔽掉试试
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-8-3
在线时间
1 小时
发表于 2016-8-3 23:39:21 | 显示全部楼层
我试试了屏蔽这句if(mode)key_up=1;  完全不影响程序运行
回复

使用道具 举报

8

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2016-9-14
在线时间
56 小时
发表于 2016-9-19 17:51:13 | 显示全部楼层
因为你没有需要连续按着一个按键响应多次的情况,如果有就会影响运行了。

开始也没明白是忽略了一个细节,key_up只是作为一个标志,但是开发指南的程序里if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))这里边判断按键按下是要跟key_up相与的,也就是当你有键按下时还需要key_up为1才能让程序读取到按键值。key_up作为静态变量只会被初始化一次,每一次读取到一个按键值后key_up就会被置0,让它重新变为1只有两种情况,一:else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1; 这里就并不是连续按了,只要你按键松开了,下次继续读取没问题。二:你如果是想连续按着不动又希望程序能多次读取到的话,必须通过if(mode)key_up=1;  这一句就能让key_up恢复1,这样就实现了不需要松开按键就让它恢复1,即可实现连续按键并且程序连续读取。

回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-5-18
在线时间
22 小时
发表于 2017-1-16 10:40:28 | 显示全部楼层
我想问一下 mode  在哪里设置  ?
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-7-27
在线时间
38 小时
发表于 2017-1-16 14:06:20 | 显示全部楼层
路过,各位解释的不错、
回复

使用道具 举报

13

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2016-12-1
在线时间
22 小时
发表于 2017-1-16 18:47:30 | 显示全部楼层
小瓜123 发表于 2016-9-19 17:51
因为你没有需要连续按着一个按键响应多次的情况,如果有就会影响运行了。

开始也没明白是忽略了一个细节 ...

回复

使用道具 举报

22

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2017-3-18
在线时间
17 小时
发表于 2017-4-8 20:29:00 | 显示全部楼层
TinyBoy 发表于 2014-10-1 15:39
回复【3楼】心染红尘:
---------------------------------
看不明白,找C语言的书来看,还不明白,你可以自 ...

mode 的用法在C语言哪块有讲到啊?
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2017-4-10 10:58:46 | 显示全部楼层
十七年 发表于 2017-4-8 20:29
mode 的用法在C语言哪块有讲到啊?

变量除了定义之外,前面还有声明,你把C语言所有声明的关键字找出来,然后一个个弄明白就行了。
回复

使用道具 举报

0

主题

26

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1060
金钱
1060
注册时间
2016-7-25
在线时间
115 小时
发表于 2017-4-10 17:50:10 | 显示全部楼层
不错,温故而知新啊
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2017-5-24
在线时间
0 小时
发表于 2017-5-24 09:31:56 | 显示全部楼层
我来大概哦总结一下吧,我也刚看这个程序:
1)mode是函数接口,调用的时候mode可以选择:a)mode=0,每次只能读取一次按键值,需要KE3复位才能再次读取;b)mode=1,此时key_up每次均为1,可以连续读取(不管是否KEY3);
2)mode=0时,是static使得key_up保持调用时的状态,例如,第一次是KEY1,则key_up会变成0,再次调用函数时候,key_up还是0,函数返回值为0,表示无变化。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2017-5-24
在线时间
0 小时
发表于 2017-5-24 09:32:07 | 显示全部楼层
本帖最后由 未来的风筝 于 2017-5-24 09:34 编辑

我来大概哦总结一下吧,我也刚看这个程序:
1)mode是函数接口,调用的时候mode可以选择:a)mode=0,每次只能读取一次按键值,需要KE3复位才能再次读取;b)mode=1,此时key_up每次均为1,可以连续读取(不管是否KEY3);
2)mode=0时,是static使得key_up保持上次调用时的状态,例如,第一次是KEY1,则key_up会变成0,再次调用函数时候,key_up还是0,函数返回值为0,表示无变化。
回复

使用道具 举报

9

主题

101

帖子

0

精华

高级会员

Rank: 4

积分
532
金钱
532
注册时间
2017-3-5
在线时间
74 小时
发表于 2017-5-24 10:40:42 | 显示全部楼层
发现一些都是搞笑的,基础打扎实了再好好看程序。
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-9-7
在线时间
4 小时
发表于 2018-1-7 22:07:30 | 显示全部楼层
if(mode)  就等价于 if (mode==1)
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2018-1-8 08:59:36 | 显示全部楼层
怎么感觉请教别人的人变成“大爷”了
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2018-1-8 17:12:09 | 显示全部楼层
这个函数有bug.    哈哈!
自己选择的路,成家前走完。
回复

使用道具 举报

1

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2017-2-15
在线时间
172 小时
发表于 2018-1-9 16:58:19 | 显示全部楼层
最好的方法是直接硬件仿真,跟着程序每一步走一遍
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-1-21
在线时间
2 小时
发表于 2018-1-21 12:27:49 | 显示全部楼层
Jupiter 发表于 2014-11-22 13:35
你把keyup改成KeyupFlag也许更好理解,其实mode就是控制了keyupflag这个标志位,mode=1会自动置位KeyupFlag ...

可是如果mode为0,key_up还是等于1,前面定义了静态局部变量key_up初始化为1了,这里不懂
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-7-10
在线时间
1 小时
发表于 2019-7-12 17:36:25 | 显示全部楼层
可能是我基础太差了,我还是不明白mode是在哪里设置的,要怎么把mode设置成0或1?
有谁可以跟我说说,或者告诉我应该去看哪些资料吗?
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2019-4-25
在线时间
30 小时
发表于 2019-7-23 14:51:17 | 显示全部楼层
好好读几遍程序,静下心来用逻辑模拟代码的执行过程就懂了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-7-10
在线时间
9 小时
发表于 2019-8-20 18:20:08 | 显示全部楼层
蛊鹿爻 发表于 2019-7-12 17:36
可能是我基础太差了,我还是不明白mode是在哪里设置的,要怎么把mode设置成0或1?
有谁可以跟我说说,或者 ...

main函数里有一句是调用这个key=KEY_scan(0),这个就是函数参数的传递就赋值为0
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-10-26
在线时间
7 小时
发表于 2019-9-17 16:17:08 | 显示全部楼层
有哪位大神,把连按,长按的代码贴出来对比一下,让小白的我学习学习!

谢谢!!!!
回复

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2019-8-19
在线时间
9 小时
发表于 2019-9-30 09:06:27 | 显示全部楼层
u8 KEY_Scan(u8 mode)
{         
        static u8 key_up=1;//按键按松开标志                //static代表这个定义只执行一次
        if(mode)key_up=1;  //支持连按                    //mode为1之后)key_up就会持续为1
        if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))//一旦支持连按mode=1,按键按下之后,虽然下面key_up被置0,但按键没有松开,
                                                                                                        //新一轮的扫描开始,下面又一次返回按键值,从而造成按键不放持续产生返回值的情况
        {
                delay_ms(10);//去抖动
                key_up=0;                        //当不支持连按mode=0时,)key_up在这里被置0,从而这个if语句只会被执行一次就结束掉,不会出现持续按键的情况。
                if(KEY0==0)return 1;                //注意KEY0返回的是1
                else if(KEY1==0)return 2;
                else if(KEY2==0)return 3;
                else if(WK_UP==1)return 4;                //注意这个是1是按下,0是松开
        }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;             
        return 0;// 无按键按下,返回0
}
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-8-3
在线时间
2 小时
发表于 2019-9-30 09:42:15 | 显示全部楼层
心染红尘 发表于 2014-10-1 14:05
回复【2楼】TinyBoy:
---------------------------------
就是if(mode)key_up=1; 这条语句不明白

if(mode)
{
    key_up=1;

}
改成这样就容易理解了,如果mode=1,那么key_up=1,如果mode=0,则不执行key_up=1。
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-11-23
在线时间
5 小时
发表于 2019-11-23 23:17:41 | 显示全部楼层
yoka 发表于 2019-9-30 09:06
u8 KEY_Scan(u8 mode)
{         
        static u8 key_up=1;//按键按松开标志                //static代表这个定义只执行一次

,我就是static的用法没搞明白。static修饰后,就第一次执行时赋初始值,后续再执行该函数,保持上一次的key up的值,不再重新赋值。看了你的终于搞明白了!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 19:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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