2

我正在为 LED 段上的数字编写代码,每五秒减少 1

我现在的实际代码是这个

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;
}

我使用调度程序每毫秒调用一次函数,理论上这应该可以工作,因为我使用相同的技术为段分配值,发生的情况是我的起始值为 8,它应该得到 7, 6,5,4 依此类推直到 0,但由于某种原因,它从 8 变为 42 并停留在那里

我曾试图修复它,但没有完成。

任何帮助都会很棒

谢谢

4

4 回答 4

1

快速而肮脏的方式:

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


int values[1];
int check(void)
{
    if (values[0] > 0)
       values[0]--;
}
于 2012-07-16T21:45:31.207 回答
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() 的函数,它将系统时间作为 unsigned long long 返回(应该是一个 64 位无符号整数)。实施取决于读者。

还值得一提的是,您将在大约 6 亿年后遇到环绕错误。

于 2012-07-16T21:46:20.093 回答
0

check一个参数,它是数字。然后在程序的主循环中有一个计数器,它从某个值开始,每次调用 check 时都会递减。

我假设您正在做的事情比您当前的check功能更复杂,因为显然它没有以提供的形式做任何事情。如果您提供更多信息,我们将能够为您提供更彻底和适用的解决方案。

于 2012-07-16T21:36:31.723 回答
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;
}
于 2012-07-16T21:48:16.193 回答