|
楼主 |
发表于 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;
}
}
}
你帮我看看还有哪些需要修改的啊 ???
谢谢了
|
|