OpenEdv-开源电子网

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

stm32在定时器里写按键检测程序

[复制链接]

77

主题

203

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1208
金钱
1208
注册时间
2017-8-25
在线时间
167 小时
发表于 2018-8-14 11:24:11 | 显示全部楼层 |阅读模式
3金钱
因为按键检测在主循环里效率不高,程序写的比较大的话按键就不是很灵敏,所以我想在定时器里写按键检测程序,但是不知道怎么操作

最佳答案

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

http://www.openedv.com/forum.php?mod=viewthread&tid=277263&fromguid=hot&extra=&mobile=2
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-8-14 11:24:12 来自手机 | 显示全部楼层
http://www.openedv.com/forum.php?mod=viewthread&tid=277263&fromguid=hot&extra=&mobile=2
回复

使用道具 举报

0

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2017-12-21
在线时间
76 小时
发表于 2018-8-14 11:52:35 | 显示全部楼层
我觉得还是等你的程序写得"比较大"的时候再来考虑这个问题吧
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-14 12:32:21 | 显示全部楼层
qq215379484 发表于 2018-8-14 11:52
我觉得还是等你的程序写得"比较大"的时候再来考虑这个问题吧

哈哈!人无远虑必有近忧
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-14 12:36:58 | 显示全部楼层
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

77

主题

203

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1208
金钱
1208
注册时间
2017-8-25
在线时间
167 小时
 楼主| 发表于 2018-8-14 13:11:50 | 显示全部楼层
1208 发表于 2018-8-14 12:36
你参考下这帖子:http://www.openedv.com/forum.php?mod=viewthread&tid=274729&extra=

你这个帖子只是要10毫秒后执行,10毫秒过后还要等其他程序执行完到按键检测才执行按键程序
回复

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
470
金钱
470
注册时间
2017-12-20
在线时间
61 小时
发表于 2018-8-14 14:14:45 | 显示全部楼层
外部中断可以考虑一下
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-8-22
在线时间
14 小时
发表于 2018-8-14 14:45:11 | 显示全部楼层
写个按键状态检测,在定时器中断里面调用就可以了
脸上的泥土不能阻止眼中的光芒,生活的艰辛不能阻止内心的渴望!
回复

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-8-14 15:09:07 | 显示全部楼层
如果要及时处理按键只有用中断了。
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-14 20:39:32 | 显示全部楼层
可以这样:
假如设置定时器每10ms触发,那么就在其更新函数里面检测按键引脚电平;如果按键动作(例如被按下),那么相应的标志变量置位;等下一次进入定时器中断的时候,通过标志变量知道上次进入中断时已经有按键被按下,这次检测按键引脚的电平还是否维持之前的不变。如果是,则可以认为过了10ms电平不变,按键有效,反之则无效。

其实可以使用外部中断结合定时器的方法。按键按下,外部中断触发进入终端服务函数,此时启动定时器,假如定时器被配置为10ms触发;然后10ms后定时器进入更新中断,此时再检测按键引脚电平,如果没有变,那么可以认为在过去的10ms里电平一直没有变,按键有效;反之则无效。然后关闭定时器。
十六进制带我飞。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-8-14 22:04:37 | 显示全部楼层
//滴答定时器中断里面这样写,就不用延时消抖了
void SysTick_Handler(void)
{        
  nTicks++;
  if(nTicks%20==0)//20ms扫描一下按键
     Key=KEY_Scan(0);
}
//main里面查询就可以了
while(1)
{
        if(Key)
        {
                if(Key==KEY_UP_PRES)
                {
                                                LED1=~LED1;                                                
                }
                if(Key==KEY_DOWN_PRES)
                {
                                                LED2=~LED2;                                                
                }
                //其他按键
                Key=0;  //按键处理完后, 清0
        }
        //主程序中的其他代码
         
}
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

77

主题

203

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1208
金钱
1208
注册时间
2017-8-25
在线时间
167 小时
 楼主| 发表于 2018-8-16 14:11:19 | 显示全部楼层
warship 发表于 2018-8-14 22:04
//滴答定时器中断里面这样写,就不用延时消抖了
void SysTick_Handler(void)
{        

你Key=KEY_Scan(0);是原子的程序么,里面有Delay延时么
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-8-16 14:26:04 来自手机 | 显示全部楼层
逍遥1 发表于 2018-8-16 14:11
你Key=KEY_Scan(0);是原子的程序么,里面有Delay延时么

这个你别看了,看一下我的最新帖子吧,有比较完整的按键程序
回复

使用道具 举报

77

主题

203

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1208
金钱
1208
注册时间
2017-8-25
在线时间
167 小时
 楼主| 发表于 2018-8-16 14:52:54 | 显示全部楼层
warship 发表于 2018-8-16 14:26
这个你别看了,看一下我的最新帖子吧,有比较完整的按键程序

帖子呢
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-8-16 15:22:58 来自手机 | 显示全部楼层
逍遥1 发表于 2018-8-16 14:52
帖子呢

点我的ID,再点主题。
不好意思,手机操作,不方便给链接
回复

使用道具 举报

77

主题

203

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1208
金钱
1208
注册时间
2017-8-25
在线时间
167 小时
 楼主| 发表于 2018-8-16 16:06:13 | 显示全部楼层
warship 发表于 2018-8-16 15:22
点我的ID,再点主题。
不好意思,手机操作,不方便给链接

if(GET_K0()) ktmp|=1;
  if(GET_K1()) ktmp|=1<<1;
   if(GET_K2()) ktmp|=1<<2;
   if(GET_KWK()) ktmp|=1<<3;这段是什么意思GET_K0()
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-8-16 16:21:34 来自手机 | 显示全部楼层
逍遥1 发表于 2018-8-16 16:06
if(GET_K0()) ktmp|=1;
  if(GET_K1()) ktmp|=1

把键盘硬件的实时开关状态收集到一个变量中
回复

使用道具 举报

77

主题

203

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1208
金钱
1208
注册时间
2017-8-25
在线时间
167 小时
 楼主| 发表于 2018-8-16 17:19:39 | 显示全部楼层
warship 发表于 2018-8-16 16:21
把键盘硬件的实时开关状态收集到一个变量中

我现在需要的是按键长按数值累加,像电子表调时间按加减,数值一直累加,直到放掉按键停止,自然也支持短按
回复

使用道具 举报

77

主题

203

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1208
金钱
1208
注册时间
2017-8-25
在线时间
167 小时
 楼主| 发表于 2018-8-16 17:22:35 | 显示全部楼层
warship 发表于 2018-8-16 16:21
把键盘硬件的实时开关状态收集到一个变量中

我现在需要的是按键长按数值累加,像电子表调时间按加减,数值一直累加,直到放掉按键停止,自然也支持短按
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4521
金钱
4521
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-8-16 17:48:18 来自手机 | 显示全部楼层
逍遥1 发表于 2018-8-16 17:22
我现在需要的是按键长按数值累加,像电子表调时间按加减,数值一直累加,直到放掉按键停止,自然也支持短 ...

这个用我那个程序实现没有问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 15:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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