0 Replies Latest reply on Aug 23, 2011 7:07 PM by wensenyuan

    [资料转发分享]按键矩阵的防抖问题

    Brown Belt

      此程序为矩阵的按键问题,返回的值是按键的左右引脚值

      for(high=0;highmatrix_high;high++)      //矩阵的高度计数
      {
        for(width = 0;width matrix_width;width++)     //矩阵的宽度计数
        {
         Key->pio->Out(Key->width_arry_pin[width],0);   /*Set one width pin as low level */
         if( 0 == Key->pio->Read(Key->high_arry_pin[high]))////读取一个引脚的状态,是低还是高
         {
          #ifdef software_delay
          /*延迟一段时间后再检测是否还是一样的,如果一样表明确实有键按下,返回引脚的值,否则不处理*/
          for(count=0; count<10000; count++);

           if( 0 == Key->pio->Read(Key->high_arry_pin[high]) && 0 == Key->pio->Read(Key->width_arry_pin[width]))
           {
            down_timing = 1;
           if(down_timing)
           {
            wid |= Key->width_arry_pin[width];
            hig |= Key->high_arry_pin[high];
            high_width_pin |= wid;            /* high pin*/
            high_width_pin |= hig<<8;           /* width pin*/
             return high_width_pin;     

           }
          }
         #endif
         
         }
         Key->pio->Out(Key->width_arry_pin[width],1);   /*Set one width pin as high level */
        }
        Key->pio->Out(Key->high_arry_pin[high],1);  /*Set one high pin as high level,reset it */
      }

             本来增加那个for(count=0; count<10000; count++);延时只是为了解除抖动问题,问题还是没有得到解决。

              但是现在出现一个问题,就是我按高度的第一行,宽度的右边的两个键时,返回的值有时候会出现不是自己的引脚值,比如应该是0301,但有时返回的却是0302,这个0302是0301左边的那个按键的值,请大家帮忙指导下,新手上路,多关照,欢迎拍砖。