брелок с игрой змейка, на attiny44
- Войдите на сайт для отправки комментариев
Пнд, 16/02/2015 - 21:44
Сделал брелок с игрой змейка на 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