做 while 循环过早退出

do while loop exiting pre-maturely

我已经编写了读取开关状态的代码,并在按 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);
}

但是只要我输入#键一次,循环就退出了。如果我按其他键,则行为正常。但是,如果我取消注释 if(key=='#') 部分下的 pulseIODevice,行为是正常的。 pulseIODevice 将在特定周期内将 LED 切换特定时间并将 PWM 传递给它。我对我的代码出了什么问题感到困惑。请注意,如果未检测到任何键,getKeyStatus 将 return '[=15=]'(空),并且 return 1x4 键盘键的 ASCII 值(ASCII 值 3、6、9 和# 只)

一个可能的原因可能是 getkeyStatus() return 当您只按一次时,“#”不止一次。键盘设备可能需要一些睡眠时间来清除其缓冲存储器,即只要您按下一个键,它就会存储到缓冲区中,该缓冲区会多次出现。

尝试

一个。如果可能的话 printf("%c\n", key) 然后只按一次,看看打印了多少次。

b。是否有清除关键功能的功能?或者睡眠(x 毫秒)。

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

检测到按键状态后,您可能希望等到它变回正常(未按下按键)后再继续

这样做改变

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());
}

背景:

根据定义,要从状态变化("key down"、"key-up" 此处)检测事件("key pressed" 此处),您需要测试多次。