PIC Microcontoller Delay Method

by Myke Predko

From: http://www.myke.com/basic.htm

Here is a good, generic Delay Macro that does not change "w" or the STATUS Flag. Note that it assumes that the "DlayCount" variable is equal to zero upon code entry.
DlayMacro Macro Cycles          ;  Delay Macro for Edges
 variable i, TCycles, Value, TFlag
TCycles = Cycles
Value = 1 << 7
i = 7
TFlag = 0
 if (TCycles > 5)
 while (i >= 0)
 if ((TFlag == 0) && ((Value * 3) <= TCycles))
  bsf    DlayCount, i
TFlag = 1
TCycles = TCycles - (Value * 3)
 else
 if ((TFlag != 0) && (((Value * 3) + 1) <= TCycles))
  bsf    DlayCount, i
TCycles = TCycles - ((Value * 3) + 1)
 endif
 endif
Value = Value >> 1
i = i - 1
 endw
 if (TCycles > 3)
 Error "Delay Cycles too Large for Macro"
 endif
  decfsz  DlayCount, f
   goto   $ - 1
 endif
 while (TCycles > 1)
  goto   $ + 1
TCycles = TCycles - 2
 endw
 if (TCycles == 1)
  nop				;  Delay the Last Cycle
 endif
 endm