Sisend/väljund pordid
Kaks identset koodinäidet: üks on kirjutatud avr-libc abil, teine AVR C++ Lib's.
avr-libc variant:
#include <avr/io.h> /* Kaks LEDi vilguvad, kui vähemalt üks kahest mikrolülitist on alla vajutatud */ int main() { volatile uint16_t counter; /* PD6 ja PD7 väljundiks */ DDRD |= _BV(PD6) | _BV(PD7); /* Seab sisendid PD2 ja PD3 õigesse sisendirežiimi */ PORTD |= _BV(PD2) | _BV(PD3); // Esimene LED põlema PORTD |= _BV(PD6); // Teine LED ei põle PORTD &= ~_BV(PD7); // Lõpmatu tsükkel while (true) { /* Tekitame viivitust */ for (counter = 0; counter < 10000; counter++) continue; /* Kui vähemalt üks mikrolüliti on alla vajutatud */ if ((PIND & _BV(PD2) ) || (PIND & _BV(PD3) ) ) { // Mõlema väljundi väärtus seada vastupidiseks PORTD ^= _BV(PD6) | _BV(PD7); } } return 0; }
AVR C++ Lib'i variant:
#include <avr/cpp/IO.h> using namespave AVRCpp; /* Väljundid */ typedef OutputPin6<PortD> LED1; typedef OutputPin7<PortD> LED2; /* Sisendid */ typedef InputPin2<PortD> Button1; typedef InputPin3<PortD> Button2; int main() { volatile uint16_t counter; LED1::InitOutput(); LED2::InitOutput(); Button1::InitInput(); Button2::InitInput(); LED1::Set(); LED2::Clear(); while (true) { for (counter = 0; counter < 10000; counter++) continue; if (Button1::IsSet() || Button2::IsSet()) { LED1::Toggle(); LED2::Toggle(); } } return 0; }
Koodi lühiduse huvides veel paar väikest muudatust (et näide parem oleks, on lisatud LED3):
#include <avr/cpp/IO.h> #include <avr/cpp/DiverseIO.h> using namespave AVRCpp; /* Väljundid */ typedef OutputPin6<PortD> LED1; typedef OutputPin7<PortD> LED2; typedef OutputPin0<PortC> LED3; typedef CombinedOutputPins<LED1, LED2, LED3> LEDs; /* Sisendid */ typedef InputPin2<PortD> Button1; typedef InputPin3<PortD> Button2; typedef CombinedInputPins<Button1, Button2> Buttons; int main() { volatile uint16_t counter; LEDs::InitOutput(); Buttons::InitInput(); LED1::Set(); LED2::Clear(); LED3::Set(); while (true) { for (counter = 0; counter < 10000; counter++) continue; if (Buttons::IsAnySet() ) { LEDs::Toggle(); } } return 0; }
CombinedInputPins ja CombinedOutputPins võtavad kuni 8 template parameetrit. Kompilaatori poolt genereeritud masinakoodis ei ole vahet, kas sisend/väljund porte on kasutatud avr-libc abil, AVR C++ Lib's ilma Combined(Input/Output)Pins või AVR C++ Lib's Combined(Input/Output)Pins'dega.