当前位置:  开发笔记 > 编程语言 > 正文

做while循环退出前成熟

如何解决《做while循环退出前成熟》经验,为你挑选了1个好方法。

我已经编写了用于读取开关状态的代码,如果按下#是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一次,循环就会退出.如果按其他键,行为就可以了.但是,如果我pulseIODeviceif(key=='#')部分下取消注释,行为是正常的.pulseIODevice将在特定时间段内将LED切换一定时间并将PWM传递给它.我很困惑我的代码出了什么问题.请注意,如果未检测到任何键,getKeyStatus则返回'\0'(null)并返回1x4键盘键的ASCII值(ASCII值为3,6,9和#)



1> alk..:

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

要做这样的改变

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

背景:

要根据定义从状态的变化("按下键","键入")检测事件(此处"按下"键),您需要多次测试.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有