Буфер для вывода имеет смысл вводить, если требуется какая-либо синхронизация вывода или TRIS меняется в процессе. Здесь же достаточно:
Код
#define TRISD_MASK 0b01010101 // для разнообразия
#define PORTD_INVERSION_MASK (0b00001010 & ~TRISD_MASK) // инвертируем 1 и 3 биты
PORTD ^= PORTD_INVERSION_MASK;
static unsigned char flag; должен быть volatile, иначе if (flag == 1) { flag = 0; ... } в примере будет соптимизировано напрочь.