硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5184|回复: 2
收起左侧

[有问必答] 请教下,如果在v5的按键历程中增加双击程序功能 ??

[复制链接]

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2016-1-20 10:48:22 | 显示全部楼层 |阅读模式
请教下,如果在v5的按键历程中增加双击程序功能 ??

调试了很久也没有搞成功,望赐教啊 !!!!!!!!!!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107137
QQ
发表于 2016-1-21 09:15:54 | 显示全部楼层
这个可以有,记录下当时按下的时间,两次的时间差在一定范围内就认为是双击。
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2016-1-21 11:10:23 | 显示全部楼层

回 eric2013 的帖子

eric2013:
这个可以有,记录下当时按下的时间,两次的时间差在一定范围内就认为是双击。
请教下,如果在v5的按键历程中增加双击程序功能 ??

调试了很久也没有搞成功,望赐教啊 !!!!!!!!!!!

你好,我是这样修改,程序如下:


#define  KEY_STATE_NUM        (4)    //按键状态数目
typedef enum
{
            KEY_NONE = 0,            /* 0 表示按键事件 */

            KEY_1_DOWN,                /* 1键按下 */
            KEY_1_UP,                /* 1键弹起 */
            KEY_1_LONG,                /* 1键长按 */
            KEY_1_CLOCK_2        ,                /*  按键双击*/
        //   3击
        //   4击    等..... ,程序只需做简单的相关更改就可以了,同时修改 KEY_STATE_NUM 这个对应的数值即可

            KEY_2_DOWN,                /* 2键按下 */
            KEY_2_UP,                /* 2键弹起 */
            KEY_2_LONG,                /* 2键长按 */
            KEY_2_CLOCK_2        ,                /*  按键双击*/


            KEY_3_DOWN,                /* 3键按下 */
            KEY_3_UP,                /* 3键弹起 */
            KEY_3_LONG,                /* 3键长按 */
            KEY_3_CLOCK_2        ,                /*  按键双击*/

            KEY_4_DOWN,                /* 4键按下 */
            KEY_4_UP,                /* 4键弹起 */
            KEY_4_LONG,                /* 4键长按 */
            KEY_4_CLOCK_2        ,                /*  按键双击*/

            KEY_5_DOWN,                /* 5键按下 */
            KEY_5_UP,                /* 5键弹起 */
            KEY_5_LONG,                /* 5键长按 */
            KEY_5_CLOCK_2        ,                /*  按键双击*/

            KEY_6_DOWN,                /* 6键按下 */
            KEY_6_UP,                /* 6键弹起 */
            KEY_6_LONG,                /* 6键长按 */
            KEY_6_CLOCK_2        ,                /*  按键双击*/

}KEY_ENUM;





/*
*********************************************************************************************************
*    函 数 名: bsp_DetectKey
*    功能说明: 检测一个按键。非阻塞状态,必须被周期性的调用。
*    形    参:  按键结构变量指针
*    返 回 值: 无
*********************************************************************************************************
*/

void bsp_DetectKey(uchar i)
{
  static u8 keyK = 0, keyN = 0;    //用于判断按键是双击、三击、四击等判断变量

    KEY_T *pBtn;

    /*
        如果没有初始化按键函数,则报错
        if (s_tBtn.IsKeyDownFunc == 0)
        {
            printf("Fault : DetectButton(), s_tBtn.IsKeyDownFunc undefine");
        }
    */

    pBtn = &s_tBtn;
    if (pBtn->IsKeyDownFunc())
    {
        if (pBtn->Count < KEY_FILTER_TIME)
        {
            pBtn->Count = KEY_FILTER_TIME;
        }
        else if(pBtn->Count < (2 * KEY_FILTER_TIME))
        {
            pBtn->Count++;
        }
        else
        {
            if (pBtn->State == 0)
            {
                pBtn->State = 1;

                /* 发送按钮按下的消息 */
                bsp_PutKey((unsigned char)((KEY_STATE_NUM * i) + 1));
            }

            if (pBtn->LongTime > 0)
            {
                if (pBtn->LongCount < pBtn->LongTime)
                {
                    /* 发送按钮持续按下的消息 */
                    if (++pBtn->LongCount == pBtn->LongTime)
                    {
                        /* 键值放入按键FIFO */
                        bsp_PutKey((unsigned char)((KEY_STATE_NUM * i) + 3));
                    }
                }
                else
                {
                    if (pBtn->RepeatSpeed > 0)
                    {
                        if (++pBtn->RepeatCount >= pBtn->RepeatSpeed)
                        {
                            pBtn->RepeatCount = 0;
                            /* 常按键后,每隔10ms发送1个按键 */
                            bsp_PutKey((unsigned char)((KEY_STATE_NUM * i) + 1));
                        }
                    }
                }
            }
        }
    }
    else
    {
        if(pBtn->Count > KEY_FILTER_TIME)
        {
            pBtn->Count = KEY_FILTER_TIME;
        }
        else if(pBtn->Count != 0)
        {
            pBtn->Count--;
        }
        else
        {
            if (pBtn->State == 1)     // 按钮弹起
            {
                pBtn->State = 0;
                keyK ++;       // 计算 按键抬起的次数
                keyN = 0;    // 按键双击、3击 时间计数清0
                /* 发送按钮弹起的消息 */
                bsp_PutKey((unsigned char)((unsigned char)((KEY_STATE_NUM * i) + 2)));
            }
        }

        pBtn->LongCount = 0;
        pBtn->RepeatCount = 0;
    }


    //====================  双击、3击、4击 判断开始 ========================
    if(keyK >= 2)
    {
            if((++ keyN) >= 150)                //按键松手后1.5s 开始判断,因为是每10ms扫描一次按键所以这里的150x10ms=1500ms
            {
                    switch(keyK)
                    {
                        case 2:                    /* 发送按钮双击的消息   ????????????????????????????????????????????????   */
                                bsp_PutKey((unsigned char)((KEY_STATE_NUM * i) + 4));         //  这个发送双击的键值,不对,比如,我定义双击 向上的键值为4,向下为8,但是这样判断后有可能是16、24、在enter上面                                                                                                                                                                        // 才是4, 但是我的enter定义的双击建值为24,这样貌似全部都乱套了,【其他的如按下、弹起、长安键值都正确】
                            break;

//                        case 4:                    /* 发送按钮4击的消息 */
//                                bsp_PutKey((unsigned char)((KEY_STATE_NUM * i) + 5));        
//                            break;                        
                        // .......

                        default : break;
                    }
                    keyK = keyN = 0;
            }
    }     
}

你帮我看看还有哪些需要修改的啊 ???

谢谢了













回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-20 05:05 , Processed in 0.154823 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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