2017-01-14 10 views
2

스위치 상태를 읽는 코드를 작성하고 #를 3 번 ​​누르면 종료됩니다.do while loop while pre- maturely

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은 특정 시간에 특정 시간 동안 LED를 토글하고 PWM을 통과시킵니다. 내 코드에서 무엇이 잘못되었는지 당황 스럽다. getKeyStatus은 키가 검색되지 않으면 '\0' (null)을 반환하고 1x4 키패드의 키 (ASCII 값 3, 6, 9 및 #에만 해당)의 ASCII 값을 반환합니다.

+1

'getKeyStatus()'는 아마도 호출간에 재설정되지 않을 것입니까? 그래서 한번 누르면 다시''# ''을 반복해서 할 것입니다. –

+1

'getKeyStatus()'의 코드를 아는 것은 최소한 야생적인 추측없이이 질문에 답하는 것이 중요해 보입니다. – alk

+1

루프가 손가락 끝보다 빠릅니다. :-) – alk

답변

3

가능한 이유는 getkeyStatus "#"한 번만 누르면 한 번 이상 나타납니다. 가능한 키패드 장치가 버퍼 메모리를 지우려면 잠자기 시간이 필요합니다. 즉, 여러 번 가져 오는 버퍼에 키를 저장하자 마자.

시도

a. 가능한 경우 printf ("% c \ n", 키)를 누르고 한 번만 누르면 인쇄 된 횟수가 표시됩니다.

b. 주요 기능을 지우는 기능이 있다면? 또는 수면 (x ms).

c. pulseIODevice()의 주석을 풀면 pulseIODevice()가 키패드 버퍼에서 지워진 키가 눌러 진 시간까지 몇 밀리 초가 걸릴 수 있습니다. 그렇게 변경하려면

에 가기 전에 (어떤 키를 누르면 없음) 다시 정상으로 변경 될 때까지

+0

Perfect. getKeyStatus()에는 50msec의 최대 키 디 바운스 지연이 있습니다. 그래서 키를 누르면 다중 키 누름이 감지됩니다 (손으로 누르는 것은 보통 200 밀리 초가 될 것입니다.이 키는 촉각 키로 길게 누르면됩니다). 지연이 추가되었으며 이제는 정상적으로 작동합니다. – Rajesh

+2

@Rajesh : 그렇다면 키를 길게 누른 다음 무작위로 하드 코드 된 지연으로 코드가 다시 실패합니다. – alk

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

배경 :

이벤트를 감지 (여기에 "누른 키") 두 번 이상 테스트 할 필요가 정의에 의해 ("키 업"여기 "키 다운") 상태의 변화에서.

+0

좋은 아이디어. 지연을 걱정할 필요가 없도록 구현할 것입니다. 우리가 무언가를 늘릴 때와 같이 연속적인 키 동작을 받아 들일 필요가있을 때에 만이 지연으로주의를 기울여야합니다. – Rajesh