liudeee 发表于 2009-6-3 22:38:06

请教版主 关于你的键盘状态机的延时函数

在《深入浅出》中看到版主写的键盘状态机函数
unsigned char Key_service (void)
{
    static unsigned char KeyStatu = Key_Press;
    static unsigned char KeyTimer = 0;
    static unsigned char KeyTmpValue;

    switch (KeyStatu)
    {
      case Key_Press :                //检测按键按下
      {
            if (KeyPin != 0xFF)         //检测是否有键按下
            {
                KeyTmpValue = KeyPin;   //暂存键值
                KeyStatu++;             //如检测到有键按下则翻转处理状态
                KeyTimer = 10;          //初始化抗抖动定时器,抗抖动时间10mS
            }
            break;
      }

      case Key_Bounce :            //抗抖动
      {
            KeyTimer--;
            if (KeyTimer == 0)
            {
                if (KeyPin != KeyTmpValue)      //检测按键是否依然按下
                  KeyStatu = Key_Press;       //按键信号不在了,当作干扰信号丢弃
                else
                  KeyStatu++;
            }
            break;
      }

      case Key_Release :          //等待按键松开
      {
            if (KeyPin == 0xFF)
            {                     //若按键已经释放,则提取键值
                switch (KeyTmpValue)
                {
                  case 0xFE :
                  {
                        KeyStatu = Key_Press;
                        return Key_8;
                        break;
                  }
                  
                  case 0xFD :
                  {
                        KeyStatu = Key_Press;
                        return Key_7;
                        break;
                  }
                  
                  case 0xFB :
                  {
                        KeyStatu = Key_Press;
                        return Key_6;
                        break;
                  }
                  
                  case 0xF7 :
                  {
                        KeyStatu = Key_Press;
                        return Key_5;
                        break;
                  }
                  
                  case 0xEF :
                  {
                        KeyStatu = Key_Press;
                        return Key_4;
                        break;
                  }
                  
                  case 0xDF :
                  {
                        KeyStatu = Key_Press;
                        return Key_3;
                        break;
                  }
                  
                  case 0xBF :
                  {
                        KeyStatu = Key_Press;
                        return Key_2;
                        break;
                  }
                  
                  case 0x7F :
                  {
                        KeyStatu = Key_Press;
                        return Key_1;
                        break;
                  }
                }
                KeyStatu = Key_Press;         //读到的端口状态无法解析
            }                               //End Of "if (KeyPin == 0)"
            break;
      }                                 //End Of " case Key_Release :"
    }                                       //End Of "switch (KeyStatu)"
    return Key_Null;
}


其中
KeyTimer = 10;          //初始化抗抖动定时器,抗抖动时间10mS

KeyTimer--;
相配合,请问这个的原理是不是每次主函数循环到这里的时候就对KeyTimer减一?
也就是说这个函数的延时是用主函数循环10次作为基础的。
如果这样的话 如果主函数很长和很短是不是会影响到延时效果呢?

mfm123 发表于 2009-6-4 08:24:23

这个函数应该是固定1MS调用一次的吧,你在看看

liudeee 发表于 2009-6-4 10:54:54

哦对哦,用定时器10MS调用一次。。

Gorgon_Meducer 发表于 2009-6-5 12:44:47

飘过……

xiaoniu 发表于 2009-6-28 01:45:02

unsigned char Key_service (void)
{
    static unsigned char KeyStatu = Key_Press;
    static unsigned char KeyTimer = 0;
    static unsigned char KeyTmpValue;

    switch (KeyStatu)
    {
      case Key_Press :               
      {
            if (KeyPin != 0xFF)         
            {
                KeyTmpValue = KeyPin;                  
               KeyStatu++;         
                KeyTimer = 10;         
            }
            break;             //是不是在这里跳出switch   那后面的两个case不是没有用了吗



看不懂 后面两个case 程序是怎么进去的

snoopyzz 发表于 2009-6-28 02:41:05

K,4L看看C语言基础方面的书再来吧

switch case你会用吗?
不会用翻书...

NE5532 发表于 2009-7-4 09:35:46

break跳出当前case,后面的case在符合其的条件发生时进去。

sleet1986 发表于 2009-7-12 22:59:28

楼上的,你懂C吗?break是跳出当前case吗?
页: [1]
查看完整版本: 请教版主 关于你的键盘状态机的延时函数