键盘滤波程序很多, 但是我也不懂那么多。平时也不喜欢看些什么资料, 只喜欢打游戏,不过工作还是需要做的,刚毕业找到工作,就要做个键盘滤波程序,需要实现长按功能的。问了下,老大,他给我推荐了一个增值滤波的方法。原理嘛,就是给每个按键一个缓冲区,当它按下的时候就一直加,当它没按的时候就一直减,这样当有一个按键加到一定程度后就认为它按下了,这时候就可以确定运行这个键的程序了。。。就这么简单???不,还要实现长短按的,怎么实现?肯定跟时间挂钩。所以要定义一个增值时间,当按键没松开的时候这个时间一直加到一定程度,当到达一定要求的时间后键值还是在指定值没有减为0,说明这个按键按下了,执行长按功能呵。下面是程序, 代码很乱,没办法, 我是菜鸟新人。。。就这样吧。。。
//键盘扫描
unsigned char ReadKey(void)
{
unsigned char i;
unsigned char key_in;
//KCOL6_DIS;
for(i = 0 ; i < 6; i++)
{
//KCOL &= ~(0x01 << i);
// write_dipled_buf(7,i);
KCOL_DIS;
switch(i)
{
case 0:
KCOL1_EN;
// KCOL6_DIS;
break;
case 1:
// KCOL1_DIS;
KCOL2_EN;
break;
case 2: // KCOL2_DIS;
KCOL3_EN;
break;
case 3:
// KCOL3_DIS;
KCOL4_EN;
break;
case 4:
// KCOL4_DIS;
KCOL5_EN;
break;
case 5:
// KCOL5_DIS;
KCOL6_EN;
break;
default:
break;
}
if(KROW1 == 0)
{
key_in = 4 * i + 1;
// write_dipled_buf(8,1);
}
else if(KROW2 == 0)
{
key_in = 4 * i + 2;
}
else if(KROW3 == 0)
{
key_in = 4 * i + 3;
}
else if(KROW4 == 0)
{
key_in = 4 * i + 4;
}
else
{
key_in = 0;
}
// write_dipled_buf(10,key_in / 10);
// write_dipled_buf(9,key_in % 10);
/*if the key_in isn't equal to zero ,it mean there must have a key pressed*/
if( key_in )
{
break;
}
}
return key_in;
}
//键盘滤波程序
unsigned char key_press[24];//假设有24个按键
void CheckKey(void)
{
unsigned char cKey;
unsigned char i;
//如果有按键按下
if(!(cBitStateass & bWaitKeyRelease))
{
cKey = ReadKey();
for(i = 0; i < 24 ;i++)
{
if(key_press[i])
{
key_press[i] -= 1;
}
}
//the press key must add one
//按下的那个键+1
if(cKey)
{
key_press[cKey - 1] += 2;
//有按键按下啦
cBitStateass |= bWaitKeyRelease;
}
}
//have key press
//10ms扫描一次键盘
else if(cBitStateTime & b10ms)
{
//这个就是长短按延时哦,最多加到250就够了。
if(cKeyDelay < 250)
{
cKeyDelay++;
}
cKey = ReadKey();
for(i = 0; i < 24 ;i++)
{
if(key_press[i])
{
key_press[i] -= 1;
}
}
//the press key must add one
//当缓冲区值加到8就是上限了, 减到2就认为松开了。这样是可以使松开时间判断减小自己体会去
if(cKey && (key_press[cKey - 1] < 8))
{
key_press[cKey - 1] += 2;
}
//100ms
//长按
if(cKeyDelay >= 200)
{
for(i = 0;i < 24;i++)
{
if((key_press[i] >= 8))
{
if( i == SETTING)
{
}
else if (i == ENTER)
{
}
cKeyDelay = 0;
cSetTimeCount = 6000; //600ms
cNextKeyDelay = 8;
return;
}
}
//长按完吧时间清除
cKeyDelay = 0;
}
//松开判断
else if(cBitStateass & bWaitRelease)
{
for(i = 0; i< 24; i++)
{
if(key_press[i]>=2)
{
return;
}
}
cBitStateass &= ~(bWaitKeyRelease | bWaitRelease);
}
//短按
else if(cKeyDelay >= 10)
{
for(i = 0; i< 24; i++)
{
if(key_press[i]>= 8)
{
cNextKeyDelay = 6;
cSetTimeCount = 6000; //600ms
cSpeakerTime = 5;
Set_Speaker;
cTest++;
if(cTest > 14)
cTest = 0;
KeyProc(i);//按键功能
cBitStateass |= bWaitRelease;
return;
}
}
cBitStateass &= ~bWaitKeyRelease;
//cKeyDelay = 0;
}
else
{
if(cNextKeyDelay == 0)
cBitStateass &= ~bWaitKeyRelease;
}
//break;
}
if(cBitStateTime & b10ms)
{
// LCM_disstr("9",0,0,black);
if(cSetTimeCount > 0)
{
cSetTimeCount--;
if(cSetTimeCount == 0)
{
//ParaSetState = 0;
if(cBitStateKey & bSetting)
{
if(cBitStateKey & bUserSetting)
{
if(cBitStateKey & bInputPara)
{
cBitStateKey &= ~bInputPara;
if(Value_timesel == 0)
Value_press = Value_temp;
else if(Value_timesel == 1)
Value_reless = Value_temp;
else if(Value_timesel == 2)
Value_back = Value_temp;
Value_temp = 0;
}
else if(cBitStateKey & bInputPassword)
{
if(Value_timesel == 0)
{
userPassword1=password;
}
else if(Value_timesel == 0)
{
userPassword2=password;
}
else
{
userPassword3 = password;
}
}
else if(cBitStateKey & bInputSuperPassword)
userPassword = password;
}
else
{
if(cBitStateKey & bInputPara)
{
cBitStateKey &= ~bInputPara;
if(Value_page == PAGE_SettingParameter)
{
if(Value_timesel == 0)
Value_press = Value_temp;
else if(Value_timesel == 1)
Value_reless = Value_temp;
else if(Value_timesel == 2)
Value_back = Value_temp;
Value_temp = 0;
}
else if(Value_page == PAGE_SettingNum)
{
if(Value_timesel == 0)
Value_lnum = Value_temp;
else if(Value_timesel == 1)
Value_vnum = Value_temp;
Value_temp = 0;
}
}
}
}
Value_page = PAGE_Working;
cBitStateKey = 0;
Value_bitsel = 0;
//Value_pwnum = 0;
//LCM_drawjiemian();
//LCM_dis8x16(cKeyVal / 10 + '0',0,0,black);
// LCM_dis8x16(cKeyVal % 10 + '0',0,8,black);
//update_dis();
Flg_function |= flg_LCMrefresh;
}
}
}
}
有些变量你们要自己去设置哦。这些我就不放上去了。。因为我比较懒。。。