#include <avr/io.h>
#include <stdint.h>

const uint8_t bitLED = 5;
const uint8_t bitSP  = 7;

inline void setbit(volatile uint8_t &reg, uint8_t bit);
inline void clearbit(volatile uint8_t &reg, uint8_t bit);
inline void negbit(volatile uint8_t &reg, uint8_t bit);
inline uint8_t getbit(volatile uint8_t reg, uint8_t bit);
inline void nastavLED(uint8_t stav);
inline void inicializace();
inline uint8_t ctiSP();

int main(void)
{
  inicializace();
	
  while (1)
  {
    if(ctiSP())  //test sepnuteho SP
	{
      nastavLED(1);	  //rozsvit LED
    }
    else
	{
      nastavLED(0);  //zhasni LED
    }
  }
}

//nastaví bit určeného registru:
inline void setbit(volatile uint8_t &reg, uint8_t bit)
{
  reg = reg | (1 << bit);
}

//nuluje bit určeného registru:
inline void clearbit(volatile uint8_t &reg, uint8_t bit)
{
  reg = reg & ~(1 << bit);
}

//neguje bit určeného registru:
inline void negbit(volatile uint8_t &reg, uint8_t bit)
{
  reg = reg ^ (1 << bit);
}

//vrací stav bitu určeného registru:
inline uint8_t getbit(volatile uint8_t reg, uint8_t bit)
{
  return (reg & (1 << bit)) >> bit;
}

//incializace portu B pro LED a tlačítko:
inline void inicializace()
{
  setbit(DDRB, bitLED);  //PB5 je vystup
  setbit(PORTB, bitSP);  //zapne pull-up PB7
}

//řízení LED dle parametru stav:
inline void nastavLED(uint8_t stav)
{
  if(stav != 0)
  {
    setbit(PORTB, bitLED); //PB5 = 1
  }
  else
  {
    clearbit(PORTB, bitLED); //PB5 = 0
  }
}

//čtení stavu tlačítka:
inline uint8_t ctiSP()
{
  return !getbit(PINB, bitSP);
}