I'm not too familiar with AVR assembly but this looks like it could be improved...
if (p & B01000000) // if the Data In pin (PD6) is HIGH
{
rec += bn; // add bit to received byte
}
bn = bn << 1; // shift to the next bit to receive
You could use rec += 1 and shift rec instead of bn. That way, you might pick up an immediate operand and save a cycle or two. Also try |= instead of +=.
See if you can get rid of that if statement:
rec += (p&B01000000) >> 6;
Not sure which is more expensive, shifting of branching, but it might be worth trying.