i--;
}
if (i == 0) {
return;
} else {
i--;
}
...
}
给`delay`函数传递的`i`有多大,像这样的语句就有多少条:
if (i == 0) {
return;
} else {
i--;
}
所以注释中说`i=1`,大约延时`10us`完全是有可能的,那我们想实现精确性稍微好点的微秒级延时函数怎么办?
其实这块有很多大神已经帮我们封装好了,我们直接使用即可:
* 延时5us
void delay_5us(void)
{
#pragma ASM
NOP
#pragma ENDASM
}
这就是一个延时5us的函数,只需要在需要延时5us时调用此函数即可。从前面博文《[STC89C52RC单片机额外篇 | 04 - 认识头文件<intrins.h>与\_nop\_函数]( )》可知,`_nop_`函数的执行需要消耗一个机器周期,对于12MHz晶振,就是1us,`_nop_`函数与`NOP`指令是一样的。那为啥函数`delay_5us()`只有一条`NOP`指令就需要5us?
答案是:在调用此函数时,需要一个调用指令,此指令消耗2个周期(即2us);函数执行完毕时要返回主调函数,需要一个返回指令,此指令消耗2个周期(2us)