我的程序没有使用GCC AVR编译器编译。这是微处理器和液晶屏上的小游戏。
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()
和减少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;
}
}
更新:
继vaxquis comment之后,实现上述功能的另一种方法是:
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;
}
}
如果在#include语句之前使用以下定义,则还可以使用变量而不是数字常量调用延迟函数:
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
/************************************************************************
* Function: sound
* Description: Toggle Port to generate sound with a given pulse width.
* Parameter: duration, pulsewidth
* Uses: _delay_us()
************************************************************************/
void sound(uint16_t duration, uint16_t pulsewidth) {
uint16_t i;
uint16_t j = 2270 * duration/pulsewidth;
for(i=0; i<j; i++) {
SPKR_PORT |= (1 << SPKR_PAD); //Set port -> create bit mask and OR it
//delay
_delay_us(pulsewidth);
SPKR_PORT &= ~(1 << SPKR_PAD); //clear port -> negate mask and AND it
//delay
_delay_us(pulsewidth);
}
}