Arduino Game By LCD
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
|
关于这个项目
需要的零件如上图所示。从未通电的 Arduino 开始。请勿插入 USB 电缆。这将在稍后的步骤中进行,当需要对其进行编程并尝试游戏时。
连接
使用长连接线将Arduino上的5V信号连接到面包板顶部红行的最左侧。
使用长连接线将 GND 信号连接到面包板顶部黑色(或某些面包板上的蓝色)行的最左侧。
LCD(液晶显示器)模块底部有一个 16 针公头。如图所示将其插入面包板。所有为 LCD 供电和控制的电子信号都通过这个接头。
这些引脚是(从左到右):
- GND——电源地信号
- VCC - 正电源信号
- V0 - 对比度调整
- RS - 注册选择
- R/W - 读/写选择
- E - 操作使能信号
- DB0 - 数据位 0(此处未使用)
- DB1 - 数据位 1(此处未使用)
- DB2 - 数据位 2(此处未使用)
- DB3 - 数据位 3(此处未使用)
- DB4 - 数据位 4
- DB5 - 数据位 5
- DB6 - 数据位 6
- DB7 - 数据位 7
- LED+ - 背光 LED 正极
- LED- - 背光 LED 负极
使用短连接线,将 GND 和 LED-(引脚 1 和 16)连接到顶部的黑色行。
同样,用短连接线将 VCC(引脚 2)连接到顶部的红色行。
将220Ω电阻(红-红-棕色带)的导线弯曲,连接在LED+和面包板顶部的红排之间。
使用更长的连接线进行其余的连接:
- 将 DB7 连接到 Arduino 引脚 3
- 将 DB6 连接到 Arduino 引脚 4
- 将 DB5 连接到 Arduino 引脚 5
- 将 DB4 连接到 Arduino 引脚 6
- 将 E 连接到 Arduino 引脚 9
- 将 R/W 连接到 Arduino 引脚 10(或连接到面包板顶部的黑行)
- 将 RS 连接到 Arduino 引脚 11
- 将 V0 连接到 Arduino 引脚 12(或连接到面包板顶部的黑行)
将按钮插入 LCD 屏幕左侧的某个位置,跨越沿面包板中心运行的通道(见上图)。使用短连接线将按钮顶部的两个引脚之一连接到面包板顶部的黑色行。将按钮顶部的另一个引脚连接到 Arduino 的引脚 2。
代码
- LCD_Game.ino
LCD_Game.inoArduino
#include#define PIN_BUTTON 2#define PIN_AUTOPLAY 1#define PIN_READWRITE 10#define PIN_CONTRAST 12#define SPRITE_RUN1 1#define SPRITE_RUN2 2#define SPRITE_JUMP 3#define SPRITE_JUMP'. // 使用 '。'头部字符#define SPRITE_JUMP_LOWER 4#define SPRITE_TERRAIN_EMPTY ' ' // 使用' ' 字符#define SPRITE_TERRAIN_SOLID 5#define SPRITE_TERRAIN_SOLID_RIGHT 6#define SPRITE_TERRAIN_SOLID_LEFT 7#define HEROIN_Horizo n 7#define HEROIN_Horizo n 1在屏幕上的英雄位置#define HEROIN_Horizontal 6 TERRAIN_EMPTY 0#define TERRAIN_LOWER_BLOCK 1#define TERRAIN_UPPER_BLOCK 2#define HERO_POSITION_OFF 0 // 英雄不可见#define HERO_POSITION_RUN_LOWER_1 1 // 英雄跑在下排(pose 1)#define HERO_POSITION_RUN_LOWER_2) //define HERO_POSITION_RUN_LOWER_2) //定义HERO_POSITION_OFF 0 / 开始跳跃#define HERO_POSITION_JUMP_2 4 // 中途#define HERO_POSITION_JUMP_3 5 // 跳跃在上排#define HERO_POSITION_JUMP_4 6 // 跳跃在上排#define HERO_POSITION_JUMP_5 7 // 跳跃在上排#define HERO_POSITION_JUMP_JUMP 8 // 跳跃在上排#define HERO_POSITION_JUMP_7 9 // 中途下降#define HERO_POSITION_JUMP_8 10 // 即将着陆#define HERO_POSITION_RUN_UPPER_1 11 // 英雄跑在上排(pose 1)#define HERO_POSITION_RUN_UPPER_2 12 //(pose 2)LiquidCrystal lcd(11, 9, 6, 5, 4, 3);static char terrainUpper[TERRAIN_WIDTH + 1];static char terrainLower [TERRAIN_WIDTH + 1];static bool buttonPushed =false;void initializeGraphics(){ static byte graphics[] ={ // 运行位置 1 B01100, B01100, B00000, B01110, B11100, B01100, B11010, B10011 // 运行位置B01100,B01100,B00000,B01100,B01100,B01100,B01100,B01110,//跳转B01100,B01100,B00000,B11110,B01101,B11111,B10000,B00000,//跳转下B11110,B01101,B11111,B10000,B00000,B00000 , B00000, B00000, // 接地 B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111, // 右侧接地 B00011, B00011, B000010, B000010, B000010, B000010, B000010, B000010, B000010, B000010, 左侧接地, B11000, B11000, B11000, B11000, B11000, B11000, B11000, };国际我; // 跳过使用字符 0,这允许使用 lcd.print() // 快速绘制多个字符 for (i =0; i <7; ++i) { lcd.createChar(i + 1, &graphics[i * 8]); } for (i =0; i 9999)? 5 :(得分> 999) ? 4 :(得分> 99) ? 3 :(得分> 9) ? 2 :1; // 绘制场景terrainUpper[TERRAIN_WIDTH] ='\0'; TerrainLower[TERRAIN_WIDTH] ='\0'; char temp =terrainUpper[16-digits];地形上[16位] ='\0'; lcd.setCursor(0,0);液晶打印(地形上); terrainUpper[16-digits] =temp; lcd.setCursor(0,1);液晶打印(地形下); lcd.setCursor(16 - 数字,0); lcd.print(分数); TerrainUpper[HERO_HORIZONTAL_POSITION] =upperSave; terrainLower[HERO_HORIZONTAL_POSITION] =lowerSave; return collide;}// 将按钮按下作为中断处理void buttonPush() { buttonPushed =true;}void setup(){ pinMode(PIN_READWRITE, OUTPUT);数字写入(PIN_READWRITE,低); pinMode(PIN_CONTRAST,输出);数字写入(PIN_CONTRAST,低); pinMode(PIN_BUTTON,输入);数字写入(PIN_BUTTON,高); pinMode(PIN_AUTOPLAY,输出);数字写入(PIN_AUTOPLAY,高); // 数字引脚 2 映射到中断 0 attachInterrupt(0/*PIN_BUTTON*/, buttonPush, FALLING);初始化图形(); lcd.begin(16, 2);}void loop(){ 静态字节 heroPos =HERO_POSITION_RUN_LOWER_1;静态字节 newTerrainType =TERRAIN_EMPTY;静态字节 newTerrainDuration =1;静态布尔播放 =false;静态布尔闪烁 =假;静态无符号整数距离 =0; if (!playing) { drawHero((blink) ? HERO_POSITION_OFF :heroPos,terrainUpper,terrainLower,距离>> 3);如果(闪烁){ lcd.setCursor(0,0); lcd.print("按开始"); } 延迟(250);眨眼 =!眨眼; if (buttonPushed) { initializeGraphics(); heroPos =HERO_POSITION_RUN_LOWER_1;播放 =真; buttonPushed =假;距离 =0; } 返回; } // 将地形向左移动 AdvanceTerrain(terrainLower, newTerrainType ==TERRAIN_LOWER_BLOCK ? SPRITE_TERRAIN_SOLID :SPRITE_TERRAIN_EMPTY); AdvanceTerrain(terrainUpper, newTerrainType ==TERRAIN_UPPER_BLOCK ? SPRITE_TERRAIN_SOLID :SPRITE_TERRAIN_EMPTY); // 让新地形进入右侧 if (--newTerrainDuration ==0) { if (newTerrainType ==TERRAIN_EMPTY) { newTerrainType =(random(3) ==0) ? TERRAIN_UPPER_BLOCK :TERRAIN_LOWER_BLOCK; newTerrainDuration =2 + 随机(10); } else { newTerrainType =TERRAIN_EMPTY; newTerrainDuration =10 + 随机(10); } } if (buttonPushed) { if (heroPos <=HERO_POSITION_RUN_LOWER_2) heroPos =HERO_POSITION_JUMP_1; buttonPushed =假; } 如果(drawHero(heroPos,terrainUpper,terrainLower,距离>> 3)){playing =false; // 英雄撞到了什么东西。太糟糕了。 } else { if (heroPos ==HERO_POSITION_RUN_LOWER_2 || heroPos ==HERO_POSITION_JUMP_8) { heroPos =HERO_POSITION_RUN_LOWER_1; } else if ((heroPos>=HERO_POSITION_JUMP_3 &&heroPos <=HERO_POSITION_JUMP_5) &&terrainLower[HERO_HORIZONTAL_POSITION] !=SPRITE_TERRAIN_EMPTY) { heroPos =HERO_POSITION_RUN_UPPER_1; } else if (heroPos>=HERO_POSITION_RUN_UPPER_1 &&terrainLower[HERO_HORIZONTAL_POSITION] ==SPRITE_TERRAIN_EMPTY) { heroPos =HERO_POSITION_JUMP_5; } else if (heroPos ==HERO_POSITION_RUN_UPPER_2) { heroPos =HERO_POSITION_RUN_UPPER_1; } else { ++heroPos; ++距离;数字写入(PIN_AUTOPLAY,terrainLower[HERO_HORIZONTAL_POSITION + 2] ==SPRITE_TERRAIN_EMPTY ?高:低); }延迟(100);}
示意图
没有文件。
制造工艺