Hallo Patrick,

Etwas Software brauchst du dazu schon.

Du brauchst für jedes Bit einen Timer. Das kannst du mit einem Timer-Interrupt machen, welcher z.B. alle 1ms aufgerufen wird.
Wenn die Timer >0 wird der Wert jedes Mal um 1 verringert.

Wenn du PORTD einliest, wird jedes Mal für eine gelesene 1 der entsprechende Timer mit 200 beschrieben.

Für die Ausgabe musst für jeden Timer welcher >0 eine 1 ins entsprechende Bit setzen.

So in der Art (nicht getestet):
Code:
unsigned char timer[8];

void interrupt(void)
  {
     char i;

     for (i = 0; i < 8; i++)
       {
          if (timer[i]) timer[i]--;
       }
  }

void out(void)
  {
    char i;
    unsigned char x = 0;

     for (i = 0; i < 8; i++)
       {
          if (timer[i]) (x |= (1 << i));
       }
      i2c_write (x); 
  }

unsigned char in(void)
{
    unsigned char x;
    char i;

     x = PORTD;
     for (i = 0; i < 8; i++)
       {
          if (x & (1 << i)) timer[i] = 200;
       }
}
Kann Reste von Tippfehlern enthalten.

MfG Peter(TOO)