2012-07-16 40 views
2

我正在寫一些代碼對領導segement 1每五秒鐘是否有您可以在C

降低遞減的陣列以週期方式的方式

我此刻的實際代碼是這樣的

FiveSecDelay+=1; 
if (FiveSecDelay ==100) 
{ 
count2--; //decrement count2 

for (uint32_t x = 0; x < 4; x++) //split count to to individual digits 
{ 
new_value[x] = count2 % 10; 
count2 = count2/10; 
} 

for (uint32_t i = 0; i < 4; i++) 
{ 

Segment_Write(Digit[i],new_value[i]); assign value to segments 
} 
FiveSecDelay =0; 
} 

IM使用程序器調用函數中的每條milisecond,在理論上這應該是工作爲我所用相同的技術來分配一個值段, 發生的事情是,我有8起始值,它應該得到7,6,5,4等到0,但由於某種原因,它從8到42,並保持在那裏

我曾嘗試解決它,但都是短暫的。

任何幫助將是巨大的

謝謝

+2

我們需要更多的信息。 C本身只是一種編程語言。你在什麼環境下工作?這是在微處理器上嗎?這是Win32嗎? – 2012-07-16 21:37:01

+0

您的時間混淆了嗎?或者它是如何減少數組中的整數? – Justin 2012-07-16 21:39:21

+0

@user您是否遇到遞減(或)定期調用該函數的問題? – Mahesh 2012-07-16 21:39:22

回答

0
void check() { 
    static int array[] = {142}; // why are you using an array here? 
    (*array)--; 
} 

int main() { 
    while(true) 
    { 
    check(); 
    usleep(5000); // approximate 
    } 
    return 0; 
} 
0

check帶一個參數是多少。然後在程序的主循環中有一個計數器,該計數器以某個值開始,每次調用檢查時遞減。

我假設你正在做一些比你當前的check函數更復雜的事情,因爲顯然它不會在提供的表單中做任何事情。如果您提供更多信息,我們將能夠爲您提供更全面和適用的解決方案。

+0

檢查功能只是一個例子,我試過你的建議,但它沒有工作, – user1175889 2012-07-16 21:41:23

+0

@ user1175889以什麼方式不起作用?你有什麼問題? – Daniel 2012-07-16 21:42:24

+0

我正在做的是控制4個led段,寫入一個值,然後每5秒將該值減1 – user1175889 2012-07-16 21:43:19

1

快速和骯髒的方式:

while(true) 
{ 
    check(); 
    sleep(5); 
} 


int values[1]; 
int check(void) 
{ 
    if (values[0] > 0) 
     values[0]--; 
} 
+0

如果您每次只在循環中遞減一個值,則可以使用靜態int而不是數組。 – peacemaker 2012-07-16 21:49:35

+0

從技術上講,這不會每5毫秒遞減一次數值。這會在每次遞減之間等待5ms。有一個區別。 – Artefact2 2012-07-16 22:06:36

+0

@ Artefact2真的,這就是爲什麼它'快速和骯髒',但它給出瞭如何實現預期結果的想法:) – peacemaker 2012-07-16 22:09:59

1

如果你有機會獲得系統時間,你可以存儲進行呼叫的初始時間,然後在每次查詢它的值時,覈對系統時間確定正確的調整值,和一個小片段來設置值,像這樣:

// initialize 
int check = 142; 
unsigned long long time = getMillis(); 

int get_value(void) 
{ 
    unsigned long long time_factor = ((getMillis() - time)/(unsigned long long) 5); 
    if (time_factor > (unsigned long long) check) 
     return 0; 
    else 
     return check - time_factor; 
} 

void set_value(int v) 
{ 
    check = v; 
    time = getMillis(); 
} 

請注意,我不知道把我的頭如何獲得在C系統時間的頂部(雖然我打賭你需要#include <time.h>)所以我編寫了一個函數getMillis()w它將系統時間作爲無符號long long(應該是64位無符號整數)返回。實施取決於讀者。

另外值得一提的是,在大約6億年後你將會遇到一個環繞錯誤。

+0

哈哈,6億年:P – Scen 2012-07-16 21:48:37

相關問題