极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18165|回复: 4

基于Arduino和5110的复古游戏机

[复制链接]
发表于 2018-4-28 18:17:59 | 显示全部楼层 |阅读模式
本帖最后由 GiroPetrenko 于 2018-4-28 18:21 编辑

一个模拟GB的游戏机,使用Nokia5110当显示屏,Arduino Nano 当主控,目前没有声音。
目前支持一个游戏,PONG
补充:开始部分的logo还没做出来,不过应该没有影响。
[kenrobot_code]#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <EEPROM.h>

// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
#define Firmware_version "Nope"
int keystate;
int player_y = 12;
/*

Key states:
0 Neutral
1 LEFT
2 RIGHT
3 UP
4 DOWN
5 A
6 B

*/
#define NEU 0
#define LEFT 1
#define RIGHT 2
#define UP 3
#define DOWN 4
#define A 5
#define B 6

// Keypad: LEFT A4
//         DOWN A5
//         RIGHT A2
//         UP A3
//         A 9
//         B 10
static unsigned char splashscreen[] = {
0x10, 0x10, 0x92, 0x54,
};



void(* HardRST) (void) = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(A7, INPUT);
  pinMode(A6, INPUT);
  pinMode(A5, INPUT);
  pinMode(A4, INPUT);
  pinMode(10, INPUT);
  pinMode(9, INPUT);
  display.begin();
  display.setContrast(50);
  display.display();
  display.clearDisplay();
  display.println("KirovM-GC");
  display.print("Firmware: ");
  display.print(Firmware_version);
  display.display();
  delay(2000);
  display.clearDisplay();
  display.display();
}

void keyinputmanager() { //Put in loop, reading data constantly.
  if(digitalRead(A3) == HIGH) {
    keystate = UP;
  }
  else if(digitalRead(A2) == HIGH) {
    keystate = RIGHT;
  }
  else if(digitalRead(A5) == HIGH) {
    keystate = DOWN;
  }
  else if(digitalRead(A4) == HIGH) {
    keystate = LEFT;
  }
  else if(digitalRead(9) == HIGH) {
    keystate = A;
  }
  else if(digitalRead(10) == HIGH) {
    keystate = B;
  }
  else {
    keystate = NEU;
  }
}

int Ball_init_x = 42;
int Ball_init_y = 24;

/*
Ball have four state:
1 x--, y-- left up
2 x--, y++ left down
3 x++, y-- right up
4 x++, y++ right down
Ball x state:
1 going left x--
2 going right x++

Ball y state:
1 going up y--
2 going down y++


*/

int ball_x_state = 1;
int ball_y_state = 1;

int enermy_x_pos = 82;
int enermy_y_pos = 2;

int delay_speed = 60;
int timePassed;

int HighScore;

void loop() {
  keyinputmanager();
  display.clearDisplay();
  display.setCursor(0, 0);
  timePassed = millis()/1000;
  display.print(String(timePassed));
  if(timePassed > 15) {
    delay_speed = 65;
  }
  else if(timePassed > 30 ) {
    delay_speed = 60;
  }
  else if(timePassed > 45) {
    delay_speed = 55;
  }
  display.drawLine(0, 8, 84, 8, BLACK);
  display.drawLine(1, player_y, 1, player_y + 10, BLACK);
  display.drawLine(enermy_x_pos, enermy_y_pos, enermy_x_pos, enermy_y_pos + 15, BLACK);
  if(enermy_y_pos + 2 > Ball_init_y && enermy_y_pos > 10) { //AI control start
    enermy_y_pos = enermy_y_pos - 2;  //AI go up
  }
  if(enermy_y_pos + 2 < Ball_init_y && Ball_init_y < 33) {
    if(Ball_init_y > 33) {
      enermy_y_pos = enermy_y_pos - 2;
    }
    else {
      enermy_y_pos = enermy_y_pos + 2;
    }
  } //AI control end
  
  if(keystate == DOWN && player_y <= 38) { //playercontrol
    player_y = player_y + 1;
  }
  else if(keystate == UP && player_y >= 8) {
    player_y = player_y - 1;
  }

  if(keystate == A) {
    display.clearDisplay();
    display.println("Scoreboard\ncleared");
    EEPROM.write(1, 0);
    display.display();
    delay(2000);
    HardRST();
    exit(0);
  }
  if(keystate == LEFT) {
    delay_speed--;
  }
  if(keystate == RIGHT) {
    delay_speed++;
  }

  display.fillRect(Ball_init_x, Ball_init_y, 2, 2, BLACK);
  if(ball_x_state == 1 && Ball_init_x > 0) {     //Ball movement
    Ball_init_x--;
  }
  if(ball_y_state == 1 && Ball_init_y > 8) {
    Ball_init_y--;
  }
  if(ball_x_state == 2 && Ball_init_x > 0) {
    Ball_init_x++;
  }
  if(ball_y_state == 2 && Ball_init_x > 0) {
    Ball_init_y++;
  }


  if(Ball_init_y > player_y && Ball_init_y < player_y + 10 && Ball_init_x < 2) { //in range
    ball_x_state = 2; //Bounce Back
  }
  
  if(Ball_init_x < 1) {  //Left-most corner
    // player lose
    display.println(" You lose!");
    display.display();
    HighScore = EEPROM.read(1);
    if(HighScore > timePassed) {
      display.print("Highest score: ");
      display.println(String(HighScore));
    }
    else {
      display.println("New High!");
      EEPROM.write(1, timePassed);
    }
    display.display();
    exit(0);
  }

  if(Ball_init_x > 83) {
    display.println(" You win!");
    display.display();
    display.println(" You lose!");
    display.display();
    HighScore = EEPROM.read(1);
    if(HighScore > timePassed) {
      display.print("Highest score: ");
      display.println(String(HighScore));
    }
    else {
      display.println("New High!");
      EEPROM.write(1, timePassed);
    }
    display.display();
    exit(0);
  }

  if(Ball_init_x > 81 && Ball_init_y > enermy_y_pos && Ball_init_y < enermy_y_pos + 17) {
    //Bounced Back
    ball_x_state = 1;
  }

  
  if(Ball_init_y <= 8) {  //Up most corner
    // bounce
    ball_y_state = 2;
  }
  if(Ball_init_y >= 47) { //Hit the bottom!
    ball_y_state = 1;
  }
  
  display.display();
  delay(delay_speed);
}[/kenrobot_code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2018-4-28 22:07:37 | 显示全部楼层
呵呵,这就是情怀
回复 支持 反对

使用道具 举报

发表于 2018-4-28 22:29:49 | 显示全部楼层
我的厚GB还在,还能正常用,GB卡口袋玩了96小时的存档还在~
回复 支持 反对

使用道具 举报

发表于 2018-5-1 00:20:07 | 显示全部楼层
本帖最后由 野子yz 于 2018-5-1 00:22 编辑

上次就想做个任天堂的红白机,可惜网上的资料太少,本身的实力不足,难以开发,说实话,你的这个项目让我有了启发,很棒!
回复 支持 反对

使用道具 举报

发表于 2018-5-3 11:08:36 | 显示全部楼层
5110的屏幕玩贪食蛇也很情怀哈
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-6 14:30 , Processed in 0.041087 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表