《基于8052单片机和8X16点阵屏俄罗斯方块游戏板》开发介绍课件_第1页
《基于8052单片机和8X16点阵屏俄罗斯方块游戏板》开发介绍课件_第2页
《基于8052单片机和8X16点阵屏俄罗斯方块游戏板》开发介绍课件_第3页
《基于8052单片机和8X16点阵屏俄罗斯方块游戏板》开发介绍课件_第4页
《基于8052单片机和8X16点阵屏俄罗斯方块游戏板》开发介绍课件_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于8052单片机和8×16点阵屏电子1003班俄罗斯方块游戏板Step1.硬件构成—介绍游戏板所用主要器件及其要实现的功能1.1核心处理器-STC80C52RC1.28x8单色点阵-LG12088BH-W1.34-to-16LineDecoder-MM74HC1541.4四位八段共阳数码管-LG5641BH1.5同向锁存器-SN74HC573AN1.6开关按键1.7焊接实物图:Step2.仿真软件辅助设计—Proteus7.10仿真模块展示Step3.C程序模块简要说明开发概览Step1.硬件构成及功能简介1.核心处理器

STC80C52RC

8051-basedFulllyStatic24MHzCMOScontrollerwith32I/OLines3Timers/Counters8Interrupts/2PriorityLevelsUARTThree-LevelProgramMemoryLock8KBytesFlashMemory128BytesOn-chipRAM功能:整个游戏板的控制中心

2.8x8单色点阵

LG12088BH-W

主要参数驱动电流:20±5mA颜色:红色规格:8×8黑底数量:2信号源:由译码器提供16行扫描信号,由锁存器提供8位 显示信号和驱动电流。功能:提供8×16个像素点的显示屏,为游戏提供必要的 图形显示模块。

Step1.硬件构成及功能简介3.4-to-16LineDecoder MM74HC154 关键参数真值表引脚图Step1.硬件构成及功能简介3.4-to-16LineDecoder 信号源:P2低四位(P1.0至P1.3),使能E1接P2.7,E2接地 功能:为8×16点阵提供16行低电平扫描信号。Step1.硬件构成及功能简介5.同向锁存器 SN74HC573AN 关键参数真值表:引脚图:驱动性:可驱动数码管和点阵正常点亮数量:3块Step1.硬件构成及功能简介5.同向锁存器 Ⅰ.作为点阵显示信号输送和驱动的锁存器(一块)

信号源:单片机P3I/O 功能:给点阵送显示信号并提供驱动电流。(LE接地)Step1.硬件构成及功能简介5.同向锁存器

Ⅱ.作为P0口拓展和数码管位选、段选信号输送以及驱动 电流提供锁存器(两块)。

信号源:单片机P0口(已上拉10K电阻)。 两个锁存控制端接在单片机P2口。 功能:为数码管送入段选信号和位选信号,提供电流驱动

Step1.硬件构成及功能简介焊接实物图:Step1.硬件构成及功能简介点阵和单片机正面点阵和单片机反面焊接实物图:Step1.硬件构成及功能简介数码管正面数码管反面焊接实物图:Step1.硬件构成及功能简介程序运行时状态Proteus7.10仿真模块展示 点阵显示模块Step2.仿真软件辅助设计Proteus7.10仿真模块展示 四位数字显示模块Step2.仿真软件辅助设计Proteus7.10仿真模块展示 仿真运行时[Proteus设计文件][视频文件]Step2.仿真软件辅助设计视频文件资料\简单的操作示意.aviProteus设计文件俄罗斯方块-高度仿真版.DSN/*****************************************************************************************名称:《基于8052单片机和8X16点阵屏俄罗斯方块游戏板》时间:2012年05月23日17时单位:武汉理工大学信息学院电子1003班作者:颜百千*****************************************************************************************/#include<reg52.h>#include<stdlib.h>#include<math.h>#defineucharunsignedcharsbitslock=P2^7; //译码器输出使能端sbitupkey=P2^3; //“旋转图形/向上”按键sbitleftkey=P2^1; //“左移/向左”按键sbitrightkey=P2^2; //“右移/向右”按键sbitdownkey=P2^0; //“快速下移/向下”按键sbitduan=P2^5; //数码管段选信号所用锁存器的锁存允许端sbitwei=P2^6; //数码管位选信号所用锁存器的锁存允许端sbitstartsuspendkey=P2^4; //“开始/暂停/继续”多功能切换按键Step3.C程序模块简要说明/***********************************图形编码机制介绍**************************************1.由于俄罗斯方块图形的宽度和高度最多只有四位,所以要以4X4为基本单元。2.硬件采用16行扫描、8位送显示信号3.各个图形的宽度不一致,所以要人为给图形设定居中位置。若图形宽度为偶数可直接将其居中,若为奇数则靠左居中。4.由于图形需要旋转,所以由基本的图形会衍生出另外3种图形。5.因此每个图形应该给定4个8位的二进制码,并放入一个二维数组里。6.经典俄罗斯方块游戏里有19种不同形状的方块,包括旋转得到的。7.数组的第一个下标为该图形的编号*****************************************************************************************/ucharcodeallshape[19][4]={0x00,0x00,0x18,0x18,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x3c,0x00,0x08,0x18,0x10,0x00,0x00,0x30,0x18,0x00,0x10,0x18,0x08,0x00,0x00,0x18,0x30,0x00,0x08,0x08,0x18,0x00,0x00,0x38,0x08,0x00,0x18,0x10,0x10,0x00,0x00,0x20,0x38,0x00,0x10,0x10,0x18,0x00,0x00,0x08,0x38,0x00,0x18,0x08,0x08,0x00,0x00,0x38,0x20,0x00,0x00,0x10,0x38,0x00,0x08,0x18,0x08,0x00,0x00,0x38,0x10,0x00,0x10,0x18,0x10};/****************************************************************************************/Step3.C程序模块简要说明//数码管数形显示编码ucharcodenumber[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//位选信号编码,方便写循环使用ucharcodeweima[4]={0x01,0x02,0x04,0x08};//各个图形的宽度属性,用于判断左移和右移的步格数上限 charshapewidth[19]={2,1,4,2,3,2,3,2,3,2,3,2,3,2,3,3,2,3,2};//旋转图形时,用于改变图形的编号以实现图形的切换 charshaperotate[19]={0,2,1,4,3,6,5,8,9,10,7,12,13,14,11,16,17,18,15};//用于存储方块降落后固定显示的图形信息ucharstaticdata[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff};//规定一次性消掉的行数的分数奖励机制ucharrate[5]={0,1,3,6,10};/****************************************************************************************/ Step3.C程序模块简要说明/****************************************函数声明****************************************/voiddelayms(int); //粗略延时函数ucharmove(uchar,int);//对二进制码实行移位,可为负值voidshapedisplay(); //对点阵扫描一场,对数码管扫描一场,用于显示图形和数字voidkeyscan();//对所有键盘扫描一次,并执行相应运算和操作ucharcheck(char,int);//用于检查方块将要下落的位置或是将要旋转的位置是否有障碍ucharshapedisappear();//用于消行,返回一次性消掉的行数numberdisplay(intamark);//用于四位数字显示voidstartimage();//游戏等待开始画面函数voidoverimage();//游戏结束后的画面voiddataset();//对数据初始化,为游戏重新开始做准备/****************************************************************************************/Step3.C程序模块简要说明/*****************************************主函数*****************************************/voidmain(){ charj; startimage(); //进入开机,函数内有键盘扫描,只有按下“开始”键会退出函数,否则不退出 dataset(); //对数据进行初始化 while(1){ //进入大循环 k=speed; //确定显示的帧数 while(k--){ keyscan(); //扫描键盘,放入高速循环语句中提高键盘的响应速度,并检测此时用户是否有相应请求 shapedisplay(); //显示图形和数字 } y++; //图形下落一格Step3.C程序模块简要说明/***************************************自定义函数***************************************/voiddelayms(intxms) //粗略的延时函数{ inti,j; for(i=xms;i>0;i--) for(j=110;j>0;j--);}/****************************************************************************************/ucharmove(ucharaa,intanum) //移位函数 { if(anum>=0) aa<<=anum; else aa>>=(-anum); returnaa;}/****************************************************************************************/Step3.C程序模块简要说明voidshapedisplay() //显示函数{ ucharj; for(j=y<3?3-y:0;j<4;j++){ //显示动态方块 slock=1;P1=j+y-3;P3=move(allshape[shapenum][j],left); slock=0;delayms(1);P3=0x00; } for(j=0;j<16;j++){ //显示静态方块 slock=1;P1=j;P3=staticdata[j+3]; slock=0;delayms(1);P3=0x00; } numberdisplay(mark); //分数显示 }/****************************************************************************************/Step3.C程序模块简要说明numberdisplay(intamark) //大数拆分并显示,带去无效零功能{ chari; ucharnum[4]; num[0]=amark/1000%10;num[1]=amark/100%10;num[2]=amark/10%10;num[3]=amark%10; if(amark<10){ //显示一位数 for(i=3;i<4;i++){ P0=0xff; duan=1; P0=number[num[i]]; duan=0; P0=0x00; wei=1; P0=weima[i]; wei=0; delayms(1); wei=1; P0=0x00; wei=0; } }Step3.C程序模块简要说明 elseif(amark<100){ //显示两位数 for(i=2;i<4;i++){ P0=0xff; duan=1; P0=number[num[i]]; duan=0; P0=0x00; wei=1; P0=weima[i]; wei=0; delayms(1); wei=1; P0=0x00; wei=0; } }Step3.C程序模块简要说明 elseif(amark<1000){ //显示三位数 for(i=1;i<4;i++){ P0=0xff; duan=1; P0=number[num[i]]; duan=0; P0=0x00; wei=1; P0=weima[i]; wei=0; delayms(1); wei=1; P0=0x00; wei=0; } }Step3.C程序模块简要说明 else{ //显示四位数 for(i=0;i<4;i++){ P0=0xff; duan=1; P0=number[num[i]]; duan=0; P0=0x00; wei=1; P0=weima[i]; wei=0; delayms(1); wei=1; P0=0x00; wei=0; } } return0;/****************************************************************************************/Step3.C程序模块简要说明voidkeyscan() //键盘扫锚并执行用户输入的指令{ //按键无效条件:1.左移超边缘;2.左移遇障碍;3.处在欢迎界面;4.处在暂停界面 if(leftkey==0&&(left<(shapewidth[shapenum]<3?3:2))&&!check(shapenum,left+1)&& startcontrol==0&&suspendcontrol==0){ delayms(10); if(leftkey==0){ left++; //按键命令:方块左移一位 speed=systemspeed; while(!leftkey){ shapedisplay(); } } }Step3.C程序模块简要说明 //按键无效条件:1.右移超边缘;2.右移遇障碍;3.处在欢迎界面;4.处在暂停界面 if(rightkey==0 &&(left>(shapewidth[shapenum]<3?shapewidth[shapenum]5:shapewidth[shapenum]-6)) &&!check(shapenum,left-1)&&startcontrol==0&&suspendcontrol==0){ delayms(10); if(rightkey==0){ left--; //按键命令:方块右移一位 speed=systemspeed; while(!rightkey){ shapedisplay(); } } }Step3.C程序模块简要说明 //按键无效条件:1.翻转超左右边缘;2.翻转遇障碍;3.处在欢迎界面;4.进入暂停界面 if(upkey==0&&!check(shaperotate[shapenum],left) &&(left<(shapewidth[shaperotate[shapenum]]<3?4:3)) &&(left>(shapewidth[shaperotate[shapenum]]<3? shapewidth[shaperotate[shapenum]]-6:shapewidth[shapenum]-7)) &&startcontrol==0&&suspendcontrol==0){ delayms(10); if(upkey==0){ shapenum=shaperotate[shapenum];//按键命令:将翻转后的图形编号赋给要显示的图形编号 speed=systemspeed; while(!upkey){ shapedisplay(); } } }Step3.C程序模块简要说明 if(downkey==0&&speed!=fastspeed&&startcontrol==0&&suspendcontrol==0){ delayms(10);//按键无效条件:1.已经进入快速下降状态;2.处在欢迎界面;3.进入暂停界面 if(downkey==0){ speed=fastspeed;//按键命令:将方块下落速度加快 k=speed; while(!downkey){ shapedisplay(); } } } if(startsuspendkey==0&&startcontrol==1&&suspendcontrol==0){ delayms(10);//按键有效条件:1.处在开始欢迎界面;2.处在暂停界面 if(startsuspendkey==0){ startcontrol=0; suspendcontrol=0; //按键命令:使进入继续游戏状态 while(!startsuspendkey){ } } }Step3.C程序模块简要说明 if(startsuspendkey==0&&startcontrol==0&&suspendcontrol==0){ delayms(10); //按键无效条件:1.处在开始欢迎界面;2.处在暂停状态 if(startsuspendkey==0){ suspendcontrol=1; startcontrol=0; //按键命令:状态切换,使进入暂停状态 while(!startsuspendkey){ shapedisplay(); } while(suspendcontrol){ shapedisplay(); keyscan(); //等待结束暂停状态的命令 } } }Step3.C程序模块简要说明 if(startsuspendkey==0&&startcontrol==0&&suspendcontrol==1){ delayms(10); //按键有效条件:处在暂停界面 if(startsuspendkey==0){ suspendcontrol=0; startcontrol=0; //按键命令:状态切换,使进入继续游戏状态 while(!startsuspendkey){ shapedisplay(); } } }}/****************************************************************************************/Step3.C程序模块简要说明ucharcheck(charashapenum,intaleft) //判断方块是否会遇到障碍物{ chari=3,j=0; while(!j&&i>=0){ if((move(allshape[ashapenum][i],aleft)+staticdata[y+i])!=(move(allshape[ashapenum][i],aleft)|staticdata[y+i])){ j++; } i--; } returnj; //返回0,说明没有障碍}/****************************************************************************************/Step3.C程序模块简要说明ucharshapedisappear()//方块落定后消掉拼满的行,并使没有拼满的行整体下移填补空缺行{ chari,j,r=4; for(i=0;i<r;i++){ if(staticdata[y+3-i]==0xff){ for(j=y+3-i;j>0;j--){ staticdata[j]=staticdata[j-1]; } i--,r--; } } return4-r; //函数返回一次性消掉的行的数目}/****************************************************************************************/Step3.C程序模块简要说明voidstartimage() //开机欢迎画面,在没有按键作用的时候会不断执行{ uchari,j; startcontrol=1; while(startcontrol){ for(i=10;i>0;i--){ for(j=0;j<16;j+=2){ slock=1;P1=j;P3=0xaa; slock=0;delayms(1);P3=0x00; } for(j=1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论