Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * main.c
- *
- * Created on: 24-11-2015
- * Author: Grzegorz_K
- */
- #include <avr/io.h>
- #include "LCD_graf.h"
- #include "aplikacje_rysujace.h"
- #include <stdio.h>
- #include <util/delay.h>
- #include <avr/interrupt.h>
- #include <stdlib.h>
- #define key (1<<PB0)
- #define UP 1
- #define RIGHT 2
- #define DOWN 3
- #define LEFT 4
- typedef struct{
- int8_t x;
- int8_t y;
- }Punkt;
- typedef struct{
- volatile Punkt *pos;
- Punkt kier;
- volatile uint8_t dir;
- uint8_t dl;
- volatile int8_t dead;
- }Snake;
- typedef struct{
- volatile Punkt pos;
- volatile int8_t state;
- }Food;
- void CtrlSnake(Snake *snake);
- void SnakeMove(Snake *snake,uint8_t dir);
- void DrawSnake(Snake *snake);
- void SnakeCheck(Snake *snake);
- void SnakeGrow(Snake *snake);
- void FoodDraw(Food *food);
- void FoodSet(Food *food,Snake *snake);
- void FoodCheck(Food *food,Snake *snake);
- volatile int8_t kierX=1; // jedynka - prawo zero - lewo
- volatile int8_t kierY=-1; // jeydnka -dol zero -gora
- volatile uint8_t refresh=1;
- volatile Punkt losowe;
- int main(void)
- {
- TCCR0 |= (1<<CS02)|(1<<CS00) ;
- TIMSK |= (1 << TOIE0);
- //timer1 16bitowy do odmierzania czasu
- TCCR1B |= (1 << WGM12); // Ustawia timer w tryb CTC
- OCR1A = 7813/8; // Ustawia wartosc pozadana na 1Hz dla preskalera 1024- 1 sekunda i np /200 czyli mamy 200 hz
- TCCR1B |= (1 << CS12) | (1<<CS10) ; // Ustawia timer z preskalerem Fcpu/1024
- TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC
- sei();
- ///ADC
- ADCSRA =(1<<ADEN)//włączenie przetwornika
- |(1<<ADPS2)|(1<<ADPS1);//preskaler 64
- ADMUX =(0<<REFS1)|(1<<REFS0) ;//napiecie odniesienia VREF to zasilanie uC 5V
- ////LCD
- lcdInit();
- lcdGraphicMode_On();
- lcdGCls();
- Snake snake,*wsksnake=&snake;
- snake.dl=15;
- snake.pos=calloc(snake.dl,sizeof(Punkt));
- snake.pos[0].x=0;
- snake.pos[0].y=30;
- snake.kier.x=1;
- snake.kier.y=0;
- snake.dir=RIGHT;
- snake.dead=0;
- Food food,*wskfood=&food;
- //food.pos.x=losowe.x;
- //food.pos.y=losowe.y;
- FoodSet(wskfood,wsksnake);
- //
- while(!snake.dead)
- {
- CtrlSnake(wsksnake);
- FoodDraw(wskfood);
- if(refresh)
- {
- refresh=0;
- SnakeMove(wsksnake,snake.dir);
- SnakeCheck(wsksnake);
- FoodCheck(wskfood,wsksnake);
- if(!food.state)
- {
- FoodSet(wskfood,wsksnake);
- }
- lcdGCls();
- DrawSnake(wsksnake);
- }
- }
- free((Punkt*)snake.pos);
- }
- ISR(TIMER0_OVF_vect )//obsluga joystika
- {
- uint8_t OsX;
- uint8_t OsY;
- //////odczytywanie pozycji joysticka
- /// os X
- ADMUX |= (1<<MUX2);
- ADMUX &=~(1<<MUX0);//wybor kanału
- ADCSRA |= (1<<ADSC);
- while(ADCSRA & (1<<ADSC));
- OsX=ADC*5/1024;
- /// os Y
- ADMUX |= (1<<MUX2)|(1<<MUX0);//wybor kanału
- ADCSRA |= (1<<ADSC);
- while(ADCSRA & (1<<ADSC));
- OsY=ADC*5/1024;
- if(OsX>2 && OsY>0 && OsY<4){ kierX=1;kierY=0; }; //prawo
- if(OsX<2 && OsY>0 && OsY<4){ kierX=-1;kierY=0;}; //lewo
- if(OsY>2 && OsX>0 && OsX<4){ kierY=-1;kierX=0;}; //gora
- if(OsY<2 && OsX>0 && OsX<4){ kierY=1;kierX=0;}; //dol
- }
- ISR(TIMER1_COMPA_vect )//obsluga joystika
- {
- refresh=1;
- losowe.x+=1;
- losowe.y+=1;
- }
- void FoodDraw(Food *food)
- {
- DrawFSquare(food->pos.x,food->pos.y,1);
- }
- void FoodSet(Food *food,Snake *snake)
- {
- food->pos.x=losowe.x;
- food->pos.y=losowe.y;
- if(food->pos.x<0)food->pos.x=128+food->pos.x;
- if(food->pos.x>125)food->pos.x=128-food->pos.x;
- if(food->pos.y<0)food->pos.y=64+food->pos.y/2;
- if(food->pos.y>63)food->pos.y=64-food->pos.y/2;;
- for(int i=0;i<snake->dl;i++)
- {
- if(food->pos.x==snake->pos[i].x && food->pos.y==snake->pos[i].y )
- {
- food->pos.x=76;
- food->pos.y=33;
- }
- }
- //FoodDraw(food);
- food->state=1;
- }
- void FoodCheck(Food *food,Snake *snake)
- {
- if(snake->pos[0].x==food->pos.x && snake->pos[0].y==food->pos.y)
- {
- //SnakeGrow(snake);
- losowe.x+=3;
- losowe.y+=7;
- food->state=0;
- }
- }
- void CtrlSnake(Snake *snake)
- {
- if(snake->kier.x==0 && snake->kier.y==-1) // jesli jedzie do gory
- {
- snake->dir=UP;
- //SnakeMove(snake,UP);
- //snake->pos.y--; //do gory
- if(kierX==-1 && kierY==0)//skrecic w lewo
- {
- snake->kier.x=-1;
- snake->kier.y=0;
- }
- if(kierX==1 && kierY==0) // skrecic w prawo
- {
- snake->kier.x=1;
- snake->kier.y=0;
- }
- }
- else if(snake->kier.x==1 && snake->kier.y==0) //jesli jedzie w prawo
- {
- snake->dir=RIGHT;
- //SnakeMove(snake,RIGHT);
- //snake->pos.x++;
- if(kierX==0 && kierY==-1)//skrecic w gore
- {
- snake->kier.x=0;
- snake->kier.y=-1;
- }
- if(kierX==0 && kierY==1) // skrecic w dol
- {
- snake->kier.x=0;
- snake->kier.y=1;
- }
- }
- else if(snake->kier.x==0 && snake->kier.y==1) // jesli jedzie w dol
- {
- snake->dir=DOWN;
- //SnakeMove(snake,DOWN);
- //snake->pos.y++; //w dol
- if(kierX==1 && kierY==0) // skrecic w prawo
- {
- snake->kier.x=1;
- snake->kier.y=0;
- }
- if(kierX==-1 && kierY==0)//skrecic w lewo
- {
- snake->kier.x=-1;
- snake->kier.y=0;
- }
- }
- else //if(snake->kierX==0 && snake->kierY==-1) // jesli jedzie w lewo
- {
- snake->dir=LEFT;
- //SnakeMove(snake,LEFT);
- //snake->pos.x--;// w lewo
- if(kierX==0 && kierY==-1)//skrecic w gore
- {
- snake->kier.x=0;
- snake->kier.y=-1;
- }
- if(kierX==0 && kierY==1) // skrecic w dol
- {
- snake->kier.x=0;
- snake->kier.y=1;
- }
- }
- // warunki na brzegach
- if(snake->pos[0].x>126)snake->pos[0].x=0;
- if(snake->pos[0].x<0)snake->pos[0].x=126;
- if(snake->pos[0].y>63)snake->pos[0].y=0;
- if(snake->pos[0].y<0)snake->pos[0].y=62;
- }
- void DrawSnake(Snake *snake)
- {
- for(int i=0;i<snake->dl;i++)
- {
- DrawFSquare(snake->pos[i].x,snake->pos[i].y,1);
- }
- }
- void SnakeMove(Snake *snake,uint8_t dir)
- {
- Punkt *temp;
- temp=calloc(snake->dl,sizeof(Punkt));
- for(int i=0;i<snake->dl;i++)
- {
- temp[i].x=snake->pos[i].x;
- temp[i].y=snake->pos[i].y;
- }
- switch(dir)
- {
- case 1:snake->pos[0].y--;
- break;
- case 2:snake->pos[0].x++;
- break;
- case 3:snake->pos[0].y++;
- break;
- case 4:snake->pos[0].x--;
- break;
- }
- for(int i=0;i<snake->dl-1;i++)
- {
- snake->pos[i+1].x=temp[i].x;
- snake->pos[i+1].y=temp[i].y;
- }
- free(temp);
- }
- void SnakeCheck(Snake *snake)
- {
- for(int i=1;i<snake->dl;i++)
- {
- if(snake->pos[0].x == snake->pos[i].x &&
- snake->pos[0].y == snake->pos[i].y) snake->dead=1;
- }
- }
- void SnakeGrow(Snake *snake)
- {
- Punkt *tmp;
- snake->dl++;
- tmp=realloc((Punkt*)snake->pos,snake->dl*sizeof(Punkt));
- if(tmp)
- {
- snake->pos=tmp;
- }
- else snake->pos[0].x=33;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement