OpenEdv-开源电子网

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

关于按键扫描很棘手的问题,有实际项目经验的请进~

[复制链接]

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
发表于 2013-5-7 19:06:10 | 显示全部楼层 |阅读模式

int main(void)
{
    display(key_value);
    delay_ms(20);
}

//按键扫描函数
//放在定时器中断服务里每10ms扫描一次
key_scan(void)
{
    u8 key_value = 0;
    ......;
    return key_value;
}
这个key_value应该是全局变量还是局部变量呢?
可我觉得无论是全局还是局部的都可能出问题啊,求高人指点~

(1)若key_value是局部变量;假设,当前按下的是5号键,被扫描到了
那么key_value就是5了;但此时若主函数正好执行到delay_ms(20);
那么这20ms还未执行完,就又迎来了下一个中断扫描(此时没有按键被按下);
那么上次key_value中存的键值5就会因为重新进入key_scan(void)被替换为初始值0;
那么上次按下的5号键 就失效了啊!对吧?
故意加delay_ms(20)就是为了测试当主函数里的代码量很大很耗时的时侯,
按键值还能不能被正确检测到呢?
    到此可能有人会说把key_value定义成全局变量就好了,请继续看:
(2)若key_value是全局变量;假设,当前按下的是5号键,被扫描到了
那么key_value就是5了;但此时若主函数正好执行到delay_ms(20);
6号键又被按下了,那么key_value里的5是不是就会被6号键的键值6给替换了呢?
那么上次按下的5号键 就失效了啊!对吧?
    针对这个问题大家是怎么解决的呢?
难道只是祈求主程序快点执行完毕吗?
求一个简单实用的解决方法!!(不要告诉我主程序的执行周期不可能超过20ms之类的话哦)

乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

490

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1229
金钱
1229
注册时间
2012-8-4
在线时间
248 小时
发表于 2013-5-7 20:26:40 | 显示全部楼层
据说一秒扫描5就够啦   那你试试100ms扫描一次
扫描间隔要大于程序执行周期
nrf51822蓝牙4.0手环开发板: 淘宝小店
回复 支持 反对

使用道具 举报

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
 楼主| 发表于 2013-5-7 20:35:56 | 显示全部楼层
那肯定不行的啊   那肯定是漏键了  不用测试的
乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
回复 支持 反对

使用道具 举报

14

主题

490

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1229
金钱
1229
注册时间
2012-8-4
在线时间
248 小时
发表于 2013-5-7 20:38:44 | 显示全部楼层
呵呵 人按键最快每秒多小次????按键持续最小多小时间???我没有专业答案
要是你知道了,你的问题就解决了吧
nrf51822蓝牙4.0手环开发板: 淘宝小店
回复 支持 反对

使用道具 举报

头像被屏蔽

2

主题

164

帖子

1

精华

禁止访问

积分
1316
金钱
1316
注册时间
2012-5-13
在线时间
127 小时
发表于 2013-5-7 20:40:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-7 21:27:56 | 显示全部楼层
回复【楼主位】可乐虎:
---------------------------------
用消息队列。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
 楼主| 发表于 2013-5-7 21:30:21 | 显示全部楼层
回复【5楼】qq371833846:
---------------------------------
嗯 好方法 这正是我准备考虑的

回复【6楼】正点原子:
---------------------------------
这个貌似复杂了点啊 以后再考虑 


谢谢二位!
乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
回复 支持 反对

使用道具 举报

6

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-5-8 11:36:07 | 显示全部楼层
回复【7楼】可乐虎:
---------------------------------
也不复杂吧 就是每次查询一下队列的值和校验值吧
~~~~ 欢迎讨论,拒绝谩骂 ~~~~
回复 支持 反对

使用道具 举报

21

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2012-3-11
在线时间
49 小时
发表于 2013-5-8 17:19:38 | 显示全部楼层
200ms之内扫描一次按键,一般应用绰绰有余了
这辈子只会两件事:这也不会,那也不会!
回复 支持 反对

使用道具 举报

头像被屏蔽

88

主题

231

帖子

2

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-11
在线时间
40 小时
发表于 2013-5-9 13:15:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

243

主题

429

帖子

0

精华

禁止发言

积分
1067
金钱
1067
注册时间
2011-12-23
在线时间
17 小时
发表于 2013-5-9 15:23:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
 楼主| 发表于 2013-5-12 12:54:24 | 显示全部楼层
谢楼上各位, 我正在用入队的方法保存按键值,且每入队一次变量cnt++,然后再在主程序判断cnt的值,若大于0则说明有键被按下了,就根据键值执行相应动作,然后,出队一次,且cnt--。不知还有没有大虾有更好的方法?个人认为这个方法很好……
乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-5-13 16:49:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-20 06:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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