2015-02-06 68 views
-1

目前我在液晶屏上遇到了一些問題。我試着做一個倒數計時器,但是當我設置Hour = 0,Min = 1時,sec命中0,我的小時轉向某個未知的字符,min = 59,sec = 59.我錯過了什麼?8051微控制器液晶倒數計時器

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同意邏輯是錯誤的。您可以考慮採用以下方法在每毫秒刻度處更新所有變量。

此外,我已經分配milli_sec到999考慮到你將設法得到一個16位變量。

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

哦。我現在明白了。哇謝謝你們 – 2015-02-06 09:16:54

+0

@Sunil,@FuFu Alex:注意這裏的例子有點不對。最後一個'else'是錯誤的。這一點將會達到1滴!對「COUNTDOWN REACHED」的檢查必須在減量完成之後,即在大if語句之後。 – 4386427 2015-02-06 10:44:23

+0

@nielsen,謝謝你指出。所以,在每個時間點上,它都會像3-> 2-> 1-> 0 - >「COUNTDOWN已達到0」。實際上,在「COUNTDOWN REACHED TO 0」時,應該在最外層if..else之後進行檢查。例如 if(milli_sec == 0 && second == 0 && minute == 0 && hour == 0 {// COUNTDOWN Delached to 0} – 2015-02-06 11:05:16

0

您有0H : 1M : 0S

你檢查秒,秒是零。您設置了minutes = 0。 您查看分鐘數,現在是0。所以你從幾小時減去1。小時已經是零。所以它可能約65k。

恕我直言,最好只有msecs,並且只有在更新顯示器(如果需要)時才轉換爲hours:minutes:seconds

+0

那麼我應該怎麼做呢?如果我轉換爲msec,它是否仍然能夠顯示我的hh:mm:ss? – 2015-02-06 08:03:15

1

你的邏輯很錯誤。 假設前提:

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

當代碼執行時,你會得到:

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

所以一個滴答中改變了倒計時1秒以上。

請記住,零是一個有效的值!我建議你重寫代碼,以便在遞減之前檢查零

喜歡的東西:

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

哦。我現在明白了。哇謝謝你們 – 2015-02-06 09:17:35