2012-07-16 70 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

相关问题