OpenEdv-开源电子网

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

矩阵4x5按键扫描分享

[复制链接]

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1833
金钱
1833
注册时间
2014-6-27
在线时间
981 小时
发表于 2018-1-30 10:24:51 | 显示全部楼层 |阅读模式
最近用到4x5矩阵按键,写了一个扫描程序,分享给大家。

KEY.rar

1.09 KB, 下载次数: 205

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1833
金钱
1833
注册时间
2014-6-27
在线时间
981 小时
 楼主| 发表于 2019-4-20 09:40:39 | 显示全部楼层
hank 发表于 2018-8-16 15:51
用了5ms中断就没有必要使用while(1)了吧

这个是第一次完成就没改过了,也懒得改了,反正有break就行了
回复 支持 0 反对 1

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-1-30 15:10:37 | 显示全部楼层
功能特点呢?可以实现多按,连按,长按短按吗?运行耗时呢?
回复 支持 反对

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1833
金钱
1833
注册时间
2014-6-27
在线时间
981 小时
 楼主| 发表于 2018-1-30 15:25:11 | 显示全部楼层
a496298685 发表于 2018-1-30 15:10
功能特点呢?可以实现多按,连按,长按短按吗?运行耗时呢?

运行耗时可以忽略,你就周期性扫描就行了,比如5MS扫描一次。这个按键多,只用到短按,没有做其他功能,其他功能自己加就行了,你说的功能都做过了。
void scan_key( u8 *key_val)
{
    static u8                   keyValue;
    static u8                   tmp_keyValue;
    static u8                   keyTrigger;
    static u8                   keyKeep;
    static u16                     keyDelayNum;
    static u16                     keyDelayNumValue;
    keyValue = getKeyState(); // 得到按键的物理状态
    while(1)
    {
        if(keyValue != tmp_keyValue)
        {
            tmp_keyValue = keyValue;
            keyDelayNumValue = 10; //设置去抖节拍数
            keyDelayNum = 0;
            keyTrigger = 0;
            keyKeep = 0;
            break;
        }
        else
        {
            if(keyDelayNum < keyDelayNumValue)
            {
                keyDelayNum++;
                break;
            }

        }
        keyTrigger = keyValue & (keyValue ^ keyKeep);
        keyKeep = keyValue;
               
        if(keyValue)
        {

                                                    if(keyTrigger)
                                                    {

                                                            keyDelayNum = 0;
                                                            keyDelayNumValue = 400;//设置长按键节拍数

                                                            //处理短按,得到键值*key_val = x;


                                                            



                                                    }
                                                    else
                                                    {
                                                               //处理长按键和连按键,如果不需要,这里不添加代码
                                                            
                                                    }


        }
        else
        {
            //处理释放后要的键值,如同鼠标单击功能,多击也在这里处理,不需要,直接清键值
             *key_val = NULL;


        }

        break;
    }

}
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-1 08:41:52 | 显示全部楼层
用于项目?
回复 支持 反对

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-7-12
在线时间
21 小时
发表于 2018-8-16 15:51:43 | 显示全部楼层
用了5ms中断就没有必要使用while(1)了吧
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4366
金钱
4366
注册时间
2013-10-5
在线时间
413 小时
发表于 2018-12-20 12:58:49 | 显示全部楼层
谢谢分享,正在学习
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 12:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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