我需要一个用C语言编写的精确时间延迟函数,它将pic程序的执行延迟给定的微秒数。我在microchipc.com上找到了一个使用ASM的例子,但代码只允许时钟速度高达32000000.我的时钟速度需要为64000000,但由于我不明白代码是如何工作的,我不能修改它做我所需要的。任何人都可以提供一些代码的解释或建议如何实现类似的东西?在C中延迟了x微秒pic18f
#if PIC_CLK == 4000000
#define DelayDivisor 4
#define WaitFor1Us asm("nop")
#define Jumpback asm("goto $ - 4")
#elif PIC_CLK == 8000000
#define DelayDivisor 2
#define WaitFor1Us asm("nop")
#define Jumpback asm("goto $ - 4")
#elif PIC_CLK == 16000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop")
#define Jumpback asm("goto $ - 4")
#elif PIC_CLK == 20000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop"); asm("nop")
#define Jumpback asm("goto $ - 6")
#elif PIC_CLK == 32000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop")
#define Jumpback asm("goto $ - 12")
#else
#error delay.h - please define PIC_CLK correctly
#endif
#define DelayUs(x) { \
delayus_variable=(unsigned char)(x/DelayDivisor); \
asm("movlb (_delayus_variable) >> 8"); \
WaitFor1Us; } \
asm("decfsz (_delayus_variable)&0ffh,f"); \
Jumpback;
谢谢,我认为这可行,但由于我使用了不同的编译器,我现在不得不改变所有程序集的调用方式...... – Huggzorx 2011-01-20 15:18:59