我正在为一个带领的一个号码写一个代码,每五秒减少一次
目前我的实际代码是
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并停留在那里
我曾试图解决这个问题但是做得很短。
任何帮助都会很棒
谢谢
答案 0 :(得分:1)
快速而肮脏的方式:
while(true)
{
check();
sleep(5);
}
int values[1];
int check(void)
{
if (values[0] > 0)
values[0]--;
}
答案 1 :(得分: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()的函数返回系统时间为无符号长long(应为64位无符号整数)。实施取决于读者。
值得一提的是,大约6亿年后你将遇到环绕式错误。
答案 2 :(得分:0)
让check
取一个参数,即数字。然后在程序的主循环中有一个以某个值开始的计数器,并在每次调用check时递减。
我假设您正在做一些比当前check
函数更复杂的事情,因为很明显它在提供的表单中没有做任何事情。如果您提供更多信息,我们将能够为您提供更全面,更实用的解决方案。
答案 3 :(得分: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;
}