Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <c8051f340.h>
- #include "time.h"
- #include <stdlib.h>
- #include "TFT.h"
- #include "joy.h"
- void OSCILLATOR_Init (void);
- void PORT_Init (void);
- #define INIT_LEN 8
- #define FOOD_SIZE 8
- #define ANCLE_SIZE 6
- #define ANCLE_GAP 2
- #define BACKGROUND_COLOR (0, 0, 0)
- //enum DIRECTION {AHEAD = 0, LEFT = 1};
- typedef struct color {
- byte r;
- byte g;
- byte b;
- } BOJA;
- typedef struct snake {
- char x1;
- char x1_prev;
- char y1;
- char y1_prev;
- BOJA color;
- } ZMIUGALOMA;
- void snake_init(ZMIUGALOMA *malazmia, BOJA color, int *snake_len) {
- int i = 0;
- // -1 da bi zmija pocela od x = 0
- int next_x_pos = (INIT_LEN - 1) * (ANCLE_SIZE + ANCLE_GAP);
- for(i = 0; i < INIT_LEN; i++) {
- (malazmia+i)->x1 = next_x_pos;
- (malazmia+i)->y1 = 64;
- if(i == 0){
- (malazmia+i)->color.r = 255;
- (malazmia+i)->color.g = 0;
- (malazmia+i)->color.b = 0;
- } else {
- (malazmia+i)->color.r = color.r;
- (malazmia+i)->color.g = color.g;
- (malazmia+i)->color.b = color.b;
- }
- // prethodne pozicije su iste sa aktuelnim na samom pocetku
- (malazmia+i)->x1_prev = (malazmia+i)->x1;
- (malazmia+i)->y1_prev = (malazmia+i)->y1;
- next_x_pos -= ANCLE_SIZE;
- next_x_pos -= ANCLE_GAP;
- }
- *snake_len = INIT_LEN;
- }
- void snake_draw(ZMIUGALOMA *malazmia, int snake_len) {
- int i = 0;
- int next_x_pos = 0;
- int exp = 0;
- for(i = 0; i < snake_len ; i++) {
- TFT_setColor BACKGROUND_COLOR;
- // brisemo prethodni kvadratic
- TFT_fillRect(
- (malazmia+i)->x1_prev,
- (malazmia+i)->y1_prev,
- (malazmia+i)->x1_prev + ANCLE_SIZE,
- (malazmia+i)->y1_prev + ANCLE_SIZE
- );
- }
- for(i = 0; i < snake_len ; i++) {
- TFT_setColor(
- (malazmia+i)->color.r,
- (malazmia+i)->color.g,
- (malazmia+i)->color.b
- );
- TFT_fillRect(
- (malazmia+i)->x1,
- (malazmia+i)->y1,
- (malazmia+i)->x1 + ANCLE_SIZE,
- (malazmia+i)->y1 + ANCLE_SIZE
- );
- }
- }
- void snake_redraw_tail(ZMIUGALOMA *malazmia, int snake_len) {
- TFT_setColor BACKGROUND_COLOR;
- TFT_fillRect(
- (malazmia+snake_len-1)->x1,
- (malazmia+snake_len-1)->y1,
- (malazmia+snake_len-1)->x1 + ANCLE_SIZE,
- (malazmia+snake_len-1)->y1 + ANCLE_SIZE
- );
- }
- void snake_move(ZMIUGALOMA *malazmia, char snake_dir, int snake_len) {
- int i = 0;
- int overflow_cnt;
- switch(snake_dir) {
- case 'a': // move ahead
- for(i = 0; i < snake_len; i++) {
- (malazmia+i)->x1_prev = (malazmia+i)->x1;
- (malazmia+i)->y1_prev = (malazmia+i)->y1;
- (malazmia+i)->x1 += (ANCLE_SIZE + ANCLE_GAP);
- if((malazmia+i)->x1 >= 127) {
- overflow_cnt++;
- (malazmia+i)->x1 = overflow_cnt * (ANCLE_SIZE + ANCLE_GAP) ;
- } /*else {
- (malazmia+i)->x1 += (ANCLE_SIZE + ANCLE_GAP);
- } */
- }
- //snake_redraw_tail(malazmia, snake_len);
- break;
- }
- }
- void main(void)
- {
- int joyX, joyY, prevX, prevY;
- bit fire, prevFire;
- //PREPREKE prepreke[OBST_NUM];
- ZMIUGALOMA malazmia[32];
- BOJA color;
- //enum DIRECTION snake_dir;
- char snake_dir = 'a'; // a - ahead, l - left, r - right
- int snake_len;
- color.r = 255;
- color.g = 255;
- color.b = 0;
- PCA0MD &= ~0x40; // Watchdog tajmer iskljucen
- OSCILLATOR_Init(); // Inicijalizacija oscilatora (Fosc = 22.1184 MHz)
- TIME_Init(); // Inicijalizacija sistemskog vremena (koristi se prekid tajmera 2)
- PORT_Init(); // Inicijalizacija portova
- TFT_Init(); // Inicijalizacija displeja
- JOY_Init(); // Inicijalizacija dzojstika
- TFT_clrScr();
- //target();
- snake_init(&malazmia, color, &snake_len);
- //test aplikacija:
- while (1)
- {
- //citanje X pozicije
- prevX = joyX;
- joyX = JOY_ReadX();
- //citanje Y pozicije
- prevY = joyY;
- joyY = JOY_ReadY();
- //citanje stanja tastera
- prevFire = fire;
- fire = JOY_ReadTrigger();
- //move_obstacles();
- if (prevX != joyX || prevY != joyY || fire != prevFire) //doslo je do promene?
- {
- snake_draw(&malazmia, snake_len);
- delay_ms(500);
- snake_move(&malazmia, snake_dir, snake_len);
- }
- }
- }
- void PORT_Init (void)
- {
- P2MDIN |= 0x0F; // 4 najniza bita porta P2 -> digitalni
- P2MDOUT = 0x0C; // Pinovi za LED -> push-pull izlazi
- // Crossbar inicijalizacija
- XBR1 = 0x40; // Dozvola crossbar-a i slabih pull-up otpornika
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement