2

5秒ごとに1ずつ減少するLEDセグメントの数値のコードを書いています

現時点での私の実際のコードはこれです

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。理論的には、同じ手法を使用してセグメントに値を割り当てるので、これは機能するはずです。開始値が8で、7になるはずです。 6、5、4などが0まで続きますが、何らかの理由で8から42になり、そこにとどまります。

私はそれを修正しようとしましたが、不足しています。

どんな助けでも素晴らしいでしょう

ありがとうございました

4

4 に答える 4

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()という関数を作成しました。この関数は、システム時刻をunsignedlonglongとして返します。 (64ビットの符号なし整数である必要があります)。実装は読者次第です。

また、約6億年後にラップアラウンドエラーが発生することにも言及する価値があります。

于 2012-07-16T21:46:20.093 に答える
1

迅速で汚い方法:

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


int values[1];
int check(void)
{
    if (values[0] > 0)
       values[0]--;
}
于 2012-07-16T21:45:31.207 に答える
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 に答える
0

check数であるパラメータを取ってください。次に、プログラムのメインループに、ある値で開始し、チェックが呼び出されるたびにデクリメントされるカウンターを用意します。

check提供された形式では明らかに何も行わないため、現在の関数よりも複雑なことを行っていると思います。より多くの情報を提供していただければ、より徹底的で適切なソリューションを提供することができます。

于 2012-07-16T21:36:31.723 に答える