一个比较复杂的键盘滤波程序

键盘滤波程序很多, 但是我也不懂那么多。平时也不喜欢看些什么资料, 只喜欢打游戏,不过工作还是需要做的,刚毕业找到工作,就要做个键盘滤波程序,需要实现长按功能的。问了下,老大,他给我推荐了一个增值滤波的方法。原理嘛,就是给每个按键一个缓冲区,当它按下的时候就一直加,当它没按的时候就一直减,这样当有一个按键加到一定程度后就认为它按下了,这时候就可以确定运行这个键的程序了。。。就这么简单???不,还要实现长短按的,怎么实现?肯定跟时间挂钩。所以要定义一个增值时间,当按键没松开的时候这个时间一直加到一定程度,当到达一定要求的时间后键值还是在指定值没有减为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;
}
      }
    }


}


有些变量你们要自己去设置哦。这些我就不放上去了。。因为我比较懒。。。

猜你喜欢

转载自blog.csdn.net/xuzhenglim/article/details/6859998