个人扫键心得

做一个硬件小系统,必要的也是最基本的输入方式就是按键,各种五花八门的按键。从扫键的方式上来说,有独立IO按键,有矩阵扫描按键,有AD按键等;从按键材质上面来说,有机械按键,塑胶按键(导电胶),碳膜/银浆按键。
针对不同情况有不同的选择,例如碳膜按键,塑胶按键这些电阻较大(几百到上千欧),就不适合用AD按键,独立IO按键还是最通用的就是占用太多IO口。啰嗦这么多进入正题,扫键实现主要分两步走:第一步是获得按键当前状态;第二步是按键处理(消抖,短按,长按,弹起)。

获得当前键值 getKeyValue()

独立IO按键

#define IS_KEY0_DOWN()    !P05
#define IS_KEY1_DOWN()    !P06
#define IS_KEY2_DOWN()    !P07  //P05~P07三个按键
u8 get_iokey_value(void)
{
    u8 key_num = NO_KEY;
    if(IS_KEY0_DOWN())
    {
        return 0;
    }
   if(IS_KEY1_DOWN())
    {
        return 1;
    }

    if(IS_KEY2_DOWN())
    {
        return 2;
    }
    retern NO_KEY
}
最基础的IO独立按键,获取键值的一种方法。虽然简单易于理解,但是明显无法满足一些复杂的情景。例如当一个按键Key0被按住的时候,还回去响应Key1吗?

可以尝试用把IO键值与前一次做异或。(以后再修改这段代码)

按键处理(按键消抖,长按,弹起等)

这里写图片描述直接贴代码吧~

    if(cur_key==NO_KEY)
    {//Key up
        if(gKeyCnt>=SHORT_KEY_CNT)
        {//按下时间超过40ms
            if(gKeyCnt>=LONG_KEY_CNT)
            {//长按弹起
                msg = glast_key+20;
                put_msg_fifo(msg + MSG_ACT_00); //推出按键消息
                deg_puts("short key up\n");                     
            }
            else
            {//短按弹起
                msg = glast_key+20;
                put_msg_fifo(msg + MSG_ACT_00); //推出按键消息
                deg_puts("short key up\n");             
            }
        }
        gKeyCnt=0;
    }
    else
    {//key down
        if(cur_key !=glast_key)
        {//IO按下,并且IO变化
            gKeyCnt=0;//重新开始按下计时
        }
        else
        {//IO 按下状态稳定
            gKeyCnt++;
            if(gKeyCnt==SHORT_KEY_CNT)
            {
                msg = cur_key;
                put_msg_fifo(msg + MSG_ACT_00); //推出按键消息
                deg_puts("short key press\n");
            }
            else if(gKeyCnt == LONG_KEY_CNT)
            {//长按时间达到2s
                msg = cur_key+10;//长按消息
                put_msg_fifo(msg + MSG_ACT_00); //推出按键消息
                deg_puts("long key press\n");
            }
            else if(gKeyCnt>=0x0fff)
            {
                gKeyCnt = 0x0fff;//防止溢出
            }
        }
    }
    glast_key = cur_key;//保存前后两次键值

以上,按键处理完全平台无关化。只要得到键值cur_key就可以处理。即可处理短按,长按,短按弹起,长按弹起都可以处理。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Win:打开或关闭开始菜单 Win + Pause:显示系统属性对话框 Win + D:显示桌面 Win + M:最小化所有窗口 Win + L:锁定您的计算机或切换用户 Win + R:打开运行对话框 Win + E:打开我的电脑 Win + F:搜索文件或文件夹 Win + x:打开Windows移动中心 Win + T:切换任务栏上的程序(感觉是和alt+ESC 一样 ) Win + P:选择一个演示文稿显示模式 Win + G:循环切换侧边栏的小工具 Win + U:打开轻松访问中心 Ctrl + Win + F:搜索计算机 Win + 空格:预览桌面 Win + SHIFT + M:还原最小化窗口到桌面上 Win + ←:最大化到窗口左侧的屏幕上 Win + →:最大化窗口到右侧的屏幕上 Win + ↑:最大化窗口 Win + ↓:最小化窗口 Win + Home:最小化所有窗口,除了当前激活窗口 Win+ SHIFT + ↑:拉伸窗口的到屏幕的顶部和底部 Win+ SHIFT + →/←:移动一个窗口,从一个显示器到另一个 Win + TAB:循环切换任务栏上的程序并使用的Aero三维效果 Ctrl + Win + TAB:使用方向键来循环循环切换任务栏上的程序,并使用的Aero三维效果 Ctrl + Win + B:切换到在通知区域中显示信息的程序 Shift + Win + 数字:让位于任务栏指定位置(按下的数字作为序号)的程序,新开一个实例 Ctrl + Win + 数字:让位于任务栏指定位置(按下的数字作为序号)的程序,切换到上一次的活动窗口 ALT + Win + 数字:让位于任务栏指定位置(按下的数字作为序号)的程序,显示跳转清单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值