2015-02-06 6 views
-1

현재 내 LCD 화면에 약간의 문제가 있습니다. 내가 카운트 다운 타이머를하려고하지만 시간 = 0, 최소 = 1을 설정하면 초가 0에 도달하고 시간이 알려지지 않은 문자와 분 = 59, 초 = 59로 바뀝니다. 나는 뭔가를 놓치고 있습니까?8051 마이크로 컨트롤러 lcd 카운트 다운 타이머

void Timer1(void) interrupt 3 
{ 
    TF1 = 0; 
    TH1 = 0xB1; 
    TL1 = 0XE0; 
    cd_msec--; 

    if(cd_msec == 0) 
    { 
     cd_msec = 99; 
     cd_sec--; 
    } 
    if(cd_sec == 0) 
    { 
     cd_sec = 59; 
     cd_min--; 
    } 
    if(cd_min == 0) 
    { 
     cd_min = 59; 
     cd_hour--; 
    } 
    if(cd_hour == 0) 
    { 
     cd_hour = 0; 
    } 
    if(cd_hour == 0 && cd_min == 0) 
    { 
     cd_hour = 0; 
     cd_min = 0; 
    } 
    if(cd_hour == 0 && cd_min == 0 && cd_sec == 0) 
    { 
     cd_hour = 0; 
     cd_min = 0; 
     cd_sec = 0; 
     cd_msec = 0; 
    }  

} 

답변

1

나는 논리가 잘못되었다는 @nielsen에 동의합니다. 밀리 세컨드 틱마다 모든 변수를 적절하게 업데이트하는 접근 방식을 고려해 볼 수 있습니다.

또한, 16 비트 변수를 가져올 수 있다고 생각하여 milli_sec를 999로 지정했습니다.

if (milli_sec > 0) 
{ 
    milli_sec-- 
} else { 
    if (second > 0) { 
     milli_sec = 999; 
     second--; 
    } else { 
     if (minute > 0) { 
      milli_sec = 999; 
      second = 59 
      minute-- 
     } else { 
      if (hour > 0) { 
       milli_sec = 999; 
       second = 59; 
       minute = 59; 
       hour-- 
      } 
      else { 
       //COUNTDOWN REACHED TO 0 
       //hour,minute,second,milli_second is zero 
      } 

     } 
    } 
} 
+0

오. 이제 알겠습니다. 와우 주셔서 감사합니다 –

+0

@ Sunil, @FuFu Alex : 여기 예제는 약간 잘못되었습니다. 마지막으로'else'가 잘못되었습니다. 그 시점은 너무 늦게 1 틱에 도달 할 것입니다! 'COUNTDOWN REACHED'에 대한 확인은 감소가 완료된 후에해야합니다 (예 : 큰 if 문 이후). – 4386427

+0

@nielsen, 지적 해 주셔서 고맙습니다. 따라서 모든 틱에서 3-> 2-> 1-> 0 -> "COUNTDOWN 0에 도달했습니다."와 같이됩니다. 사실, "COUNTDOWN REACHED TO 0"에 대한 것입니다. 예 : if (milli_sec == 0 && second == 0 && minute == 0 && hour == 0 {// 0에 도달 한 카운트) –

0

귀하는 0H : 1M : 0S입니다.

초를 확인하면 초가 0입니다. minutes = 0을 설정했습니다. 분을 확인하면 지금은 0입니다. 따라서 시간당 1을 뺍니다. 시간은 이미 0입니다. 따라서 ~ 65k 정도가 될 것입니다.

IMHO 필요할 경우 디스플레이를 업데이트 할 때만 msecs를 사용하고 hours:minutes:seconds으로 변환하는 것이 좋습니다.

+0

어떻게해야합니까? msec로 변환하면 여전히 hh : mm : ss를 표시 할 수 있습니까? –

1

논리가 잘못되었습니다. 사전 조건을 가정합니다 코드가 실행되면

cd_msec=1; cd_sec=1; cd_min=5; 

을, 당신은 얻을 것이다 :

cd_msec=99; cd_sec=59; cd_min=4; 

그래서 하나의 틱은 1 초보다 더 카운트 다운을 변경했습니다.

0은 유효한 값입니다. 코드를 다시 작성하여 을 확인한 후을 감소 시키도록 제안합니다. 같은

뭔가 :

if (cd_msec > 0) { 
    cd_msec--; 
} 
else 
{ 
    if (cd_sec > 0) { 
    cd_sec--; 
    cd_msec = 99; // Assummes 10ms ticks 
    } 
    else 
    { 
    // Handle case with both cd_msec and cd_sec being zero 
    // ... 
    // .... 
    } 
} 
+0

오. 이제 알겠습니다. 와우 주셔서 감사합니다 –