#define F_CPU 20000000UL //20 MHz - frekvence #include //I/O knihovny (PORT, DDR) #include //knihovna pro preruseni #define PORT PORTB #define DDR DDRB //Promenne pro diody - smer a posunuti posledniho bitu char smer = 0x00; char posledni_bit = 0x80; //10000000 = posledni bit ISR(INT0_vect) //preruseni od INT0 na Portu D { //smer vlevo if(smer == 0xFF) { //beh hada vlevo PORT = ~ posledni_bit; //PORTB = 01111111 sviti prvni dioda vlevo if(posledni_bit == 0x80)posledni_bit = 0x01; //10000000 -->00000001 jestli bude dioda posledni tak zase zpet na 1. else posledni_bit <<= 1; //jinak posunuj doleva } //smer vpravo if(smer == 0x00) { //beh hada vpravo PORT = ~ posledni_bit; //PORTB = 01111111 sviti prvni dioda vlevo if(posledni_bit == 0x01)posledni_bit = 0x80; //00000001 -->10000000 jestli bude dioda posledni tak zase zpet na 1. else posledni_bit >>= 1; //jinak posunuj doprava } } int main(void) { GIMSK = 0b01000000; //povoli vnejsi preruseni od INT0 - tlacitka DDR = 0xFF; //nastaveni brany B jako vystupni PORT = 0xFF; //zhasnuti diod sei(); //povoleni globalniho preruseni while(1) { //ceka na zmacknuti tlacitka na PD2 if((PIND & 0x03) == 0) // ziskani hodnoty tlacitka na PINU D, jestli se rovna 0 (stisknuto) { //_delay_ms(100); //zpozdeni pro osetreni zakmitu while(((PIND & 0x03) == 0)); //ceka na pusteni tlacitka na PD2 smer = ~smer; //zmena smeru otaceni - negace smeru --> opacny smer } } }