       #include <avr/io.h>
       #include <util/delay.h>
        
       #define GOMB (!(PINB  &   (1<<PB2)))
       #define LEDS_OFF (PORTB &= ~((1<<PB0)|(1<<PB4)))
        
       #define PIROS_ON   (PORTB |=  (1<<PB0))
       #define PIROS_OFF  (PORTB &= ~(1<<PB0))
       #define PIROS      (1<<PB0)
        
       #define KEK_ON   (PORTB |=  (1<<PB4))
       #define KEK_OFF  (PORTB &= ~(1<<PB4))
       #define KEK      (1<<PB4)
         
       void villog1(){
	     LEDS_OFF;
		 
	     unsigned short i, j, l=1;
		 
		 while(l){
		 
		 if(GOMB){_delay_ms(10); l=0;}
		 for(i=0;i<3;++i){
	       PIROS_ON;
		   _delay_ms(80);
           PIROS_OFF;
		   _delay_ms(80);	   
         }
		 _delay_ms(30);
		 for(j=0;j<5;++j){
		   KEK_ON;
		   _delay_ms(80);
		   KEK_OFF;
		   _delay_ms(80);
		 }
		 _delay_ms(30);
		 }
	   } 

	   void villog2(){
         LEDS_OFF;
		 unsigned short m=1;
         while(m){
           if(GOMB) {_delay_ms(10); m=0;}
		   PIROS_ON;
		   _delay_ms(200);
		   PIROS_OFF;
		   _delay_ms(100);
		   KEK_ON;
		   _delay_ms(200);
		   KEK_OFF;
		   _delay_ms(100);
		   
		 }
	   }

	   void villog3(){
         LEDS_OFF;
		 unsigned short n=1;
         while(n){
		   
           if(GOMB) {_delay_ms(10); n=0;}
		   PIROS_ON;
		   KEK_ON;
		   _delay_ms(300);
		   PIROS_OFF;
		   KEK_OFF;
		   _delay_ms(300);
		 }
	   }
       
        
       int main(void) {
	     DDRB |=((1<<PB0) | (1<<PB4) | (0<<PB2));
         PORTB|=(1<<PB2);
		 unsigned int k=0;
         while(1){
           if (GOMB) {
                 _delay_ms(200);
				 ++k;
				 
                   switch (k) {
                         case 1: villog1(); break;
                         case 2: villog2(); break;
                         case 3: villog3(); break;
                        
                   }
           }
           if(k>3) k=0;
         }
       return 0;
       }
