Hi Mark, the very simplest way would be in-line code (below). It's not too inefficient The 500ms delay routine depends on the speed you're running at. You might use one of the timers to do it or a counting loop. The WDT could be used, as its timing is based on the internal 31kHz RC oscillator. WDT is affected by Vdd and temperature but it will do if you just want approximate. You might not actually be able to get the WDT period required by simply setting the pre-scaler. It's got a nominal 16ms value (after reset, unchanged by the user) so counting 31 WDT periods would get you in the ballpark Often in my s/w I need various approximate delays. I'll write one that takes perhaps 100us, 1ms or 10ms and call it as many times as necessary to get the total delay needed eg msdelay movlw 0xf6 ;call 100us 10 times movwf cnt1 x10 call delay100 incfsz cnt1 bra x10 return ;100us delay (approx) delay100 movlw 0x7d ;at 16MHz movwf cnt2 incfsz cnt2 bra $-2 return Joe =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D loop bsf D5 call 500delay ;0.5s with LED on bcf D5 call 500delay ;0.5s with LED off bsf D3 call 500delay bcf D3 call 500delay ..... and so on bsf D7 call 500delay bcf D7 call 500delay goto loop ;repeat 500delay Routine which delays for 500ms return ----- No virus found in this message. Checked by AVG - www.avg.com Version: 2016.0.7539 / Virus Database: 4556/12065 - Release Date: 04/19/16 --=20 http://www.piclist.com/techref/piclist PIC/SX FAQ & list archive View/change your membership options at http://mailman.mit.edu/mailman/listinfo/piclist .