OpenEdv-开源电子网

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

求教stm32的按键扫描程序

[复制链接]

4

主题

17

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-12-12
在线时间
14 小时
发表于 2016-12-26 12:04:42 | 显示全部楼层 |阅读模式
3金钱
求教大神一个按键扫描程序的编程思路,按键要实现的功能是按住后松开才算一次触发,目前我设置标志位可以实现一个按键的触发,但在原来基础上加上两个按键按下就没反应了,连原来的第一个按键也没反应,有关部分程序如下:
u8 key_up=1;   //按键标志位,松开1,按下0
#define KEY1  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)//读取按键1


u8 KEY_Scan(void)
{         
        u8 key=0;
        /* 按键1扫描 */
        if(key_up && KEY1==0)
                  {
                          delay_ms(10);
                          key_up=0;
                  }
        else if(key_up==0 && KEY1==1)
                {
                        delay_ms(10);
                        key_up=1;
                        if(KEY1==1 )
                              return key=KEY1_PRES;
                }

       else if(KEY==1)


                 key_up=1;
}

最佳答案

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

参考我个性签签名档的博客地址,《STM8L之自定义长短按键》。 我的驱动是独立的,你需要多个按键可以简单地多添加几个驱动文件来改。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-12-26 12:04:43 | 显示全部楼层
参考我个性签签名档的博客地址,《STM8L之自定义长短按键》。
我的驱动是独立的,你需要多个按键可以简单地多添加几个驱动文件来改。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
发表于 2016-12-26 12:55:06 | 显示全部楼层
本帖最后由 yangkefeng 于 2016-12-26 13:00 编辑

参考原子哥按键例程,在key_scan里边修改,一般按键为按下触发,假设按键一端接地,if(KEY==0)   
delay_ms(10);
if(KEY==0)
{
    //按键响应
}
如果你想要松开触发
if(KEY==0)   
delay_ms(10);
if(KEY==0)//按键已经按下
{
    while(KEY!=0)//等待按键松开
    {
        delay_ms(10);
    }
    //按键已松开
    //按键响应
}

这是我的思路,你可以试一下,多个按键把KEY改成KEY1,KEY2...就可以了
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-12-26 13:03:10 | 显示全部楼层
这种还是用定时器来决定++,吧,别用delay.再加上while,程序不用干别的了
shop60994719.taobao.com
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-12-12
在线时间
14 小时
 楼主| 发表于 2016-12-26 16:18:51 | 显示全部楼层
feilusia 发表于 2016-12-26 12:34
参考我个性签签名档的博客地址,《STM8L之自定义长短按键》。
我的驱动是独立的,你需要多个按键可以简单 ...

谢了,问题已解决,里面程序实现的功能虽然跟我所需要的有所不同,但也确实为我开拓了按键扫描方式。
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-12-12
在线时间
14 小时
 楼主| 发表于 2016-12-26 16:28:43 | 显示全部楼层
yangkefeng 发表于 2016-12-26 12:55
参考原子哥按键例程,在key_scan里边修改,一般按键为按下触发,假设按键一端接地,if(KEY==0)   
delay_m ...

谢谢,问题已解决,额。。我提个疑问,你的程序里while(KEY!=0)这句,如果满足条件也就是松开不就会一直在delay_ms(10)这里循环直到不是松开状态才跳出循环吗?我的这个理解有错吗?
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-12-12
在线时间
14 小时
 楼主| 发表于 2016-12-26 16:35:17 | 显示全部楼层
密耳 发表于 2016-12-26 13:03
这种还是用定时器来决定++,吧,别用delay.再加上while,程序不用干别的了

怎么用定时器决定?你的意思是定时器每到一次更新事件才执行按键扫描?
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-12-26 16:40:23 | 显示全部楼层
qwerjj 发表于 2016-12-26 16:35
怎么用定时器决定?你的意思是定时器每到一次更新事件才执行按键扫描?

按键分中断和查询两种方式。
其中查询方式的按键又分阻塞方式(例如delay_ms(10);)和非阻塞方式。

非阻塞方式的查询方式,又可以通过轮询方式查询(我博客方式)、通过定时器方式查询(如10ms查询一次是否有按键)。
定时器比较准,但功耗更高。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-12-26 16:52:14 | 显示全部楼层
feilusia 发表于 2016-12-26 16:40
按键分中断和查询两种方式。
其中查询方式的按键又分阻塞方式(例如delay_ms(10);)和非阻塞方式。

请教一下,为什么说定时器查询的方式功耗更高呢?无论裸机还是操作系统,都是需要一个节拍的,感觉完全是不用白不用。

采用程序本身运行时间作为延时这种方式,没有使用过,会不会时间的抖动过大?
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-12-26 17:03:10 | 显示全部楼层
东北小辉辉 发表于 2016-12-26 16:52
请教一下,为什么说定时器查询的方式功耗更高呢?无论裸机还是操作系统,都是需要一个节拍的,感觉完全是 ...

任何外设都耗电。
你说的是时间误差大不大?有误差,不大。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-12-12
在线时间
14 小时
 楼主| 发表于 2016-12-26 17:10:52 | 显示全部楼层
feilusia 发表于 2016-12-26 16:40
按键分中断和查询两种方式。
其中查询方式的按键又分阻塞方式(例如delay_ms(10);)和非阻塞方式。

原来如此,受教了
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-12-26 17:14:05 | 显示全部楼层
feilusia 发表于 2016-12-26 17:03
任何外设都耗电。
你说的是时间误差大不大?有误差,不大。

好的,谢谢指教。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
发表于 2016-12-27 10:47:23 | 显示全部楼层
qwerjj 发表于 2016-12-26 16:28
谢谢,问题已解决,额。。我提个疑问,你的程序里while(KEY!=0)这句,如果满足条件也就是松开不就会一直 ...

写错了。。。应该是while(KEY==0)没注意
求指导!!!兄弟
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 03:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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