需求改进&原型设计
1. 需求&原型改进
1.1硬件部分(1) 硬件部分分为主机和遥控器,分别由两个单片机进行控制。(2) 单片机1:负责显示游戏的界面。使用数码管显示当前得分,使用不同颜色LED灯表示游戏过程中和游戏结束,使用液晶屏显示界面,这个液晶的界面包括显示游戏区域、下一个方块、得分、排行榜。另外还配有蜂鸣器,当方块可以消除一行或多行的时候,蜂鸣器鸣响一秒;当游戏结束的时候,蜂鸣器鸣响三秒。(3) Ampire12864液晶:本程序所选择的LCD是AMPIRE128×64的汉字图形型液晶显示模块,可显示汉字及图形。(4) 单片机2::负责控制遥控器操作。按键除去复位按键之外有六个:确定,左,右,加速,旋转,暂停。用户只需要操作遥控器则可进行游戏。用户根据按下“左,右”键来控制降落方块的位置和形状;通过按下“加速”键加速降落方块的移动;通过按下“旋转键”来控制降落方块的形状。(5) 通信:主机与遥控器之间使用 I2C 通信,实现遥控器控制方块的移动及旋转。这个I2c通信使用at24c02芯片作为中介,主要通过I2C通信把信息发给e2prom暂时保存起来,然后e2prom也使用i2c通信方式把信息发送给另外一个单片机。I2C通信是硬件部分的亮点。(6) AT24C02芯片:排行榜和通信都有用到AT24C02芯片,记录所有在该程序进行游戏的得分数据,即使是断电,得分数据依然保存在e2prom存储器中。AT24C02芯片简介:AT24C02为I2C总线串行EEPROM储存器,它的存储容量为4k位(4096位),存储器的内部结构为512×8位,芯片具有写保护,可靠性高,擦写次数可达100万次,数据断电保存100年不变。1.2. 软件部分(1) 降落的方块真正的随机化,可以实现随机降落不同形状的方块。并且可以在屏幕上显示下一个。(2) 降落的方块不可以越过障碍方块。当已落下的方块高度超过屏幕高度的时候游戏结束。(3) 当已落下的方块之间填满一行或多行的时候,则可以得到相应的得分,当消去1行的时候得1分;消去2行得2分;当同时消去3行的时候,得到6分;同时消去4行的时候,得到8分。 (4) 实现多种关卡,不同的起始情况,第二关加快了游戏速度和增加了障碍方块。在达到指定分数后显示胜利标题,并切换进入下一关卡。(5) 降落的方块在越过一定位置的时候有几率切换方块的形状,以此来增加游戏难度和丰富游戏内容,增加可玩性。(6) 实现了排行榜,得分数据通过i2c通信方式写进e2prom存储器中。
2. 系统设计
2.1. 总流程
(1) 程序初始化部分a) 程序一开始就启动定时器,但是没有开中断,为了通过定时器获取随机数种子,而且只有在游戏进入按键循环的时候才需要靠中断来控制方块下降和刷新游戏区域。b) LCD液晶也初始化,开屏幕显示、开光标、设置显示起始行、设置页地址、列地址。c) I2c的数据线和时钟线拉高,随时准备通信。d) 控制数码管显示分数零。(2) 游戏主体a) 按键循环,获取按键信息控制方块的移动旋转快速下降和游戏暂停。b) 当程序检测游戏结束或者得分超过指定分数的时候,分别设置游戏结束标志位和过关标志位,while循环检测到这两个标志位就退出按键循环。c) 如果是游戏结束标志位,则新一轮游戏速度不变、没有障碍方块,如果是过关标志位,则加快游戏速度、设置障碍方块。 2.2. I2C通信两个单片机之间使用i2c通信。一般单片机之间不适用i2c通信,因为单片机本身不具备i2c总线接口,所以只能根据I2c协议模拟时序进行通信。初步设想单片机2负责把按键数据使用i2c通信方式发送到e2prom的固定地址,然后e2prom也使用i2c通信把信息传给单片机1,然后单片机1把一个无关数据放回该地址通知单片机2已经收到了数据。
2.3数据存储
1. 使用I2c通信和e2prom AT24C02芯片存储数据。
2. 单片机2的按键数据通过i2c通信写进e2prom的特定地址,单片机1每次需要按键数据的时候就通过这个地址取得数据。3. 游戏初始化的时候,使用i2c通信方式读取e2prom中的分数排名信息,然后将排行榜显示在液晶上面。4. 游戏结束的时候,使用i2c通信方式读取e2prom中保存的得分排名数据,判断得分是否能进排行榜,如果能则把数据i2c通信写进e2prom。 2.4 编码使用编码的思想。将方块数据编码为unsigned int两个字节16位类型,16位代表4*4,刚好可以代表一个方块,并且每一位(也就是方块的每一个方格点)代表液晶的4*4的像素点。游戏区域编码为一个unsigned int数组,数组元素为16个,也就是16行,每一位也代表液晶的4*4像素点。16个整型数组就代表的整个游戏区域,能代表液晶游戏部分40*64的像素点。所有的游戏操作移动旋转、判断覆盖、消行、游戏结束等等全部进行编码成整形数据,直接对这个数组操作,而不是直接对液晶操作。 2.5解码每隔一定时间将游戏区域数据进行解码,反应在液晶上面。由于液晶每次写数据都是在某一页的某一列写一个字节,也就是竖的八行,写数据是字节倒序的,方块方格点代表液晶的4*4像素点,所以每次读取编码的竖着的两位(方格点),若是11,则在液晶部分依次写1111 1111, 1111 1111, 1111 1111, 1111 1111。若是10,则在液晶部分依次写0000 0000,0000 0000,1111 1111, 1111 1111。若是01,则在液晶部分依次写1111 1111, 1111 1111,0000 0000,0000 0000。若是00,则在液晶部分依次写0000 0000,0000 0000,0000 0000,0000 0000。依此类推,直到游戏区域全部刷新。2.6软件模拟I2C通信协议
51单片机本身不具备I2C总线,不支持I2C通信,要使用I2C通信就要对单片机根据I2C协议的时序进行模拟。一般单片机与单片机之间的通信方式是串口通信。那种通信能实现即时通信,不需要使用中介,不需要延时。排行榜的得分信息也是用I2c通信方式保存在rom存储器中,所以即使是断电,信息仍然能保留不丢失。 2.7 编码用最少的数字保存全部信息用最少的数字保存全部信息,只需要18个整型变量就可以表达整个游戏的所有内容和数据。在需要的时候进行解码。将方块和游戏区存储在整型数组中,每一位代表液晶的4*4像素点,移动、旋转、下降都是对这个数组进行操作,而不是直接对液晶进行操作。定时器每隔一定时间对这些数据的每一位进行解码,检测每一位,若该位为1则在液晶上写4*4的黑点,若该位为0则在液晶上写4*4的白点,把每一位数据都反应在液晶上。这样处理起来很容易,而且可以成为一个通用的方法,以后处理液晶我都可以使用这种思想,把区域编码,用数组存储,然后再在液晶外面、数组里面进行任何我需要的操作,需要显示的时候,再把信息解码显示到液晶上面。 2.8其他优化操作使用定时器中断每隔一定时间刷新游戏区域,而不是对整个液晶进行重绘。只有在定时器中断刷新游戏区的时候才需要操作液晶,其他任何游戏操作都不需要处理液晶的实现,只是对数组这个简单的地方进行操作。3. Alpha任务分配计划
通信:软件模拟I2C通信协议:郑鉴
硬件搭建:郑鉴
中断、定时器控制、操作系统:郑鉴
音频模块:软件解码MP3文件需考虑解码速率与CPU主频、文件系统、DMA控制数据传输:郑鉴
算法:旋转算法、消行算法、游戏结束算法:余伟淇
界面:余伟淇
测试:余伟淇
文档:余伟淇
4. 测试计划
开发前:对所有函数进行先测试后编写进行单元测试,DE所有警告
开发后:由于是游戏,所以直接试玩