OpenEdv-开源电子网

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

开源键扫例程--- 无须延时消抖等待,能稳定可靠地一体满足普通、短按(单击/双击)、长按、组合等应用需求的键盘扫描程序

    [复制链接]

0

主题

1

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2022-4-2
在线时间
7 小时
发表于 2022-4-22 10:46:19 | 显示全部楼层
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2022-4-28 22:35:06 | 显示全部楼层
smiler 发表于 2021-5-14 11:25
我还没开始看,不过我有个疑问,如果你加入双击检测,那你的单击响应不是变慢了吗?因为要预留一些时间判断 ...

和电脑的鼠标一样,
有单击和双击,
你觉得相互之间有冲突吗?
有问题可以和我探讨。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
983
金钱
983
注册时间
2020-7-13
在线时间
61 小时
发表于 2022-4-30 08:58:25 | 显示全部楼层
感谢大佬
回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2022-6-19 09:12:23 | 显示全部楼层

客气了,希望对您有用。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

4

主题

31

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1361
金钱
1361
注册时间
2021-5-13
在线时间
91 小时
发表于 2022-7-4 08:53:59 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

7

主题

236

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2019-5-6
在线时间
124 小时
发表于 2022-7-17 14:30:15 | 显示全部楼层
好东西啊
回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2022-7-18 07:41:32 | 显示全部楼层

感谢支持
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

5

主题

292

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1475
金钱
1475
注册时间
2018-11-28
在线时间
196 小时
发表于 2022-10-21 08:40:32 | 显示全部楼层
学习一下,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2022-10-5
在线时间
64 小时
发表于 2022-10-21 10:47:08 | 显示全部楼层
warship 发表于 2018-8-18 20:58
管理回复 编辑支持反对

谢谢分享
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-9-22
在线时间
11 小时
发表于 2022-10-25 16:40:01 | 显示全部楼层
感谢大师共享方案!
回复 支持 反对

使用道具 举报

5

主题

292

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1475
金钱
1475
注册时间
2018-11-28
在线时间
196 小时
发表于 2022-10-31 14:05:50 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-6-17
在线时间
6 小时
发表于 2023-1-16 10:01:24 | 显示全部楼层
666666
回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2023-1-17 11:29:19 | 显示全部楼层

感谢支持,
有问题可以讨论。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2022-11-10
在线时间
14 小时
发表于 2023-1-30 14:48:44 | 显示全部楼层
666,学习中
回复 支持 反对

使用道具 举报

4

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
金钱
489
注册时间
2022-4-4
在线时间
65 小时
发表于 2023-2-13 21:57:49 | 显示全部楼层
你好解压密码是多少
回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2023-5-15 20:27:38 | 显示全部楼层
看起来需要的人不多哦。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2023-5-15
在线时间
0 小时
发表于 2023-5-16 09:15:27 | 显示全部楼层
好好,大家可以看看
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2019-4-24
在线时间
121 小时
发表于 2023-7-11 11:41:20 | 显示全部楼层
学习一下,谢谢
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-4-16
在线时间
0 小时
发表于 2023-7-14 17:44:37 | 显示全部楼层
现在点赞还来得及不
回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2023-7-14 21:37:33 | 显示全部楼层
li371359001 发表于 2023-7-14 17:44
现在点赞还来得及不

谢谢,可以到GITHUB赏星星哦。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2017-12-30
在线时间
40 小时
发表于 2023-7-20 08:41:52 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2017-12-30
在线时间
40 小时
发表于 2023-7-20 08:43:18 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2023-8-15
在线时间
0 小时
发表于 2023-8-15 15:46:26 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-8-7
在线时间
2 小时
发表于 2023-8-19 09:02:30 | 显示全部楼层
厉害了,按键真有人这么执着研究起来。
回复 支持 反对

使用道具 举报

1

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2019-9-27
在线时间
130 小时
发表于 2023-8-20 00:00:52 | 显示全部楼层
大佬,我直接用你的程序改的按键输入口,key0上电就执行一次,这个会是什么原因?
回复 支持 反对

使用道具 举报

1

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2019-9-27
在线时间
130 小时
发表于 2023-8-20 20:23:24 | 显示全部楼层
大佬们,我直接用这个程序修改的,把主芯片改成STM32F103C8T6上电key0会执行一次,你们测试也是这样吗?
回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2023-8-21 11:58:45 | 显示全部楼层
yoko 发表于 2023-8-20 20:23
大佬们,我直接用这个程序修改的,把主芯片改成STM32F103C8T6上电key0会执行一次,你们测试也是这样吗?

具体什么情况呢
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

1

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2019-9-27
在线时间
130 小时
发表于 2023-8-21 20:12:40 | 显示全部楼层
上传了主程序和按键程序部分,我是用OLED12864做的显示,我仿真看了下,程序上电后调用这个key=Read_A_Key();        //得到键值,获取到key=0x17,

key.rar

8.09 KB, 下载次数: 3

按键程序

main.rar

2.32 KB, 下载次数: 2

主程序

回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2023-8-22 06:24:40 | 显示全部楼层
yoko 发表于 2023-8-21 20:12
上传了主程序和按键程序部分,我是用OLED12864做的显示,我仿真看了下,程序上电后调用这个key=Read_A_Key( ...

你是说上电后会凭空多出一个KEY0的按键信息吗?
除此之外,后面是否都可以正常工作呢?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

1

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2019-9-27
在线时间
130 小时
发表于 2023-8-22 12:41:04 | 显示全部楼层
warship 发表于 2023-8-22 06:24
你是说上电后会凭空多出一个KEY0的按键信息吗?
除此之外,后面是否都可以正常工作呢?

是的,其他功能都正常,就是初始的时候会获取到一个key0值,,
回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2023-8-22 15:11:15 | 显示全部楼层
yoko 发表于 2023-8-22 12:41
是的,其他功能都正常,就是初始的时候会获取到一个key0值,,

这个好像是你硬件的问题。
不过,影响不大,
如果除此外,其它都正常的话,
可以在键盘初始化之后,
进入主循环前,
加入        while(Read_A_Key());
这一句,将键盘缓冲区读空。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

1

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2019-9-27
在线时间
130 小时
发表于 2023-8-22 16:08:25 | 显示全部楼层
warship 发表于 2023-8-22 15:11
这个好像是你硬件的问题。
不过,影响不大,
如果除此外,其它都正常的话,

,好的,我再查下,我直接用原子的按键检测程序没有这问题。。。
回复 支持 反对

使用道具 举报

1

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2019-9-27
在线时间
130 小时
发表于 2023-8-22 16:16:28 | 显示全部楼层
谢谢大佬
回复 支持 反对

使用道具 举报

4

主题

31

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1361
金钱
1361
注册时间
2021-5-13
在线时间
91 小时
发表于 2023-10-23 18:03:18 | 显示全部楼层
see  see
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-9-22
在线时间
3 小时
发表于 2023-10-31 20:51:08 | 显示全部楼层
椟槥 干枯 是否得到官方四大 一士大夫
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2014-1-13
在线时间
50 小时
发表于 2023-12-8 11:04:02 | 显示全部楼层
组合按键能不能也像独立按键一样,按下做1个动作,弹起做另一个动作呢?
回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2023-12-8 13:38:53 | 显示全部楼层
hmg6681 发表于 2023-12-8 11:04
组合按键能不能也像独立按键一样,按下做1个动作,弹起做另一个动作呢?

可以的。
组合按键实质上类似一个独立按键。

这里组合按键的定义是:
先按下A键不放,再按B键, 形成A+B的组合按键。
类似于电脑的CtrL+C之类的。

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2014-1-13
在线时间
50 小时
发表于 2023-12-9 15:34:35 | 显示全部楼层
warship 发表于 2023-12-8 13:38
可以的。
组合按键实质上类似一个独立按键。

        if((Cont==(WKUP_ON+KEY0_ON)) && KEY0_PRESSED)       
        {
                Get_Key_State(KB_CLR);
                return WKUP_PLUSKEY0_PRES;
         }

我现在把这一个组合按键修改成下面这样的:
        if((Trg==(WKUP_ON+KEY0_ON))       
        {
                Get_Key_State(KB_CLR);
                return WKUP_PLUSKEY0_PRES;
         }
这样的话,按键就不分哪个先按哪个后按了,目前我的这个项目不需要分前后按的,用Trg做判断,可以在处理动作时只运行1次,这样就达到目的了。
回复 支持 反对

使用道具 举报

32

主题

1940

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4301
金钱
4301
注册时间
2018-5-11
在线时间
895 小时
 楼主| 发表于 2023-12-9 19:08:19 | 显示全部楼层
hmg6681 发表于 2023-12-9 15:34
if((Cont==(WKUP_ON+KEY0_ON)) && KEY0_PRESSED)       
        {
                Get_Key_State(KB_CLR);

不好意思,
时间比较长了,
程序逻辑有些忘了,
你可以按你的思路试一试。

不过,如果不需要分先后的话,
你可以变通一下,
在不改变其它代码的情况下,
既检测在K1按下的情况下按K2,
同时也检测在K2按下的情况下按K1,
把这两种情况统一执行同样操作,
应该也能达到你的目的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2014-1-13
在线时间
50 小时
发表于 2023-12-9 19:43:38 | 显示全部楼层
warship 发表于 2023-12-9 19:08
不好意思,
时间比较长了,
程序逻辑有些忘了,

嗯嗯,现在这样修改,可以实现我的要求了
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2019-2-23
在线时间
80 小时
发表于 2024-1-23 14:17:22 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2020-9-27
在线时间
8 小时
发表于 2024-1-24 09:33:36 | 显示全部楼层
学习一下啊
回复 支持 反对

使用道具 举报

2

主题

3

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2023-10-4
在线时间
5 小时
发表于 2024-2-4 20:50:42 | 显示全部楼层
你好,求解压密码
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2024-2-3
在线时间
5 小时
发表于 2024-2-4 23:00:26 | 显示全部楼层
大佬,我
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2024-2-3
在线时间
5 小时
发表于 2024-2-4 23:37:05 | 显示全部楼层
你好大佬,我把您的key和sys复制到我的工程里面

然后我在key.c里面把初始化改为了GPIOB的1和11引脚
然后硬件按键编码里面改为了俩个

if(!KEY0_IN)         ktmp|=1<<KB_KEY0;
if(!KEY1_IN)         ktmp|=1<<KB_KEY1;

然后把组合按键的宏定义和
if((Cont==(WKUP_ON+KEY0_ON)) && KEY0_PRESSED)        { //WKUP+KEY0组合按键(先按下WKUP再按下KEY0)
Get_Key_State(KB_CLR); //复位状态机,防止本按键对其干扰(本按键与状态机有冲突时请调用此句)
return WKUP_PLUSKEY0_PRES;}
注释掉了

然后下面按模式二也只剩return Get_Key();

在key.h里面
端口和编号那里改成了这样
//按键硬件读端口位置
#define KEY0_IN          PBin(1)                //按键0输入端口
#define KEY1_IN          PBin(11)        //按键1输入端口
//硬件实体按键编号,键态字KeyS_Type依此顺序按位组合,每BIT位对应一个实体按键
#define KB_KEY0                  0
#define KB_KEY1                  1


我的主函数是下面这些              编译提示没有错误,但是就是没反应,我的单片机为stm32f103c8t6,我不知道我改动的地方对不对,想请教一下

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "sys.h"
#include "Key.h"
#include "LED.h"

       
int main(void)
{
       
        /*模块初始化*/
        OLED_Init();                                //OLED初始化
        vu8 key=0;       
        KEY_Init();          //初始化与按键连接的硬件接口
       
        while (1)
        {
                key=Read_A_Key();        //得到键值
                                            
                switch(key)
                {                                 
      //常规一般按键测试(按下键就起作用):
                        case KEY_EVENT(KB_KEY0,PRESS_DOWN):        //KEY0按下即有效,控制...
                        OLED_ShowChar(0, 0, 'A', OLED_8X16);       
                        OLED_Update();
                                break;
                        case KEY_EVENT(KB_KEY1,PRESS_DOWN):        //KEY1按下即有效,控制...
                        OLED_ShowChar(0, 0, 'B', OLED_8X16);       
                        OLED_Update();
                                break;

                }
        }
}

回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2013-1-11
在线时间
1 小时
发表于 2024-2-6 14:01:18 | 显示全部楼层
学习学习,谢谢分享
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2014-1-13
在线时间
50 小时
发表于 2024-2-25 17:44:25 | 显示全部楼层
lenovo9557 发表于 2024-2-4 23:37
你好大佬,我把您的key和sys复制到我的工程里面

然后我在key.c里面把初始化改为了GPIOB的1和11引脚

M0是不支持位带操作的吧?//按键硬件读端口位置
#define KEY0_IN          PBin(1)                //按键0输入端口
#define KEY1_IN          PBin(11)        //按键1输入端口

这个需要修改一下的
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2024-4-24
在线时间
1 小时
发表于 2024-4-24 22:27:47 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-5-29 12:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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