4

プログラムが GCC AVR コンパイラを使用してコンパイルされていません。これは、マイクロプロセッサと LCD 画面上の小さなゲームです。

move_delay = 200;
_delay_ms( move_delay );

この _delay_ms が変数であることは好ましくありませんが、ADC を介して画面の動作を調整できるため、変数である必要があります。定数にする方法はありますが、ADC で使用できますか?

4

2 に答える 2

5

必要な最小限の遅延を必要なだけ頻繁にループして、必要な他の遅延を取得することで、独自のロールを作成できます。

void my_delay_ms(int ms)
{
  while (0 < ms)
  {  
    _delay_ms(1);
    --ms;
  }
}

_delay_ms()の呼び出しとデクリメントに時間がかかるため、これはおそらく 100% 正確ではありませんms。しかし、ミリ秒が小さい場合は、それで十分かもしれません。

より大きな値については、ms導入できます

void my_delay_ms_10ms_steps(int ms)
{
  while (0 < ms)
  {  
    _delay_ms(10);
    ms -= 10;
  }
}

等々 ...


また、一種の動的アプローチも可能です。

void mydyn_delay_ms(unsigned ms)
{
  unsigned i = 0;
  while (0 < ms)
  {
    if (0 != (ms % 2))
    {
      switch (i)
      {
        case 0:
           _delay_ms(1 << 0);
           break;

        case 1:
           _delay_ms(1 << 1);
           break;

        case 2:
           _delay_ms(1 << 2);
           break;

        /* and so on */

        case <what ever bit-width unsigned uses> -1:
          _delay_ms(1 << (<what ever bit-wdith unsigned uses> -1));
          break;
      }
    }

    ms >>= 1;
    ++i;
  }
}

更新

上記の機能を実装する別の方法は、次のようになります

void mydyn_delay_ms(unsigned ms)
{
  for (
    unsigned i = 0; /* requires at least C99 */
    0 < ms; 
    ++i)
  {
    if (0 != (ms % 2))
    {
      switch (i)
      {
        case 0:
           _delay_ms(1 << 0);
           break;

        case 1:
           _delay_ms(1 << 1);
           break;

        case 2:
           _delay_ms(1 << 2);
           break;

        /* and so on */

        case <what ever bit-width unsigned uses> -1:
          _delay_ms(1 << (<what ever bit-wdith unsigned uses> -1));
          break;
      }
    }

    ms >>= 1;
  }
}
于 2015-05-24T11:32:07.863 に答える