брелок с игрой змейка, на attiny44

Нет ответов
xplp
Offline
Зарегистрирован: 21.12.2012

Сделал брелок с игрой змейка на attiny44. 

Код кому интересно:

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

const byte numLed[30][2] = { //какие пины дёргать чтоб загорался определённый светодиод
          {5,0}, //1
          {4,0}, //2
          {3,0}, //3
          {2,0}, //4
          {1,0}, //5
          {0,1}, //6
          {5,1}, //7
          {4,1}, //8
          {3,1}, //9
          {2,1}, //10
          {1,2}, //11
          {0,2}, //12
          {5,2}, //13
          {4,2}, //14
          {3,2}, //15 
          {2,3}, //16
          {1,3}, //17
          {0,3}, //18
          {5,3}, //19
          {4,3}, //20
          {3,4}, //21 
          {2,4}, //22
          {1,4}, //23
          {0,4}, //24
          {5,4}, //25
          {4,5}, //26 
          {3,5}, //27
          {2,5}, //28
          {1,5}, //29
          {0,5}, //30
};

long previousMillis = 0;
long previousMillisSP = 0;

byte i;                  //для циклов
byte j;
byte apl=11;            //яблоко
byte lgth = 1;          //длина змейки
byte _msnake = 0;       //направление движения
byte _snake[30] = {21,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  //голова и хвост змейки
void setup() {                
  
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
}

void sleep(){ 

  for(byte i=0; i<5; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  ADCSRA &= ~(1 << ADEN); // перед сном отключим АЦП
  ACSR |= (1 << ACD); // компаратор
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); 
  sleep_enable(); 
  sleep_cpu(); // спать
  
}

void ledon (byte a, byte f){ //зажигает определённый светодиод
  for(byte i=0; i<7; i++)//очищаем входы
  pinMode(i, INPUT);
  
  pinMode(a, OUTPUT);
  pinMode(f, OUTPUT);
  digitalWrite(a, HIGH);
  digitalWrite(f, LOW);
  delayMicroseconds(35);
 
  for(byte i=0; i<7; i++)//очищаем входы
  pinMode(i, INPUT);
  delayMicroseconds(5);
}

void onLedOne (byte i){ //зажигает только один выбранный светодиод по его номеру
if(i<=30 && i>0){
    i--;
    byte a = numLed[29-i][0];
    byte f = numLed[29-i][1];
    ledon (a, f);
  }
}
void aplRd(){       //генерируем яблоко там где нет хвоста и головы змейки
    do
    {
        i=0;
        apl=random(1,31);
        for(j=lgth+1; j>0; j--){
        if(_snake[j-1]==apl)
          i++;
        }
      }while(i>0);
      
}

void loop() {
if(millis() - previousMillisSP > 5000)//проверяем спать или нет
sleep();

if(millis() - previousMillisSP > 50){    //смена неправления движения кнопками
  
if(digitalRead(7)==HIGH){
      previousMillisSP = millis();
        if(_msnake<3){
          _msnake++;
        }else{_msnake=0;}   
    
  }  
 if(digitalRead(6)==HIGH){ 
      previousMillisSP = millis();
        if(_msnake>0){
          _msnake--;
        }else{_msnake=3;}   
    
  } 
}    


if(millis() - previousMillis > 50)
    {
      previousMillis = millis();
      
      if(_snake[0]==apl){          //если яблоко съели, хвост длиньше, и генерируем другое
          aplRd();          
          lgth++;
      }
      
       for(i=lgth; i>0; i--)      //тащим за собой хвост
        _snake[i]=_snake[i-1];
        
      switch (_msnake) {      //перемещаем змейку
      
        case 0:                    //вверх
          if(_snake[0]<=6){
            _snake[0]+=24;
          }else{_snake[0]-=6;}
        break;
        
        case 1:                    //вправо
          if(_snake[0]%6==0){
            _snake[0]-=5;
           //lgth++;
          }else{_snake[0]+=1;}
          
        break;
        
        case 2:                    //вниз
          if(_snake[0]>24){
            _snake[0]-=24;
          }else{_snake[0]+=6;}
        break;
        
        case 3:                    //влево
          if(_snake[0]%6==1){
            _snake[0]+=5;
          }else{_snake[0]-=1;}
        break;
      
      
      }

      
      for(i=lgth; i>0; i--){          //съеден ли хвост 
          if(_snake[0]==_snake[i]){
              _snake[0]=21;
              _snake[1]=27;
              for(j=1; j<lgth;j++){      //показываем длину хвоста
                onLedOne(j);
                delayMicroseconds(5750);
              }
              lgth=1;
              _msnake=0;
              apl=random(1,19);
              
              //aplRd();
          }
      }

  
}
     for(i=lgth; i>0; i--){     //рисуем хвост
      
          onLedOne(_snake[i]);
      }
    onLedOne(_snake[0]);        //рисуем голову
    onLedOne(apl);              //рисуем яблоко

}

Видео как работает http://youtu.be/QifF4ur5cpU

Корпус