void Splash() { lcd_init(); struct animStep anim[16]; char name[3]; lcd_set_char(0,(unsigned char*)Aini0); lcd_set_char(1,(unsigned char*)Aini1); lcd_set_char(2,(unsigned char*)Aini2); lcd_set_char(3,(unsigned char*)Aini3); lcd_set_char(4,(unsigned char*)Aini4); lcd_set_char(5,(unsigned char*)Aini5); lcd_set_char(6,(unsigned char*)Aini6); lcd_set_char(7,(unsigned char*)Aini7); int animLength = 13; int i; anim[0] = createStep(6,8,2); anim[1] = createStep(6,8,2); anim[2] = createStep(0,8,2); anim[3] = createStep(1,8,2); anim[4] = createStep(2,8,2); anim[5] = createStep(3,8,2); anim[6] = createStep(4,9,2); anim[7] = createStep(3,10,2); anim[8] = createStep(4,11,2); anim[9] = createStep(3,12,2); anim[10] = createStep(1,12,2); anim[11] = createStep(0,12,2); anim[12] = createStep(7,12,2); name[0] = 'D'; name[1] = 'L'; name[2] = 'L'; for(i = 0; i < animLength; i++) { if(i == 6) { lcd_gotoxy(i+2,2); _lcd_write_byte(5,1); } else if(i > 6 && i < 10) { lcd_gotoxy(i+2,2); _lcd_write_byte(6,1); lcd_gotoxy(i+2,1); _lcd_write_byte(name[i-7],1); } lcd_gotoxy(anim[i].posx,anim[i].posy); _lcd_write_byte(anim[i].sprite,1); _delay_ms(100); } _delay_ms(1000); lcd_clear(); }
int Draw(object* obj, int start) { // make empty array of tiles unsigned char screen[20][4][8]; int a,b,c; for(a = 0; a < 20; a++) for(b = 0; b < 4; b++) for(c = 0; c < 8; c++) screen[a][b][c] = 0; //calculate pixels to be drawn int y,x; for(y = 0; y < obj->h; y++) { for(x = 0; x < obj->w; x++) { screen[(obj->y + y)/CHARH][(obj->x + x)/CHARW][(obj->x + x)%CHARW] |= (1<<((SCREEN_HEIGHT-1-(obj->y + y))%CHARH)); } } // generate sprites and draw int spriteNum = start; for(y = obj->y-(obj->y%CHARH); y < obj->y+obj->h; y+= CHARH) { for(x = obj->x-(obj->x%CHARW); x < obj->x+obj->w; x+= CHARW) { if(spriteNum < 7) { lcd_set_char(spriteNum,(unsigned char*)screen[y/CHARH][x/CHARW]); lcd_gotoxy(y/CHARH, x/CHARW); _lcd_write_byte(spriteNum++,1); } } } return spriteNum; }
/** Write a data byte */ void lcd_write(uint8_t bb) { if (_addrtype == TEXT) { if (bb == '\r') { // CR _pos.x = 0; lcd_xy(_pos.x, _pos.y); return; } if (bb == '\n') { // LF _pos.y++; lcd_xy(_pos.x, _pos.y); return; } _pos.x++; } _lcd_wait_bf(); pin_high(LCD_RS); // select data register _lcd_write_byte(bb); // send data byte }
/** Write a data byte */ void lcd_write_data(uint8_t bb) { _lcd_wait_bf(); pin_up(LCD_RS); // select data register _lcd_write_byte(bb); // send data byte }
/** Write an instruction byte */ void lcd_write_command(uint8_t bb) { _lcd_wait_bf(); pin_down(LCD_RS); // select instruction register _lcd_write_byte(bb); // send instruction byte }
void Breakout() { int i,j; int points = 0; DDRB = 0xFF; PORTB = points; object bricks[4][3]; for(i = 0; i < 4; i++) { for(j = 0; j < 3; j++) { bricks[i][j].x = i; bricks[i][j].y = j+YCHARS-3; bricks[i][j].w = CHARW; bricks[i][j].h = CHARH; bricks[i][j].visible = true; } } // Draw bricks for(i = 0; i < 4; i++) { for(j = 0; j < 3; j++) { lcd_gotoxy(bricks[i][j].y,bricks[i][j].x); _lcd_write_byte(BRICK,1); } } object player = {12,9,7,1,1}; object ball = {15,10,1,1,1}; int ballDX, ballDY; ballDY = 1; ballDX = 1; bool hit = true; bool changed = true; int oldXSquare = ball.x/CHARW, oldYSquare = ball.y/CHARH; while(1) { // if left pressed if(is_pressed(3) && player.x > 0) { // if player pad leaving a screen character if((player.x+player.w)%CHARW == 1) { //overwrite with blank lcd_gotoxy((player.y+player.h-1)/CHARH, (player.x+player.w)/CHARW); _lcd_write_byte(TRANSPARENT,1); } changed = true; player.x--; } //if right pressed if(is_pressed(4) && player.x + player.w < SCREEN_WIDTH) { // if player pad leaving a screen character if(player.x%CHARW == CHARW-1) { //overwrite with blank lcd_gotoxy(player.y/CHARH, player.x/CHARW); _lcd_write_byte(TRANSPARENT,1); } changed = true; player.x++; } ball.y += ballDY; if(ball.y == player.y) { ball.x += ballDX; if(ball.x >= player.x && ball.x <= player.x+player.w) { ballDY *= -1; ball.y += ballDY*2; } } else { if(ball.y/CHARH > YCHARS-4 ) { if(bricks[ball.x/CHARW][YCHARS-(ball.y/CHARH)-1].visible == true) { bricks[ball.x/CHARW][YCHARS-(ball.y/CHARH)-1].visible = false; lcd_gotoxy(ball.y/CHARH, ball.x/CHARW); _lcd_write_byte(TRANSPARENT,1); ballDY *= -1; ball.y += ballDY; points++; PORTB = points; } } ball.x += ballDX; if(ball.y/CHARH > YCHARS-4 ) { if(bricks[ball.x/CHARW][YCHARS-(ball.y/CHARH)-1].visible == true) { bricks[ball.x/CHARW][YCHARS-(ball.y/CHARH)-1].visible = false; lcd_gotoxy(ball.y/CHARH, ball.x/CHARW); _lcd_write_byte(TRANSPARENT,1); ballDX *= -1; ball.x += ballDX; points++; PORTB = points; } } } if(ball.y == SCREEN_HEIGHT-1) ballDY *= -1; if(ball.x == 0 || ball.x == SCREEN_WIDTH-1) ballDX *= -1; if(changed) { Draw(&player, 1); } //DRAW BALL if(ball.x/CHARW != oldXSquare || ball.y/CHARH != oldYSquare) { //Clear ball position //TODO: if leaving CG square lcd_gotoxy(oldYSquare,oldXSquare); _lcd_write_byte(TRANSPARENT,1); oldXSquare = ball.x/CHARW; oldYSquare = ball.y/CHARH; } if(player.y/CHARH == oldYSquare && player.x/CHARW == oldXSquare) ;//Draw(&ball, 1); else if(player.y/CHARH == oldYSquare && (player.x+player.w)/CHARW == oldXSquare) ;//Draw(&ball, 2); else Draw(&ball, 0); if(ball.y <= 0) { _delay_ms(1000); lcd_clear(); lcd_gotoxy(6,2); lcd_puts("You Lost"); _delay_ms(3000); lcd_clear(); break; } else if(points == 12) { _delay_ms(1000); lcd_clear(); lcd_gotoxy(6,1); lcd_puts("You Won!"); _delay_ms(3000); lcd_clear(); break; } //do timeing _delay_ms(100); changed = hit = false; } }
//---------------------------------------------------------------------------------------- // // Zapis danych do wy�wietlacza LCD // //---------------------------------------------------------------------------------------- void lcd_write_data(uint8_t data) { SET_RS; _lcd_write_byte(data); }
//---------------------------------------------------------------------------------------- // // Zapis komendy do wy�wietlacza LCD // //---------------------------------------------------------------------------------------- void lcd_write_cmd(uint8_t cmd) { CLR_RS; _lcd_write_byte(cmd); }