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.