OpenEdv-开源电子网

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

写程序好难 ,谁来给个思路

[复制链接]

62

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-11-15
在线时间
85 小时
发表于 2018-6-15 23:21:02 | 显示全部楼层 |阅读模式
1金钱
现在有一个按键 ,我应该怎么检测这个按键按下  。现在有个初步思路如下  ,感觉很不靠谱  。 在定时器里面扫描,还想做一个松手检测  。

void TIM3_IRQHandler(void)   
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
        {
          TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
          if(KEY0 == 0)
            {
                    Key0_Press_time++;
                  if(Key0_Press_time>=5)
                    {

                            Key0_Press_time = 0  ;
                            LED0 =!LED0;

                    }
            }
            //else Key0_Press_time=0;
        }
}
真的没有写过,求指点!!


最佳答案

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

//根据你的思路给你改改,自己将定时器配置成10ms struct { int8_t state;//当前状态:0 = 松开 , 1 = 按下 , -1 = 消抖阶段 uint32_t last_down_time;//最后一次按下的时间:单位ms }key;//按键1的状态信息 void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Upda ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-21
在线时间
171 小时
发表于 2018-6-15 23:21:03 | 显示全部楼层
本帖最后由 哆啦A萌 于 2018-6-16 17:10 编辑

//根据你的思路给你改改,自己将定时器配置成10ms

struct
{
        int8_t           state;//当前状态:0 = 松开 , 1 = 按下 , -1 = 消抖阶段
        uint32_t        last_down_time;//最后一次按下的时间:单位ms
}key;//按键1的状态信息


void TIM3_IRQHandler(void)   
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
                if(KEY0 == 0)//当前被按下
                {
                        if(key.state == 0){                                                                //松开时被按下,进入消抖
                                key.state = -1;
                        }
                        else if(key.state == -1){                              
                                //确定被按下
                                key.state = 1;
                                //重新开始计时
                                key.last_down_time = 0;
                                
                                //在此添加按键按下回调函数
                                
                        }
                        else if(key.state == 1){
                                key.last_down_time += 10;//10ms
                        }
                }
                else
                {
                        key.state = 0;
                        
                        //在此添加按键松开回调函数
                        
                }
        }
}




回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-6-16 07:41:29 来自手机 | 显示全部楼层
要么定时器里处理,要么开个任务检测按键
回复

使用道具 举报

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
发表于 2018-6-16 10:11:54 | 显示全部楼层
上升沿、下降沿中断。
回复

使用道具 举报

62

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-11-15
在线时间
85 小时
 楼主| 发表于 2018-6-16 10:34:47 | 显示全部楼层
yklstudent 发表于 2018-6-16 07:41
要么定时器里处理,要么开个任务检测按键

那定时器处理的话松手怎么检测 ?
回复

使用道具 举报

10

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-16
在线时间
64 小时
发表于 2018-6-16 15:04:05 | 显示全部楼层
为什么不用外部中断
回复

使用道具 举报

3

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2016-11-13
在线时间
40 小时
发表于 2018-6-16 16:36:22 | 显示全部楼层
外部中断不就好了吗
回复

使用道具 举报

62

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-11-15
在线时间
85 小时
 楼主| 发表于 2018-6-16 16:40:53 | 显示全部楼层
jxh123 发表于 2018-6-16 15:04
为什么不用外部中断

怎么检测松手  
回复

使用道具 举报

7

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1279
金钱
1279
注册时间
2017-7-18
在线时间
257 小时
发表于 2018-6-16 18:02:18 | 显示全部楼层

下次进入中断看引脚电平不就知道是不是松手了吗
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2018-6-16 18:21:53 | 显示全部楼层
单击,双击,三击,长按2秒,3秒,等等   一个程序实现
回复

使用道具 举报

62

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-11-15
在线时间
85 小时
 楼主| 发表于 2018-6-16 18:38:56 | 显示全部楼层
哆啦A萌 发表于 2018-6-16 17:01
//根据你的思路给你改改,自己将定时器配置成10ms

struct

如果低多个按键怎么检测  ?
回复

使用道具 举报

62

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-11-15
在线时间
85 小时
 楼主| 发表于 2018-6-16 19:53:18 | 显示全部楼层
哆啦A萌 发表于 2018-6-16 17:01
//根据你的思路给你改改,自己将定时器配置成10ms

struct

想让松手后再触发时间 ,怎么写 ?
回复

使用道具 举报

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
发表于 2018-6-16 22:10:05 | 显示全部楼层
[ 本帖最后由 warship 于 2018-6-16 22:17 编辑 ]\n\n[ 本帖最后由 warship 于 2018-6-16 22:14 编辑 ]\n\n[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=847822&ptid=273335][color=#999999]归荑洵 发表于 2018-6-16 18:38[/color][/url][/size]
如果低多个按键怎么检测  ?[/quote]
如果按键比较多, 可以用数组来干活,
借上面朋友的代码,  这样修改:
#define KEYTOTAL 6    //这里定义按键总数
struct
{
        int8_t     keyval;  //按键值
  int8_t     state;//当前状态:0 = 松开 , 1 = 按下 , -1 = 消抖阶段
  uint32_t   last_down_time;//最后一次按下的时间:单位ms
}key[KEYTOTAL];//所有按键状态信息

void        MyKeyScan(void)         
{
         u8 i;
         for(i=0;i<KEYTOTAL;i++)
           {
                         if(key[i].keyval== 0)//当前被按下
                                 {
                                        if(key[i].state == 0)
                                                {     //松开时被按下,进入消抖
                                                         key[i].state = -1;
                                                }
                                        else if(key[i].state == -1)  //确定被按下   
                                                {                           
                                                        key[i].state = 1;
                                                        //重新开始计时
                                                        key[i].last_down_time = 0;
                                                        
                                                        //在此添加按键按下回调函数
                                                        
                                                }
                                        else if(key[i].state == 1)  //已处于按下状态, 则累计持续按键的时间
                                                {
                                                        key[i].last_down_time += 10;//10ms
                                                }
                                 }
                        else
                                {
                                        key[i].state = 0;
                                       
                                        //在此添加按键松开回调函数
                                       
                                }
        }

}
回复

使用道具 举报

31

主题

1954

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4510
金钱
4510
注册时间
2018-5-11
在线时间
944 小时
发表于 2018-6-16 22:16:53 | 显示全部楼层
在你的10ms中断服务程序中调用上面这个函数
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

62

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-11-15
在线时间
85 小时
 楼主| 发表于 2018-6-16 22:38:58 | 显示全部楼层
warship 发表于 2018-6-16 22:16
在你的10ms中断服务程序中调用上面这个函数

行了  ,谢谢各位了  
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 06:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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