Цитата(HarieR @ May 5 2010, 12:42)

переписал с учетом советов:
...
не работает

Где и какие советы Вы учли, не понял.
Ваш код может сделать только PORTD = 0xFF, но не наоборот. Уберите temp за ненадобностью (PORTD и так объявлен volatile) и напишите PORTD ^= 0xFF, как советовали, или PORTD = ~PORTD - в Вашем случае (TRISD=0b00000000;) без разницы.
delay_ms() в прерывании (да и вообще) - имхо, моветон.