LEDs schal­ten mit PORT/DDR

Lese­zeit: 4 Minu­ten
Navi­ga­ti­on

Die digi­ta­len und die ana­lo­gen Pins sind in drei Grup­pen auf­ge­teilt:

Funk­tio­nen wie digi­tal­Wri­te() und digi­tal­Read() sind rela­tiv lang­sam in der Aus­füh­rung und manch­mal wer­den Pro­gram­me mit vie­len Ein- oder Aus­gän­gen kom­plex und schwer überschaubar.Deshalb ist es oft über­sicht­li­cher die Pins mit­hil­fe der Ports zu defi­nie­ren und zu schal­ten.

Es exis­tie­ren drei soge­nann­te Regis­ter:

Regis­terFunk­ti­on
DDR(D,B,C)Pins als INPUT = 0 oder als OUTPUT = 1 defi­nie­ren
PORT(D,B,C) Pins als HIGH = 1 oder als LOW = 0 fest­le­gen
PIN(D,B,C)gibt den Zustand der Pins an, die im DDR-Register auf Input gesetzt wur­den

Das Regis­ter wird jeweils mit dem Namen des Ports (D, B oder C) ergänzt.
Beim Zugriff auf die Ports wird jeweils ein Bit gesetzt. Sein Wert ist ent­we­der 1 = an, oder 0 = aus

Bei­spie­le:

Digi­ta­le Pins 7, 6, 5, 4 und 3 als OUTPUT set­zen

DDRD = B11111000;

Digi­ta­le Pins 7, 6, 5, 4 und 3 auf HIGH set­zen:

PORTD = B11111000;

Tas­ter an Pin 13 als INPUT set­zen

DDRB = B00100000;

PULL_UP-Widerstand an Pin 13 ein­schal­ten

PORTB = B00100000;

Schrei­be ein Pro­gramm, in dem zunächst alle LEDs für 200 ms blin­ken, dann die Num­mern 1, 3 und 5 und zum Schluss die bei­den Äuße­ren.

Benö­tig­te Bau­tei­le:

  • 5 LEDs
  • 5 Wider­stän­de > 100 Ω
  • Tas­ter
  • Lei­tungs­dräh­te

Baue die Schal­tung auf:
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

[Lauflicht_Taster]

Wird der Tas­ter gedrückt, leuch­ten alle LEDs, ein erneu­ter Tas­ter­druck schal­tet alle aus.

bool Status = true;
bool TASTER;

void setup() 
{
  // LEDs an 7 bis 3
  DDRD = B11111000;  

  // Taster an 13
  DDRB = B00100000; 

  // PULL_UP-Widerstand einschalten
  PORTB = B00100000;
}

void loop()
 {
   // wenn Status true LEDs einschalten
   if (Status) PORTD = B11111000;
  
   // sonst alle auschalten
   else PORTD = B00000000;
   /*
      PINB → Port B wird gelesen
      PINB & B00100000 vergleicht die Binärzahlen
      nach folgendem Prinzip:
      stimmen die Werte an der Position überein
      -> der Wert bleibt erhalten (0 bleibt 0, 1 bleibt 1)
      sind die Werte unterschiedlich
      -> Bit wird gelöscht (auf 0 gesetzt)
      wenn die Taste nicht gedrückt ist,
      wirkt der PULL_UP-Widerstand
      -> Bit an Pin 13 hat den Wert 1
      Taster gedrückt
      -> Bit hat den Wert 0
   */
   TASTER = (PINB & B00100000);
 
   // TASTER hat den Wert false
   if (!TASTER)
   {
     delay(300);
     
     // Status umkehren 
     Status = !Status;
   }
 }


Ver­wand­te Auf­ga­ben:


Letzte Aktualisierung: 21. Mrz 2020 @ 13:24