Shiftregister in C realisieren

Gast #276217
Lesenswert?

Hallo, ich wollte fragen, ob mein nachfolgender Code einem Shiftregister
gleichkommt... ist grad etwas spät und ich bin mir nicht wirklich sicher
ob das so klappt... das Shiftregister soll vom MSB zum LSB durchgehen...
falls jemand einen besseren Vorschlag hat bin ich dafür gerne offen...
1
  for(int i=7;i>=0;i--)
2
  {
3
    if(Data & (1<<i)
4
    {
5
      PORTB |= (1<<PB3);
6
    }
7
    else
8
    {
9
      PORTB &= ~(1<<PB3);
10
    }
11
  }
Mfg Chris
#276220
Lesenswert?

Im Prinzip geht das schon.

(Du moechtest die 8 Bits aus Data seriell an PB3
'hinaustakten' )

1 << i  ist aber auf vielen Prozessoren ein
Zeitfresser, da die meistens nur um eine Stelle shiften
koennen. Der Compiler implementiert dann sowas wie

    unsigned char Tmp = 1;
    for( int j = 0; j < i; ++j )
      Tmp = Tmp << 1;

Das geht auch einfacher:
Du willst von Data immer das 7. Bit abnehmen und shiftest
Data immer um eine Stelle unter diesem 7. Bit durch:

  unsigned char Temp = Data;

  for( int i = 0; i < 8; ++i ) {

    if( Temp & 0x80 )
      PORTB |= (1<<PB3);
    else
      PORTB &= ~(1<<PB3);

    Temp = Temp << 1;
  }
Gast #276221
Lesenswert?

/*
oder anderherum:

  unsigned char Temp = 0x80;

  while(Temp){

    if( Data & Temp )
      PORTB |= (1<<PB3);
    else
      PORTB &= ~(1<<PB3);

    Temp /= 2;
  }

oder noch kürzer:
  unsigned char Temp = 0x80;
  do
    if( Data & Temp )
      PORTB |= (1<<PB3);
    else
      PORTB &= ~(1<<PB3);
  while(Temp /= 2);   //solange wiederholen, bis das Bit weg ist
//while(Temp >>= 1);  //ginge auch

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren