プログラムが GCC AVR コンパイラを使用してコンパイルされていません。これは、マイクロプロセッサと LCD 画面上の小さなゲームです。
move_delay = 200;
_delay_ms( move_delay );
この _delay_ms が変数であることは好ましくありませんが、ADC を介して画面の動作を調整できるため、変数である必要があります。定数にする方法はありますが、ADC で使用できますか?
必要な最小限の遅延を必要なだけ頻繁にループして、必要な他の遅延を取得することで、独自のロールを作成できます。
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;
}
}