做while循环退出前成熟

时间:2017-01-14 08:43:43

标签: c do-while avr

我已经编写了用于读取开关状态的代码,如果按下#是3次则退出。

void allkeypadTest(void)
{
    static uint8_t modeKeyCount=0;

    do
    {
        uint8_t key=getKeyStatus();
        if(key)
        {
            if(key=='#')
            {
                modeKeyCount++;
                //pulseIODevice(LED1,1,500,200);
            }
            else
            {
                pulseIODevice(LED1,key-0x30,500,200);
            }
        }
     }while(modeKeyCount<3);
}

但是一旦我输入#key一次,循环就会退出。如果按其他键,行为就可以了。但是,如果我取消注释pulseIODevice部分下的if(key=='#'),则行为正常。 pulseIODevice将在特定时间段内将LED切换一定时间并将PWM传递给它。我很困惑我的代码出了什么问题。请注意,如果未检测到密钥,getKeyStatus将返回'\0'(null)并返回1x4键盘的键的ASCII值(ASCII值为3,6,9和#)

2 个答案:

答案 0 :(得分:6)

在检测到键状态后,你可能要等到它恢复正常(没有按键)才能继续

这样做改变

uint8_t key=getKeyStatus();

uint8_t key = getKeyStatus();
while (0 != getKeyStatus())
{
  /* Do nothing. 
     Shouldn't loop too long if not abused by holding the key pressed. */
  /* if available add some milli sec delay here. */
}

更高效,更准确

uint8_t key = getKeyStatus();
if ( 0 != key) 
{
  do 
  {
    /* Do nothing. 
       Shouldn't loop too long if not abused by holding the key pressed. */
    /* If available add some milli sec delay here. */
  } while (0 != getKeyStatus());
}

背景:

要根据定义检测状态变化(此处为“按键”,“按键”)中的事件(此处为“按下键”),您需要多次测试。

答案 1 :(得分:3)

一个可能的原因可能是getkeyStatus()返回&#34;#&#34;当你只按一次时不止一次。键盘设备可能需要一些休眠时间才能清除其缓冲存储器,即只要按下一个键就可以将其存储到多次缓冲区中。

尝试

一个。如果可能的话printf(&#34;%c \ n&#34;,键)并且只按一次并查看打印的次数。

湾如果有任何功能来清除关键功能?或睡眠(x ms)。

℃。当您取消注释pulseIODevice()时,其工作正常可能是由于pulseIODevice()阻塞了几毫秒,此时按下键从键盘缓冲区清除。