基于51与12864的俄罗斯方块

合集下载

c51单片机俄罗斯方块设计

c51单片机俄罗斯方块设计
图形的上下移动根据点阵理论可通过图形数据的左右移动和地址变化来实现。
图形的变化图形的变化图形的变化图形的变化:可通过地址变化来得到。即把需要变化的数据送到一固定地址,通过地址变化再送回显示的地址里面。图形的碰边处理图形的碰边处理图形的碰边处理图形的碰边处理:可通过各个边上的数据判断是否到边来实现。与原有图形相遇与原有图形相遇与原有图形相遇与原有图形相遇:可通过与原有图形数据进行比较处理来实现。:图形的旋转图形的旋转图形的旋转图形的旋转:在固定地址里面实现旋转比较容易,但是在行进中的图形旋转就比较费脑筋,我是用一个地址计数下移的次数,再用一个地址计数左移右移的次数。再根据这些次数确定图形的地址,再把这些地址送到图形变化的一个固定的地址中,变化后再送回到显示的地址中去显示。图形的碰边处理图形的碰边处理图形的碰边处理图形的碰边处理:如果不对图形进行边框处理,图形就会一直移动,看不到我们想要的效果。我是用把边框数据与图形数据进行位运算。再判断这些数据就可以得到图形是否到边
unsigned int code game_data[]=
{
0x64DB,0x8AAA,0x8AAA,0x8AAB,0xEEAA,0xAAAA,0xEAAB,0x0000
三.系统方案设计程序整体源自路单片机上的程序设计一般是一个大循环结构,对于俄罗斯方块的程序设计,首先产生一个伪随机数,其范围是0-6,然后程序根据此数值所对应的图形模块装入ram的固定区域内,紧接着将此图像写入led所对应的显示缓冲区中,显示程序将缓冲区内的内容显示在led上,如果没有控制键按下,图形将自动向下移动。如果有键按下,程序将根据按下的键来改变图形存储区的值,同时程序将判断图形是否已到达边界,当图形最上层到达显示区顶部,则游戏结束,此时将清楚显示缓冲的内容,游戏重新开始。

基于单片机的俄罗斯方块游戏机课程设计

基于单片机的俄罗斯方块游戏机课程设计
图3.4复位电路
3.
8XX51系列单片机的时钟信号通常用两种电路形式得到:内部振荡方式和外部振荡方式。在引脚XTAL1和XTAL2外接晶振,就构成了内部振荡方式。由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器,并产生振荡时钟脉冲。晶振通常选用6MHz、12MHz或24MHz。
1.3 分工
在本次设计中,张荣俊同学主要负责软件的设计与分析,汤青红同学负责硬件电路的设计。
2.设计方案
本次设计采用STC89C52单片机控制模块,USB电源模块来提供电源,复位模块,12864LCD显示屏进行屏显,晶振与电容实现时钟电路,按键直接接入I/O口,这样可以简化电路。另外我们还采用了6个按键,分别是左移,右移,下移、方块变化键、确定按键与暂停按键。
《单斯方块游戏机
专 业:电子信息工程技术
班 级:电子B1512班
学 号:
姓 名:
指导老师:
2017-12-01
1.设计题目、要求及分工
1.1 设计题目
本课程设计题目是基于51单片机的俄罗斯方块游戏机。
1.2 设计要求
本课程设计主要器件是STC89C52单片机和液晶12864,通过单片机发生信号控制液晶屏的显示,使用按键实现游戏的开始、暂停、移动、翻转等。
本次设计中我们选用了12MHz的晶振,晶振与锁相环电路配合使用,以提供系统所需的时钟频率。设计中STC89C52使用12MHz晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF到50pF之间,我们选用电容容量为33pF的电容,如图所示即为本设计的振荡电路。
XTAL1
振荡器反相放大器及内部时钟发生器的输入端。
XTAL2

C51单片机12864液晶带按键制作俄罗斯方块C源码

C51单片机12864液晶带按键制作俄罗斯方块C源码

************说明******************************此程序包含一个俄罗斯方块.c 文件和一个12864.h 文件********************俄罗斯方块.c文件**************************#include "reg51.h"#include "12864.h"#define uchar unsigned char#define uint unsigned intstatic unsigned long Seed = 1;#define A 48271L#define M 2147483647L#define Q (M / A)#define R (M % A)sbit K1=P3^4;sbit K2=P3^5;sbit K3=P3^6;sbit K4=P3^7;unsigned int idata num[19+2]={0xfff,//第1行,最下面0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,//第2行到第20行共19行0xfff//第21行,最上面};//定义共21行,其中num[0]为下墙壁行,num[20]为上墙壁行,每行12格,最左一格为左墙壁列,最右一格为右墙壁列unsigned char code Block[28][2]={/** 口口口口口口* 口口口口* 口口口口口口*/{0x88,0xc0},{0xe8,0x00},{0x62,0x20},{0x02,0xe0},/** 口口口口口口* 口口口口* 口口口口口口*/{0x22,0x60},{0x08,0xe0},{0xc8,0x80},{0xe2,0x00},/** 口* 口口口口* 口口口*/{0x8c,0x40},{0x6c,0x00},{0x8c,0x40},{0x6c,0x00},/** 口口口* 口口口口* 口*/{0x4c,0x80},{0xc6,0x00},{0x4c,0x80},{0xc6,0x00},/** 口口* 口口口口口口口口* 口口口口口口*/{0x04,0xe0},{0x8c,0x80},{0xe4,0x00},{0x26,0x20},/*口* 口* 口口口口口* 口*/{0x44,0x44},{0x0f,0x00},{0x44,0x44},{0x0f,0x00},/** 口口* 口口*/{0x06,0x60},{0x06,0x60},{0x06,0x60},{0x06,0x60}};#define PASSSCORE 20struct Jimu{unsigned int dat;char x;unsigned char y;unsigned char type;unsigned char change;}Sign[3];//积木结构体unsigned char SysFlag=0;#define NEWSIGNFLAG 0#define DEADFLAG 1#define PAUSEFLAG 2unsigned char Score=0;unsigned char Level=1;unsigned char DelayCnt=5;/*********************************************************/#define N 25/************************************伪随机数发生器*************************************/ double Random(void){long TmpSeed;TmpSeed=A*(Seed%Q)-R*(Seed/Q);if(TmpSeed>=0)Seed=TmpSeed;elseSeed=TmpSeed+M;return (double)Seed/M;}/************************************** 为伪随机数发生器播种***************************************/ void InitRandom(unsigned long InitVal){Seed=InitVal;}//延时子程序void Delay(unsigned int t){unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/*********************************初始化MPU**********************************/void InitCpu(void){TMOD=0x0;TH0=0;TL0=0;TR0=1;ET0=1;EX1=1;EA=1;TCON|=0x04;}/**************************** welcome 游戏选择界面/**********************/void welcome(){Lcd_WriteStr(0,0,"欢迎来玩");Lcd_WriteStr(0,1,"俄罗斯方块");Lcd_WriteStr(0,2,"设置按K1");Lcd_WriteStr(0,2,"开玩按K2");}/*************俄罗斯方块部分/******************************画墙壁,初始化界面*******************************/void DrawBoard(void){unsigned char n;for(n=0;n<12;n++){Lcd_Rectangle(3*n,0,3*n+2,2,1);Lcd_Rectangle(3*n,60,3*n+2,62,1);}for(n=0;n<20;n++){Lcd_Rectangle(0,3*n,2,3*n+2,1);Lcd_Rectangle(33,3*n,35,3*n+2,1);}Lcd_WriteStr(4,0,"经典游戏");Lcd_WriteStr(3,2,"Score:");Lcd_WriteStr(3,3,"Level:");}/*********************************** 游戏结束处理************************************/ void GameOver(void){if((SysFlag&(1<<DEADFLAG))!=0)Lcd_WriteStr(3,1,"You Fail");elseLcd_WriteStr(3,1,"You Pass");}unsigned int code MaskTab[16]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};/**********************************根据积木图标左下坐标X,Y来画出积木图标***********************************/void DrawSign(struct Jimu Temp,unsigned char DrawMode){unsigned char m,n;for(m=0;m<4;m++)for(n=0;n<4;n++){if((Temp.dat&MaskTab[4*m+n])!=0)Lcd_Rectangle(Temp.x+n*3,Temp.y-2-3*m,Temp.x+n*3+2,Temp.y-3*m,DrawMode);}}/********************************将积木图标值融入num数据中也即把积木图标固定,无法再下降*********************************/FixSign(void){unsigned char m,n;for(m=0;m<4;m++)//行循环for(n=0;n<4;n++)//列循环{if((Sign[0].dat&MaskTab[4*m+n])!=0){num[20-(Sign[0].y-2)/3+m]|=MaskTab[11-Sign[0].x/3-n];}}}/********************************判断积木图标中方块是否与障碍方块重合*********************************/unsigned char CheckIf(void){unsigned char m,n;for(m=0;m<4;m++)//行循环for(n=0;n<4;n++)//列循环{if((Sign[1].dat&MaskTab[4*m+n])!=0){if((num[20-(Sign[1].y-2)/3+m]&MaskTab[11-Sign[1].x/3-n])!=0)return 0;}}return 1;}/********************************判断积木图标是否可以继续下降一格********************************/unsigned char CheckIfDown(void){Sign[1]=Sign[0];//Sign[1].y+=3;//假设下降一格return CheckIf();}/********************************判断积木图标是否可以向左移动*********************************/unsigned char CheckIfLeft(void){Sign[1]=Sign[0];Sign[1].x-=3;return CheckIf();}/********************************判断积木图标是否可以向右移动*********************************/unsigned char CheckIfRight(void){Sign[1]=Sign[0];Sign[1].x+=3;return CheckIf();}/********************************判断是否可以旋转*********************************/unsigned char CheckIfRoll(void){unsigned char i;unsigned int Temp;Sign[1]=Sign[0];if(++Sign[1].change>3)Sign[1].change=0;i=Sign[1].type*4+Sign[1].change;Temp=(unsigned int)Block[i][0]<<8;Temp=Temp|Block[i][1];Sign[1].dat=Temp;return CheckIf();}/********************************寻找满格的行并做消除处理最多寻找4个满行并做消除*********************************/void DelFull(void){unsigned char m,n;unsigned char Temp;unsigned char Flag=0;Temp=(Sign[0].y-2)/3;if(Temp>=20)//防止越过了下边界Temp=1;elseTemp=20-Temp;for(n=Temp+3;n>=Temp;n--)//积木图标的最顶行开始寻找满行比较有利于运算{if(num[n]==0xfff){Flag=1;for(m=n+1;m<=19;m++){num[m-1]=num[m];}num[m]=0x801;Score++;//每找到一个满行,则分数加1}}if(Flag)//为加速而设置并判断的标志,有已固定的积木有满格消行变化则重画积木界面{for(m=Temp;m<=19;m++)//为加速,不必要重第一行重画起,只需要从积木图标最下行开始往上的重画for(n=1;n<=10;n++){if((num[m]&MaskTab[n])==0){if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)!=0)//为加速而做的读象素操作{Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,0);}}else{if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)==0)//为加速而做的读象素操作{Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,1);}}}}}/*******************************随机产生一个积木图标放到预产生区域并显示出来********************************/void CreatSign(void){unsigned char n;unsigned int Temp;DrawSign(Sign[2],0);//先清除n=Random()*28;Temp=(unsigned int)Block[n][0]<<8;Temp=Temp|Block[n][1];Sign[2].dat=Temp;Sign[2].x=45;Sign[2].y=4*3+2;Sign[2].type=n/4;Sign[2].change=n%4;DrawSign(Sign[2],1);//后画出}void PrintScore(void){unsigned char Str[3];Str[0]=(Score/10)|0x30;Str[1]=(Score%10)|0x30;Str[2]=0;Lcd_WriteStr(6,2,Str);}void PrintLevel(void){unsigned char Str[3];Str[0]=(Level/10)|0x30;Str[1]=(Level%10)|0x30;Str[2]=0;Lcd_WriteStr(6,3,Str);}/********************************游戏的具体过程,也是俄罗斯方块算法的关键部分*********************************/void GamePlay(void){unsigned char m,n;unsigned int Temp;SysFlag|=1<<NEWSIGNFLAG;//刚开始初始化为需要产生新的积木图标InitRandom(TL0);Lcd_WriteStr(3,1,"Playing");PrintScore();PrintLevel();CreatSign();while(1){if((SysFlag&(1<<NEWSIGNFLAG))==1)//判是否需要产生新的积木图标{SysFlag&=~(1<<NEWSIGNFLAG);Sign[0]=Sign[2];CreatSign();Sign[0].x=12;Sign[0].y=14;for(m=0;m<4;m++)//行循环{for(n=0;n<4;n++)//列循环{if((Sign[0].dat&MaskTab[15-m*4-n])==0)break;}if(n==4)Sign[0].y-=3;}//将积木图标出现置顶for(m=0;m<4;m++)//行循环for(n=0;n<4;n++)//列循环{if((Sign[0].dat&MaskTab[4*m+n])!=0){if((num[20-(Sign[0].y-2)/3+m]&MaskTab[11-Sign[0].x/3-n])!=0)SysFlag|=1<<DEADFLAG;}}if((SysFlag&(1<<DEADFLAG))!=0)break;//如果产生新的积木图标中的方块与已固定好的方块重合,则死亡。

单片机俄罗斯方块设计 单片机俄罗斯方块设计

单片机俄罗斯方块设计 单片机俄罗斯方块设计

题目:[单片机俄罗斯方块设计]摘要随着社会的不断的发展和进步,人们对娱乐产品的关注在不断的增加,特别是电子游戏产品在我们的生活中占据了很重要的地位。

俄罗斯方块游戏是一款风靡全球的经典游戏。

这款游戏之所以叫做俄罗斯方块,是因为发明这款游戏的人是俄罗斯人。

本次为了回顾经典设计了一款基于单片机的俄罗斯方块游戏机。

本次设计了一款基于单片机的俄罗斯方块游戏机,该游戏机可以丰富我们的业余生活。

在硬件设计上该游戏机以STC89C52单片机为基础、使用LCD12864图形液晶可以显示游戏的界面、通过按键实现游戏机的按钮的功能、并具有蜂鸣器可以实现声音提示的功能。

在软件设计上,使用C语言进行了俄罗斯方块游戏的控制程序的编写,并在keil软件上进行了调试。

最后在Proteus仿真软件上对俄罗斯方块游戏的功能进行了仿真,并焊接了实物电路板。

关键词:STC89C52单片机;俄罗斯方块;游戏机;LCD12864液晶AbstractWith the continuous development and progress of society, people pay more and more attention to entertainment products, especially video game products play a very important role in our life. The Tetris game is a classic game that is popular all over the world. The game is called the Tetris, because the people who invented the game were Russian. This time in order to review the classic design of a single chip based Tetris block game machine.The design of a single chip computer based Tetris game machine, which can enrich our amateur life. On the hardware design, the game machine is based on STC89C52 microcontroller, and it can display the interface of the game by using LCD12864 graphic LCD, realize the button function of the game machine by button, and has the function of voice prompt by buzzer. In the software design, the control program of Tetris game is written in C language and debugged on the keil software. Finally, the function of the Tetris game is simulated on the Proteus simulation software, and the physical circuit board is welded.Keywords:STC89C52 singlechip;Tetris block;game machine;LCD12864 liquid crystal目录摘要 (I)Abstract........................................................... I I 第1章绪论.. (1)1.1课题研究背景和意义 (1)1.2俄罗斯方块的发展状况及趋势 (1)1.3课题研究的主要内容 (1)1.4课题研究的主要内容 (2)第2章系统整体方案设计 (4)2.1系统的功能要求 (4)2.2系统总体方案框图设计 (4)2.3单片机模块的选择 (5)2.4液晶显示模块的选择 (6)2.5按键电路的选择 (7)第3章系统整体硬件设计 (9)3.1单片机电路设计 (9)3.1.1STC89C52单片机介绍 (9)3.1.2晶振电路设计 (10)3.1.3复位电路设计 (10)3.1.4单片机最小系统电路设计 (11)3.2 LCD12864液晶显示电路 (11)3.2.1点阵LCD的显示原理 (11)3.2.2LCD12864液晶的硬件连接 (12)3.3按键控制电路 (12)3.4声音提示电路设计 (13)3.5电源电路 (13)第4章系统软件设计 (15)4.1程语言的选择 (15)4.2软件介绍和工程建立 (15)4.3俄罗斯方块流程图设计 (16)4.3.1主程序流程图 (16)4.3.2游戏外观显示流程图 (18)4.3.3俄罗斯方块向左/右移动工作流程图 (19)4.3.4俄罗斯方块中按下键的流程图 (20)第5章系统的调试与制作 (21)5.1 KEIL软件介绍 (21)5.2程序调试 (21)5.3 proteus仿真步骤 (22)5.4实物综合调试 (23)结论 (26)参考文献 (27)附录 (28)致谢.............................................. 错误!未定义书签。

基于51单片机俄罗斯方块程序设计

基于51单片机俄罗斯方块程序设计

基于51单片机俄罗斯方块游戏设计作者:左厚臣前言闲得无事,想用单片机和LCD12864写一个俄罗斯方块游戏,培养培养兴趣,丰富一下业余生活,同时也熟练熟练单片机应用。

然后整理一下过程,本文没有什么专业的流程图,系统框图,随手画的。

希望各位大神勿喷,本菜鸟就献丑了。

关键字:51单片机LCD12864 俄罗斯方块游戏设计一、实物写真1、先展示一下实物效果呗,看能不能吸引到各位大神的眼球!!!!2、单片机选型IO口占用:7个程序存储器占用:6459Byte内部RAM:117.0Byte内部扩展RAM:1016ByteFosc = 24Mhz(也可选择12Mhz)中断使用状况:16位定时器溢出中断1个手头有一块STC12C5A60S2 51系列单片机,本实验也采用的此款单片机,或许有大神能用很节省资源的方法写出这款游戏,本菜鸟甘拜下风。

二、游戏算法整个游戏的算法也就是这样子的吧!下面就对每个步骤进说明吧!三、算法说明算法就捡重点的说吧,省得各位大神都闲啰嗦。

1、当前随机方块获取和下一回合游戏方块生成并显示此步骤拆解成如下流程图所示:(1)随机数生成51单片机需要调用库函数来产生随机数,如下:#include <stdlib.h>//调用库函数的头文件函数rand ()会生成一个int型的随机数,int型变量范围为-32768~32767占用2 字节。

我们使用时其实是可以把它当做一个unsigned int型变量的,取值范围0-65535 这个应该是很好理解的。

但是如果我们需要一个0-7的随机数怎么处理呢,没关系有办法,程序如下:u8 Random(u8 max){u16 temp;u8 a;max = max +1;temp=rand();//获取随机种子a = temp%max;return a;}其实也就是把得到随机数与想要得到数范围的最大数求余运算就可以了,即:a = temp%max;我们的游戏方块可以描述成2个要素:A、形状比如说形状有:■■■■■■■■■等,可用0-n来表示B、姿态比如说形状■■■姿态有4种如下:■■■■■■■■■■■■它们从左往右看可以看出规律分别旋转了0°,90°,180°,270°,也分别相对旋转了90°,可以用0-3来表示。

C51单片机12864液晶带按键制造俄罗斯方块C源码

C51单片机12864液晶带按键制造俄罗斯方块C源码

/*********************************************************/ ;5=tnCyaleD rahc dengisnu ;1=leveL rahc dengisnu ;0=erocS rahc dengisnu 2 GALFESUAP enifed# 1 GALFDAED enifed# 0 GALFNGISWEN enifed# ;0=galFsyS rahc dengisnu 体构结木积//;]3[ngiS} ;egn ahc rahc dengisnu ;epyt rahc dengisnu ;y rahc dengisnu ;x rahc ;tad tni dengisnu { umiJ tcurts 02 EROCSSSAP enifed# ;} }06x0,60x0{,}06x0,60x0{,}06x0,60x0{,}06x0,60x0{ /* 口口 * 口口 * */ ,}00x0,f0x0{,}44x0,44x0{,}00x0,f0x0{,}44x0,44x0{ /* 口 * 口口口口 口 * 口 * 口*/ ,}02x0,62x0{,}00x0,4ex0{,}08x0,c8x0{,}0ex0,40x0{ /* 口 口 口 口口口 * 口口 口口口 口口 口 * 口 口 * */ ,}00x0,6cx0{,}08x0,c4x0{,}00x0,6cx0{,}08x0,c4x0{ /* 口 * 口口 口口 * 口口 口 * */
} ;)"ssaP uoY",1,3(rtSetirW_dcL esle ;)"liaF uoY",1,3(rtSetirW_dcL )0=!))GALFDAED<<1(&galFsyS((fi { )diov(revOem aG diov /************************************ 理处束结戏游 ***********************************/ } ;)":leveL",3,3(rtSetirW_dcL ;)":erocS",2,3(rtSetirW_dcL ;)"戏游典经",0,4(rtSetirW_dcL } ;)1,2+n*3,53,n*3,33(elgnatceR_dcL ;)1,2+n*3,2,n*3,0(elgnatceR_dcL { )++n;02<n;0=n(rof } ;)1,26,2+n*3,06,n*3(elgnatceR_dcL ;)1,2,2+n*3,0,n*3(elgnatceR_dcL { )++n;21<n;0=n(rof ;n rahc dengisnu { )diov(draoBwarD diov /******************************* 面界化始初�壁墙画 ******************************/ 分部块方斯罗俄*************/ } ;)"2K 按玩开",2,0(rtSetirW_dcL ;)"1K 按置设",2,0(rtSetirW_dcL ;)" 块方斯罗俄",1,0(rtSetirW_dcL ;)"玩来迎欢",0,0(rtSetirW_dcL { )(emoclew diov /**********************/ 面界择选戏游 emoclew ****************************/

俄罗斯方块89c52的12864液晶设计

俄罗斯方块89c52的12864液晶设计

俄罗斯方块89c52的12864液晶设计俄罗斯方块89c52的12864液晶设计俄罗斯方块设计代码如下:#include "reg51.h"#include "12864.h"#define uchar unsigned char#define uint unsigned intstatic unsigned long Seed = 1;#define A 48271L#define M 2147483647L#define Q (M / A)#define R (M % A)sbit change=P1^5;sbit xia=P3^3;sbit zuo=P1^4;sbit you=P1^6;unsigned int idata num[19+2]={0xfff,// 第 1 行,最下面0x801,0x801,0x801,0x801,0x801,0x801,0x801 ,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801 ,0x801,0x801,// 第 2 行到第 20 行共 19 行0xfff// 第 21 行,最上面};// 定义共 21 行,其中 num[0]为下墙壁行,num[20] 为上墙壁行 ,每行 12 格,最左一格为左墙壁列,最右一格为右墙壁列unsigned char code Block[28][2]={/** 口口口口口口* 口口口口* 口口口口口口*/{0x88,0xc0},{0xe8,0x00},{0x62,0x20},{0x02 ,0xe0},/** 口口口口口口* 口口口口* 口口口口口口*/{0x22,0x60},{0x08,0xe0},{0xc8,0x80},{0xe2 ,0x00},/** 口* 口口口口* 口口口*/{0x8c,0x40},{0x6c,0x00},{0x8c,0x40},{0x6c ,0x00},/** 口口口* 口口口口* 口*/{0x4c,0x80},{0xc6,0x00},{0x4c,0x80},{0xc6 ,0x00},/** 口口* 口口口口口口口口* 口口口口口口*/{0x04,0xe0},{0x8c,0x80},{0xe4,0x00},{0x26 ,0x20},/*口* 口* 口口口口口* 口*/{0x44,0x44},{0x0f,0x00},{0x44,0x44},{0x0f ,0x00},/** 口口* 口口*/{0x06,0x60},{0x06,0x60},{0x06,0x60},{0x06 ,0x60}};uchar code start[]={0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x08,0x00,0x3F,0xFF,0x00,0x22,0 x00,0x00,0x02,0x00,0x00,0x41,0x00,0x00,0x00,0x08,0x6A,0x00,0x22,0x21,0x00,0x22,0 x3F,0x00,0x01,0x00,0x00,0x41,0x00,0x00,0x00,0x09,0xC9,0x00,0x22,0x21,0x00,0x22,0 xE0,0x00,0x01,0x00,0x00,0x41,0x00,0x00, 0x00,0x10,0x89,0x80,0x22,0x21,0x00,0xFF,0 x20,0x00,0xFF,0xFF,0x00,0x41,0x08,0x00, 0x00,0x10,0x88,0x00,0x22,0x21,0x00,0x22,0 x20,0x00,0x02,0x00,0x00,0x47,0xF8,0x00, 0x00,0x37,0xFF,0xC0,0x3F,0xFF,0x00,0x3E,0 x20,0x00,0x02,0x00,0x03,0xF9,0x08,0x00, 0x00,0x30,0x88,0x00,0x21,0x80,0x00,0x22,0 x3F,0x00,0x02,0x00,0x00,0x41,0x08,0x00, 0x00,0x50,0x88,0x80,0x03,0x44,0x00,0x22,0 x26,0x00,0x07,0xF8,0x00,0x41,0x08,0x00, 0x00,0x10,0xA9,0x00,0x06,0x3C,0x00,0x3E,0 x22,0x00,0x04,0x18,0x00,0x41,0x08,0x00, 0x00,0x10,0xC9,0x00,0x0C,0x08,0x00,0x22,0 x22,0x00,0x04,0x10,0x00,0x5F,0xFE,0x00, 0x00,0x17,0x86,0x00,0x12,0x18,0x00,0xFF,0 xA2,0x00,0x0C,0x10,0x00,0x41,0x40,0x00, 0x00,0x10,0x84,0x00,0x01,0x30,0x00,0x00,0 x22,0x00,0x08,0x10,0x00,0x79,0x40,0x00, 0x00,0x10,0x8C,0x40,0x00,0x60,0x00,0x12,0 x42,0x00,0x10,0x10,0x01,0xC2,0x20,0x00,0x00,0x10,0x92,0x40,0x00,0x80,0x00,0x21,0 x42,0x00,0x10,0x10,0x03,0x04,0x10,0x00, 0x00,0x10,0x81,0xC0,0x07,0x00,0x00,0x40,0 x82,0x00,0x61,0x30,0x00,0x08,0x08,0x00, 0x00,0x11,0x80,0xC0,0x38,0x00,0x00,0x81,0 x02,0x00,0x80,0xE0,0x00,0x30,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x40,0x00,0x40,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1F,0xC7,0xF0,0x0F,0xE3,0xF8,0xFE,0x00,0 xFE,0x3F,0x8F,0xE0,0x00,0x07,0xF1,0xFC, 0x1F,0xC7,0xF0,0x0F,0xE3,0xF8,0xFE,0x00,0 xFE,0x3F,0x8F,0xE0,0x00,0x07,0xF1,0xFC, 0x1F,0xC7,0xF0,0x0F,0xE3,0xF8,0xFE,0x00,0 xFE,0x3F,0x8F,0xE0,0x00,0x07,0xF1,0xFC, 0x1F,0xC7,0xF0,0x0F,0xE3,0xF8,0xFE,0x00,0 xFE,0x3F,0x8F,0xE0,0x00,0x07,0xF1,0xFC,xFE,0x3F,0x8F,0xE0,0x00,0x07,0xF1,0xFC, 0x1F,0xC7,0xF0,0x0F,0xE3,0xF8,0xFE,0x00,0 xFE,0x3F,0x8F,0xE0,0x00,0x07,0xF1,0xFC, 0x1F,0xC7,0xF0,0x0F,0xE3,0xF8,0xFE,0x00,0 xFE,0x3F,0x8F,0xE0,0x00,0x07,0xF1,0xFC, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x0F,0xE7,0xF0,0x00, 0x1F,0xC7,0xF0,0x00,0x00,0x00,0xFE,0x00,0 x00,0x3F,0x80,0x00,0x0F,0xE7,0xF0,0x00, 0x1F,0xC7,0xF0,0x00,0x00,0x00,0xFE,0x00,0 x00,0x3F,0x80,0x00,0x0F,0xE7,0xF0,0x00, 0x1F,0xC7,0xF0,0x00,0x00,0x00,0xFE,0x00,0 x00,0x3F,0x80,0x00,0x0F,0xE7,0xF0,0x00, 0x1F,0xC7,0xF0,0x00,0x00,0x00,0xFE,0x00,0 x00,0x3F,0x80,0x00,0x0F,0xE7,0xF0,0x00, 0x1F,0xC7,0xF0,0x00,0x00,0x00,0xFE,0x00,0 x00,0x3F,0x80,0x00,0x0F,0xE7,0xF0,0x00,x00,0x3F,0x80,0x00,0x0F,0xE7,0xF0,0x00, 0x1F,0xC7,0xF0,0x00,0x00,0x00,0xFE,0x00,0 x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0x07,0xFF,0x80,0xFF,0x80,0 x08,0x40,0x00,0x80,0x40,0x22,0x00,0x00, 0x00,0x04,0x00,0x00,0x40,0x00,0x00,0x80,0 x08,0x80,0x04,0x80,0xC0,0x26,0x00,0x00, 0x00,0x08,0x10,0x00,0x80,0x00,0x20,0x80,0 x11,0x0C,0x04,0x82,0x40,0x44,0x18,0x00, 0x00,0x30,0x08,0x01,0xFE,0x00,0x20,0x80,0 x13,0xFE,0x0F,0xF2,0x40,0x47,0xF8,0x00, 0x00,0x3F,0xFC,0x06,0x82,0x00,0x20,0x80,0 x30,0x02,0x08,0x82,0x40,0xC9,0x00,0x00,x31,0x04,0x0F,0xFA,0x40,0xD9,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x00,0x60,0x90,0 x52,0x42,0x00,0x82,0x41,0x51,0xF0,0x00, 0x00,0x37,0xE0,0x0F,0xDF,0xC0,0x7F,0xF0,0 x14,0xF8,0x0F,0xF2,0x40,0x41,0x00,0x00, 0x00,0x21,0x00,0x02,0x04,0x00,0x00,0x10,0 x11,0x08,0x08,0x92,0x40,0x41,0x00,0x00, 0x00,0x41,0x00,0x04,0x04,0x00,0x01,0x90,0 x12,0x98,0x08,0x92,0x40,0x41,0x00,0x00, 0x00,0xBF,0xFC,0x07,0xCF,0x81,0xFF,0x90,0 x14,0x50,0x08,0x92,0x40,0x41,0xF8,0x00, 0x00,0x01,0x00,0x0C,0x58,0x80,0x00,0x30,0 x10,0x20,0x08,0xB0,0x40,0x41,0x00,0x00, 0x00,0x01,0x00,0x04,0x48,0x80,0x00,0x20,0 x10,0x50,0x08,0xA0,0x40,0x41,0x00,0x00, 0x00,0x01,0x00,0x07,0xCF,0x80,0x01,0xE0,0 x11,0x8E,0x00,0x81,0xC0,0x41,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,0 x00,0x00,0x00,0x00,0x80,0x41,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}; #define PASSSCORE 20struct Jimu{unsigned int dat;char x;unsigned char y;unsigned char type;unsigned char change;}Sign[3];// 积木结构体unsigned char SysFlag=0;#define NEWSIGNFLAG 0#define DEADFLAG 1#define PAUSEFLAG 2unsigned char Score=0;unsigned char Level=1;unsigned char DelayCnt=5;/**************************************** *****************/#define N 25/************************************ 伪随机数发生器*************************************/ double Random(void){long TmpSeed;TmpSeed=A*(Seed%Q)-R*(Seed/Q);if(TmpSeed>=0)Seed=TmpSeed;elseSeed=TmpSeed+M;return (double)Seed/M;}/************************************** 为伪随机数发生器播种***************************************/ void InitRandom(unsigned long InitVal){Seed=InitVal;}//延时子程序void Delay(unsigned int t){unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/********************************* 初始化MPU**********************************/ void InitCpu(void){TMOD=0x0;TH0=0;TL0=0;TR0=1;ET0=1;EX1=1;EA=1;TCON|=0x04;}/**************************** welcome 游戏选择界面/**********************/void welcome(){DisplayImage(start);while(change==1);}/************* 俄罗斯方块部分/****************************** 画墙壁,初始化界面*******************************/void DrawBoard(void){unsigned char n;for(n=0;n<12;n++){Lcd_Rectangle(3*n,0,3*n+2,2,1);Lcd_Rectangle(3*n,60,3*n+2,62,1);}for(n=0;n<20;n++){Lcd_Rectangle(0,3*n,2,3*n+2,1);Lcd_Rectangle(33,3*n,35,3*n+2,1);}Lcd_WriteStr(4,0,"下个方块");Lcd_WriteStr(3,2,"分");Lcd_WriteCmd(0x8c);Lcd_WriteData(0xca);Lcd_WriteData(0xfd);Lcd_WriteStr(5,2,":");Lcd_WriteStr(3,3,"级别:");}/*********************************** 游戏结束处理************************************/ void GameOver(void){Lcd_WriteStr(3,1," ");if((SysFlag&(1<<DEADFLAG))!=0){Lcd_WriteStr(3,1,"失败");Score=0;}else{// Lcd_WriteStr(3,1,"升级啦");Lcd_WriteStr(3,1,"成功!!!");Level++;Score=0;}while(change==1);}unsigned int code MaskTab[16]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020 ,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000 ,0x4000,0x8000};/********************************** 根据积木图标左下坐标 X,Y 来画出积木图标***********************************/ void DrawSign(struct Jimu Temp,unsigned char DrawMode){unsigned char m,n;for(m=0;m<4;m++)for(n=0;n<4;n++){if((Temp.dat&MaskTab[4*m+n])!=0)Lcd_Rectangle(Temp.x+n*3,Temp.y-2-3*m,T emp.x+n*3+2,Temp.y-3*m,DrawMode);}}/******************************** 将积木图标值融入 num 数据中也即把积木图标固定,无法再下降*********************************/ FixSign(void){unsigned char m,n;for(m=0;m<4;m++)// 行循环for(n=0;n<4;n++)// 列循环{if((Sign[0].dat&MaskTab[4*m+n])!=0)num[20-(Sign[0].y-2)/3+m]|=MaskTab[11-S ign[0].x/3-n];}}}/******************************** 判断积木图标中方块是否与障碍方块重合*********************************/ unsigned char CheckIf(void){unsigned char m,n;for(m=0;m<4;m++)// 行循环for(n=0;n<4;n++)// 列循环{if((Sign[1].dat&MaskTab[4*m+n])!=0){if((num[20-(Sign[1].y-2)/3+m]&MaskTab[1 1-Sign[1].x/3-n])!=0)return 0;}return 1;}/******************************** 判断积木图标是否可以继续下降一格********************************/ unsigned char CheckIfDown(void){Sign[1]=Sign[0];//Sign[1].y+=3;// 假设下降一格return CheckIf();}/******************************** 判断积木图标是否可以向左移动*********************************/ unsigned char CheckIfLeft(void){Sign[1]=Sign[0];Sign[1].x-=3;return CheckIf();}/******************************** 判断积木图标是否可以向右移动*********************************/ unsigned char CheckIfRight(void){Sign[1]=Sign[0];Sign[1].x+=3;return CheckIf();}/******************************** 判断是否可以旋转*********************************/ unsigned char CheckIfRoll(void){unsigned char i;unsigned int Temp;Sign[1]=Sign[0];if(++Sign[1].change>3)Sign[1].change=0;i=Sign[1].type*4+Sign[1].change;Temp=(unsigned int)Block[i][0]<<8;Temp=Temp|Block[i][1];Sign[1].dat=Temp;return CheckIf();}/******************************** 寻找满格的行并做消除处理最多寻找 4 个满行并做消除*********************************/void DelFull(void){unsigned char m,n;unsigned char Temp;unsigned char Flag=0;Temp=(Sign[0].y-2)/3;if(Temp>=20)// 防止越过了下边界Temp=1;elseTemp=20-Temp;for(n=Temp+3;n>=Temp;n--)// 积木图标的最顶行开始寻找满行比较有利于运算{if(num[n]==0xfff){Flag=1;for(m=n+1;m<=19;m++){num[m-1]=num[m];}num[m]=0x801;Score++;//每找到一个满行,则分数加 1 }}if(Flag)// 为加速而设置并判断的标志,有已固定的积木有满格消行变化则重画积木界面{for(m=Temp;m<=19;m++)// 为加速,不必要重第一行重画起,只需要从积木图标最下行开始往上的重画for(n=1;n<=10;n++){if((num[m]&MaskTab[n])==0){if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3) !=0)// 为加速而做的读象素操作{Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,0);}}else{if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3) ==0)// 为加速而做的读象素操作{Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,1);}}}}}/******************************* 随机产生一个积木图标放到预产生区域并显示出来********************************/ void CreatSign(void){unsigned char n;unsigned int Temp;DrawSign(Sign[2],0);// 先清除n=Random()*28;Temp=(unsigned int)Block[n][0]<<8;Temp=Temp|Block[n][1];Sign[2].dat=Temp;Sign[2].x=45;Sign[2].y=4*3+2;Sign[2].type=n/4;Sign[2].change=n%4;DrawSign(Sign[2],1);// 后画出}void PrintScore(void){unsigned char Str[3];Str[0]=(Score/10)|0x30;Str[1]=(Score%10)|0x30;Str[2]=0;Lcd_WriteStr(6,2,Str);}void PrintLevel(void){unsigned char Str[3];Str[0]=(Level/10)|0x30;Str[1]=(Level%10)|0x30;Str[2]=0;Lcd_WriteStr(6,3,Str);}/******************************** 游戏的具体过程,也是俄罗斯方块算法的关键部分*********************************/void GamePlay(void){unsigned char m,n;unsigned int Temp; SysFlag|=1<<NEWSIGNFLAG;// 刚开始初始化为需要产生新的积木图标InitRandom(TL0);Lcd_WriteStr(3,1,"游戏中....");PrintScore();PrintLevel();CreatSign();while(1){if((SysFlag&(1<<NEWSIGNFLAG))==1)// 判是否需要产生新的积木图标{SysFlag&=~(1<<NEWSIGNFLAG);Sign[0]=Sign[2];CreatSign();Sign[0].x=12;Sign[0].y=14;for(m=0;m<4;m++)// 行循环{for(n=0;n<4;n++)// 列循环{if((Sign[0].dat&MaskTab[15-m*4-n])==0) break;}if(n==4)Sign[0].y-=3;}// 将积木图标出现置顶for(m=0;m<4;m++)// 行循环for(n=0;n<4;n++)// 列循环{if((Sign[0].dat&MaskTab[4*m+n])!=0){if((num[20-(Sign[0].y-2)/3+m]&MaskTab[1 1-Sign[0].x/3-n])!=0)SysFlag|=1<<DEADFLAG;}}if((SysFlag&(1<<DEADFLAG))!=0) break;//如果产生新的积木图标中的方块与已固定好的方块重合,则死亡。

基于单片机的俄罗斯方块游戏

基于单片机的俄罗斯方块游戏
实际运行表明,该设计可以实现基本的游戏功能,达到游戏的目的。
【关键词】12C5A60SR;LCD液晶;C语言
Tetris game based on single chip microcomputer
Abstract
Tetris is one of the most classic electronic game, it had caused a sensation is really can not be underestimated. This design is the use of C programming language based on 12C5A60SR microcontroller, design the physical circuit diagrams to model the Tetris game. The game needs to use the keys to control block movement, game player can be 90 degrees rotate, by a lattice units moving boxes around, when the region in a row are filled by the box, the guild to disappear and score, the number of columns, and eliminate scores more; when the box at the top of pile to areas not to eliminate, the end of the game.
The actual operation shows that, the design can achieve the basic game functions, achieve the goal of the game.

51单片机128X64lcd上同时玩贪吃蛇和俄罗斯方块

51单片机128X64lcd上同时玩贪吃蛇和俄罗斯方块

目录摘要 (3)Abstract. (4)0文献综述 (5)0.1研究背景 (5)0.2研究现状 (5)0.3本人的研究思路 (5)1引言 (7)1.1 任务 (7)1.2 多任务 (7)1.3 中断 (7)1.4 任务切换 (7)1.5 时钟节拍 (8)1.6 代码的临界段 (8)1.7 可重入函数 (8)1.8 调度 (9)1.9 空闲任务 (9)2 KEIL平台上的C语言 (9)2.1 从C到C51 (9)2.2 C51中代码和数据的存储区域和访问方式 (9)2.3 编译模式 (10)2.4 指针 (10)2.5 C51中的可重入函数 (11)2.6 C51函数参数和返回值的传递 (11)2.7 C语言和汇编语言混合编程 (13)3 以KEIL为开发平台基于AT89C51单片机的多任务调度器设计 (14)3.1创建任务 (16)3.2任务堆栈初始化 (17)3.3任务控制块初始化 (20)3.4任务切换系统函数 (20)3.5时钟中断处理函数 (22)3.6任务延时 (22)4具体实例的设计 (23)4.1 ampire 128X64lcd显示驱动设计 (23)4.2 按键电路设计 (26)4.3 贪吃蛇和俄罗斯方块的设计 (26)5 结论 (29)附录 (30)参考文献 (44)致谢 (45)基于单片机的多任务程序设计李洋西南大学工程技术学院,重庆 400716摘要:本文介绍了基于AT89C51单片机的多任务程序设计。

首先介绍了多任务系统的基本概念,然后设计了以KEIL为开发平台基于AT89C51单片机的多任务调度器,主要实现了任务调度函数、时钟中断处理函数、任务创建函数、任务堆栈初始化函数以及系统延时函数。

最后编写了在128X64 LCD上同时显示俄罗斯方块和贪吃蛇游戏的实例,并给出了游戏流程图和硬件电路图。

本课题所设计的多任务系统具有结构简单,使用方便灵活的特点。

关键词:单片机;多任务;调度器;128X64LCDmultitask program design based on MCULI Y angCollege of Engineering and Technology, Southwest University, Chongqing 400716,ChinaAbstract: This article describes the design of multi-tasking program based on A T89C51 microcontroller. First introduces the basic concepts of multi-tasking system, and then design the A T89C51 microcontroller-based task scheduling, task scheduling function to KEIL development platform, the clock interrupt handler, the task creation function, task stack initialization function, and the system delay function. Last written on 128X64 the LCD display an instance of the game of Tetris and Snack, and the flow chart of the game and the hardware circuit. This project designed by the multi-tasking system has a simple structure, easy to use and flexible features.Key Words: MCU; multitasking; scheduling; 128X64LCD0文献综述0.1研究背景单片机系统是嵌入式系统中十分重要的组成部分,在智能控制领域和测试系统中有着非常广泛的应用。

(完整word版)基于单片机的俄罗斯方块游戏机课程设计

(完整word版)基于单片机的俄罗斯方块游戏机课程设计
手动按钮复位需要人为在复位输入端RST上加入高电平(图1)。一般采用的办法是在RST端和正电源Vcc之间接一个按钮。当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。手动按钮复位的电路如所示。由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求.复位电路连接如图所示:
RST
复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲.对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
P2口
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口P2写"1",通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号.
P3口
P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入”1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。

开题报告基于单片机的俄罗斯方块游戏系统的设计

开题报告基于单片机的俄罗斯方块游戏系统的设计

开题报告基于单片机的俄罗斯方块游戏系统的设计毕业设计开题报告题目基于单片机的俄罗斯方块游戏系统的设计一、本课题的研究背景俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。

这款游戏最初是由苏联的游戏制作人制作的,它看似简单但却变化无穷,令人上瘾。

相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。

究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。

现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。

对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在"联众俄罗斯方块"中,更有一些联众网络游戏所独有的魅力――有单机作战与两人在线对战两种模式,用户可任选一种进行游戏。

网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。

俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏, 深受广大玩家喜爱。

这个游戏有的简单, 有的复杂, 但其根本原理是一样的都是对运动的方块进行组合, 来训练玩家的反应能力。

本文利用单片机进行俄罗斯方块设计,采用51汇编语言进行编程,基于汇编语言的原因是在编写程序的过程中,对于程序的执行会有一个比较直观的表现。

二、国内外研究现状1984年6月.俄罗斯科学院的数学家帕基特诺夫在空闲时编出了一个游戏程序.用来测试计算机的性能。

帕基特诺夫从拼图游戏里得到灵感,设计出了俄罗斯方块。

最早的俄罗斯方块背景颜色图案单一,发展到今天,各种版本的画面变得多姿多彩。

虽最初版本没有积分和通关,但帕基特诺夫仍然玩上了瘾。

这样一种看来粗糙的游戏.却在当年迅速受到欢迎。

1988年,罗杰斯在美国的一个展览上看到了俄罗斯方块。

觉得非常好玩,并从中立刻嗅到了巨大商机。

他先与日本游戏厂商任天堂达成口头协议。

然后出发前往莫斯科与莫斯科科学院谈判,最终罗杰斯于1989年代表任天堂取得了俄罗斯方块在家用机上的授权。

基于单片机的俄罗斯方块游戏系统的设计

基于单片机的俄罗斯方块游戏系统的设计

摘要俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。

俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。

由于上手简单、老少皆宜,从而家喻户晓,风靡世界。

这次设计将使用52单片机和HD61202液晶显示控制驱动器和JM12864J液晶显示器组合,来实现比较简单的俄罗斯方块设计。

此次设计初期是在keil和proteus联合仿真中进行,编程语言为51汇编,后期是进行实物焊接。

论文描述了俄罗斯方块的主要功能函数的实现。

关键词:俄罗斯方块,算法,仿真AbstractTetris is a popular television game machine and game machine game, which Alexei Pajitnov invented by Russians, it was this name. Tetris are the basic rules of movement, rotation and display the game automatically output of the box, which are arranged into a complete one or more rows and eliminate scores. Due to use simple, ages, thus make known to every family, swept the world.Based on single chip computer of the curriculum design of opportunity, I will use the 51 single-chip microcomputer and HD61202 LCD control driver and JM12864J liquid crystal display combination, to carry out a more simple Russian square design.This design is in early keil and proteus joint simulation, programming language for 51 assembly, later is welding material.The paper describes the main functions of the Russian box function of the realization of.Keywords:Russian square, Algorithm, Simulation目录摘要 (1)Abstract (2)目录 (1)引言 (1)1整体设计方案....................................................................................... 错误!未定义书签。

基于51与12864的俄罗斯方块

基于51与12864的俄罗斯方块

参考网上资料,编写了一个俄罗斯方块,使用LCD12864显示。

效果自我感觉还可以。

界面如下:仿真界面(原文件名:方块.JPG)程序:#include <AT89C51.H>#define uchar unsigned char#define uint unsigned int#define DOWNTIME 30#define MAXHANG 20#define MAXLIE 16#define MAXPIX 3#define PUSHON 50#define LCD P2#define EN P3_0#define RW P3_1#define RS P3_2#define CS1 P3_3#define CS2 P3_4#define KEYLEFT P3_5#define KEYDOWN P3_6#define KEYRIGH P3_7#define KEYROTATION P1_0uchar gkey=0xff,keystate=0,t0ms1=0,t0ms=0,downtimegap=0; uchar miao=0,fen=0;uchar downok;bit keyflag,timeupdate,fashionupdate;uchar idata cubeMap[MAXHANG][2];typedef struct{uchar code * box;uchar cube : 4;uchar state : 4;char row;char column;} block;block this;uint score=0;uchar speed=1;uchar code bittable[8]={1,2,4,8,0x10,0x20,0x40,0x80}; uchar code cube[]={/* ■■■■*/0,4,0xe,0, 0,2,6,2, 0,7,2,0, 4,6,4,0,/*■■■■*/0,8,0xe,0, 0,4,4,0xc, 0,0,0xe,2, 0,6,4,4,/*■■■■*/0,0xe,8,0, 0,4,4,6, 0,1,7,0, 6,2,2,0, /*■■■■*/0,0xc,6,0, 0,2,6,4, 0,6,3,0, 2,6,4,0, /* ■■■■*/0,6,0xc,0, 0,4,6,2, 0,3,6,0, 4,6,2,0, /*■■■■*/0,0xf,0,0, 4,4,4,4, 0,0,0xf,0, 2,2,2,2, /*■■■■*/0,6,6,0, 0,6,6,0, 0,6,6,0, 0,6,6,0};uchar code asii[]={0x3E,0x51,0x49,0x45,0x3E, // -0-0x00,0x42,0x7F,0x40,0x00, // -1-0x62,0x51,0x49,0x49,0x46, // -2-0x21,0x41,0x49,0x4D,0x33, // -3-0x18,0x14,0x12,0x7F,0x10, // -4-0x27,0x45,0x45,0x45,0x39, // -5-0x3C,0x4A,0x49,0x49,0x31, // -6-0x01,0x71,0x09,0x05,0x03, // -7-0x36,0x49,0x49,0x49,0x36, // -8-0x46,0x49,0x49,0x29,0x1E, // -9-0x00,0x36,0x36,0x00,0x00, // -:-10//next0x7F,0x04,0x08,0x10,0x7F, // -N-110x7F,0x49,0x49,0x49,0x41, // -E-120x63,0x14,0x08,0x14,0x63, // -X-130x01,0x01,0x7F,0x01,0x01, // -T-14//speed0x26,0x49,0x49,0x49,0x32, // -S-150x7F,0x09,0x09,0x09,0x06, // -P-160x7F,0x49,0x49,0x49,0x41, // -E-170x7F,0x41,0x41,0x41,0x3E, // -D-18//score0x3E,0x41,0x41,0x41,0x22, // -C-190x3E,0x41,0x41,0x41,0x3E, // -O-200x7F,0x09,0x19,0x29,0x46, // -R-210x00,0x00,0x00,0x00,0x00, // - -22//GAME OVER0x3E,0x41,0x51,0x51,0x72, // -G-230x7C,0x12,0x11,0x12,0x7C, // -A-240x7F,0x02,0x0C,0x02,0x7F, // -M-250x1F,0x20,0x40,0x20,0x1F, // -V-26//TIME// 0x00,0x41,0x7F,0x41,0x00 // -I-27};//////////////////////////////////////////////////////////////////////////////// void lcdCmd(uchar cmd){bit ea;ea=EA;EA=0;EN=0;RW=0;RS=0;LCD=cmd;EN=1;EN=1;EN=0;EA=ea;}//------------------------------------------------------------------------------- void lcdWriteByte(uchar ch){EN=0;RS=1;RW=0;LCD=ch;EN=1;EN=1;EN=0;}//-------------------------------------------------------------------------------- void lcdSetPage(uchar page){page &=0x7;page +=0xb8;lcdCmd(page);}//-------------------------------------------------------------------------------- void lcdSetColumn(uchar column){column &=0x3f;column +=0x40;lcdCmd(column);}//-------------------------------------------------------------------------------- //character fron=5*8void lcdPlayChar(uchar index,uchar page,uchar colume){uchar i,temp;uint p;p=5*index;for(i=colume;i<colume+5;i++){if(i<64){CS1=1;CS2=0;temp=i;}else{CS1=0;CS2=1;temp=i-64;}lcdSetPage(page);lcdSetColumn(temp);lcdWriteByte(asii[p++]);}}//--------------------------------------------------------------------------------- //rectangle(3,0,50,60)void rectangle(void){uchar i,page;CS1=1;CS2=0;lcdSetPage(0);lcdSetColumn(2);EN=0;RS=1;RW=0;LCD=0xff;EN=1;EN=1;EN=0;for(i=3;i<51;i++){EN=0;RS=1;RW=0;LCD=0x1;EN=1;EN=1;EN=0;}EN=0;RW=0;LCD=0xff;EN=1;EN=1;EN=0;//--------------------------- for(page=1;page<7;page++) {lcdSetPage(page);lcdSetColumn(2);EN=0;RS=1;RW=0;LCD=0xff;EN=1;EN=1;EN=0;for(i=3;i<51;i++){EN=0;RS=1;RW=0;LCD=0x0;EN=1;EN=1;EN=0;}EN=0;RS=1;RW=0;LCD=0xff;EN=1;EN=1;EN=0;}//--------------------------- lcdSetPage(7);lcdSetColumn(2);EN=0;RS=1;RW=0;LCD=0x1f;EN=1;EN=0;for(i=3;i<51;i++){EN=0;RS=1;RW=0;LCD=0x10;EN=1;EN=1;EN=0;}EN=0;RS=1;RW=0;LCD=0x1f;EN=1;EN=1;EN=0;}//-------------------------------------------------------------------- //x:列;y行,页3*3void lcdPutPix(uchar x, uchar y,uchar flag){uchar i,dat,bitmask,nextbit;bit bflag,pflag,ea;x=x*MAXPIX;y=y*MAXPIX;bflag=0;pflag=0;i=y%8;if(i==0)bitmask=0x7;else if(i==1)bitmask=0xe;else if(i==2)bitmask=0x1c;else if(i==3)bitmask=0x38;else if(i==4)bitmask=0x70;else if(i==5)bitmask=0xe0;else if(i==6)bflag=1;bitmask=0xc0;nextbit=1;}else if(i==7){bflag=1;bitmask=0x80;nextbit=3;}if(x<62){CS1=1;CS2=0;}else if(x>63){x-=64;CS1=0;CS2=1;}elsepflag=1;lcdSetPage(y/8);for(i=x;i<x+MAXPIX;i++){if(pflag){if(i==62 || i==63){CS1=1;CS2=0;lcdSetPage(y/8);}else if(pflag && i==64){CS1=0;CS2=1;lcdSetPage(y/8);}}lcdSetColumn(i);ea=EA;EN=0;LCD=0xff;RS=1;RW=1;EN=1;EN=0;EN=1;dat=LCD;EN=0;if(flag==1)dat|=bitmask;elsedat&=~bitmask;lcdSetColumn(i);EN=0;RW=0;RS=1;LCD=dat;EN=1;EN=1;EN=0;EA=ea;}if(bflag){lcdSetPage(y/8+1);for(i=x;i<x+MAXPIX;i++){if(pflag){if(i==62 || i==63){CS1=1;CS2=0;lcdSetPage(y/8+1);}else if(pflag && i==64){CS1=0;CS2=1;lcdSetPage(y/8+1);}lcdSetColumn(i);ea=EA;EA=0;EN=0;LCD=0xff;RS=1;RW=1;EN=1;EN=0;EN=1;dat=LCD;EN=0;if(flag==1)dat|=nextbit;elsedat&=~nextbit;lcdSetColumn(i);EN=0;RW=0;RS=1;LCD=dat;EN=1;EN=1;EN=0;EA=ea;}}}//------------------------------------------------------------------ void lcdClear(void){uchar i,page;CS1=1;CS2=0;for(page=0;page<8;page++){lcdSetPage(page);lcdSetColumn(0);for(i=0;i<64;i++)lcdWriteByte(0);}CS1=0;CS2=1;for(page=0;page<8;page++){lcdSetPage(page);lcdSetColumn(0);for(i=0;i<64;i++)lcdWriteByte(0);}}//----------------------------------------------------------------- #define STAR 53#define WIDE 6void lcdIni(void){lcdCmd(0x3f);lcdCmd(0xc0);lcdClear();rectangle();//NEXTlcdPlayChar(11,0,STAR);lcdPlayChar(12,0,STAR+1*WIDE);lcdPlayChar(13,0,STAR+2*WIDE);lcdPlayChar(14,0,STAR+3*WIDE);//SPEEDlcdPlayChar(15,3,STAR);lcdPlayChar(16,3,STAR+1*WIDE);lcdPlayChar(17,3,STAR+2*WIDE);lcdPlayChar(17,3,STAR+3*WIDE);lcdPlayChar(18,3,STAR+4*WIDE);//01lcdPlayChar(0,4,STAR+2*WIDE);lcdPlayChar(1,4,STAR+3*WIDE);//SCORElcdPlayChar(15,5,STAR);lcdPlayChar(19,5,STAR+1*WIDE);lcdPlayChar(20,5,STAR+2*WIDE);lcdPlayChar(21,5,STAR+3*WIDE);lcdPlayChar(12,5,STAR+4*WIDE);lcdPlayChar(0,6,STAR+1*WIDE);lcdPlayChar(0,6,STAR+2*WIDE);lcdPlayChar(0,6,STAR+3*WIDE);lcdPlayChar(0,6,STAR+4*WIDE);//TIMElcdPlayChar(0,7,STAR);lcdPlayChar(0,7,STAR+1*WIDE);lcdPlayChar(10,7,STAR+2*WIDE);lcdPlayChar(0,7,STAR+3*WIDE);lcdPlayChar(0,7,STAR+4*WIDE);}//----------------------------------------------------------------- void showScoreSpeed(void){uchar num[5];char i;uint temp;temp=score;for(i=0;i<5;i++){num[i]=temp%10;temp=temp/10;}for(i=4;i>0;i--){if(num[i]==0)num[i]=22;elsebreak;}for(i=4;i>-1;i--)lcdPlayChar(num[i],6,STAR+(4-i)*WIDE);lcdPlayChar(speed/10,4,STAR+2*WIDE);lcdPlayChar(speed%10,4,STAR+3*WIDE);}//------------------------------------------------------------------- void timeServer(void){if(timeupdate){timeupdate=0;lcdPlayChar(fen/10,7,STAR);lcdPlayChar(fen%10,7,STAR+1*WIDE);lcdPlayChar(10,7,STAR+2*WIDE);lcdPlayChar(miao/10,7,STAR+3*WIDE);lcdPlayChar(miao%10,7,STAR+4*WIDE);}if(fashionupdate){fashionupdate=0;lcdPlayChar(22,7,STAR+2*WIDE);}}//=================================================================== void t0isr(void) interrupt 1{uchar key;TH0=(65536-10000)/256;TL0=(65536-10000)%256;downtimegap++;t0ms=++t0ms%100;if(t0ms==0){timeupdate=1;miao=++miao%60;if(miao==0)fen=++fen%60;}if(t0ms==50)fashionupdate=1;//----------------------------key=0xff;KEYLEFT=1;KEYRIGH=1;KEYROTATION=1;KEYDOWN=1;if(!KEYLEFT)key=0;if(!KEYRIGH)key=1;if(!KEYROTATION)key=2;if(!KEYDOWN)key=3;switch(keystate){case 0: if(key!=gkey){gkey=key;keystate=1;}break;case 1: if(key==gkey){t0ms1=0;keystate=2;if(key!=0xff)keyflag=1;}elsekeystate=0;break;case 2: if(key==gkey){if(t0ms1<PUSHON)t0ms1++;}else{keystate=0;keyflag=0;gkey=0xff;}break;}}//=================================================================== void showNextCube(uchar code * p,uchar x,uchar y){uchar i,j,temp;for(i=0;i<4;i++){temp=1;for(j=0;j<4;j++){if(p[i] & temp)lcdPutPix(x+j,y+i,1);elselcdPutPix(x+j,y+i,0);temp<<=1;}}}//------------------------------------------------------------------ void createCube(void){static uchar next;this.cube=next;next=TL0%7;this.row=0;this.column=6;this.state=0;this.box=cube+16*this.cube;showNextCube(cube+16*next,19,3);}//------------------------------------------------------------------ void showCubeMap(void){unsigned char hang,lie,temp;for(hang=MAXHANG-1;hang>0;hang--){if(cubeMap[hang][0]==0 && cubeMap[hang][1]==0)break;for(lie=0;lie<(MAXLIE/8);lie++){temp=8*lie;if(cubeMap[hang][lie]&0x01)lcdPutPix(temp+1,hang,1);if(cubeMap[hang][lie]&0x02)lcdPutPix(temp+2,hang,1);if(cubeMap[hang][lie]&0x04)lcdPutPix(temp+3,hang,1);if(cubeMap[hang][lie]&0x08)lcdPutPix(temp+4,hang,1);if(cubeMap[hang][lie]&0x10)lcdPutPix(temp+5,hang,1);if(cubeMap[hang][lie]&0x20)lcdPutPix(temp+6,hang,1);if(cubeMap[hang][lie]&0x40)lcdPutPix(temp+7,hang,1);if(cubeMap[hang][lie]&0x80)lcdPutPix(temp+8,hang,1);}}}//------------------------------------------------------------------- void writeCubeToMap(void){uchar row,column,temp;uchar hang,lie;for(row=0;row<4;row++){temp=1;for(column=0;column<4;column++){if(this.box[row] & temp){hang=this.row+row;lie=this.column+column;cubeMap[hang][lie/8] |=bittable[lie%8];lcdPutPix(lie+1,hang,1);}temp<<=1;}}}//------------------------------------------------------------------- void clearCubeFromMap(void){uchar row,column,temp;uchar hang,lie;for(row=0;row<4;row++){temp=1;for(column=0;column<4;column++){if(this.box[row] & temp){hang=this.row+row;lie=this.column+column;cubeMap[hang][lie/8] &=~bittable[lie%8];lcdPutPix(lie+1,hang,0);}temp<<=1;}}}//-------------------------------------------------------------------uchar checkBorder(void){if(this.box[3]!=0 && this.row>(MAXHANG-4))return 1;else if(this.box[2]!=0 && this.row>(MAXHANG-3))return 1;else if(this.box[1]!=0 && this.row>(MAXHANG-2))return 1;else if(this.box[0]!=0 && this.row>(MAXHANG-1))return 1;//---------------------if((this.box[0] & 0x01) || (this.box[1] & 0x01) || (this.box[2] & 0x01) ||(th is.box[3] & 0x01) ){if(this.column<0)return 1;}else if((this.box[0] & 0x02) || (this.box[1] & 0x02) || (this.box[2] & 0x02) ||(this.box[3] & 0x02) ){if(this.column<-1)return 1;}else if((this.box[0] & 0x04) || (this.box[1] & 0x04) || (this.box[2] & 0x04) ||(this.box[3] & 0x04) ){if(this.column<-2)return 1;}else if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08 ) ||(this.box[3] & 0x08) ){if(this.column<-3)return 1;}//---------------------if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08) ||(this.box[3] & 0x08) ){if(this.column>(MAXLIE-4))return 1;}else if((this.box[0] & 0x04) || (this.box[1] & 0x04) || (this.box[2] & 0x04) ||(this.box[3] & 0x04) ){if(this.column>(MAXLIE-3))return 1;}else if((this.box[0] & 0x02) || (this.box[1] & 0x02) || (this.box[2] & 0x02) ||(this.box[3] & 0x02) ){if(this.column>(MAXLIE-2))return 1;}else if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08) ||(this.box[3] & 0x08) ){if(this.column>(MAXLIE-1))return 1;}//--------------------return 0;}//------------------------------------------------------------------uchar checkClask(void){uchar row,column,temp;uchar hang,lie;for(row=0;row<4;row++){temp=1;for(column=0;column<4;column++){if(this.box[row] & temp){hang=this.row+row;lie=this.column+column;if(cubeMap[hang][lie/8] & bittable[lie%8])return 1;}temp<<=1;}}return 0;}//------------------------------------------------------------------- void checkMap(void){uchar i,j,delete;bit full;full=0;delete=0;for(i=MAXHANG-1;i>0;i--){if(cubeMap[i][0]==0 && cubeMap[i][1]==0)break;if(cubeMap[i][0]==0xff && cubeMap[i][1]==0xff){delete++;full=1;for(j=i;j>0;j--){cubeMap[j][0]=cubeMap[j-1][0];cubeMap[j][1]=cubeMap[j-1][1];}i++;cubeMap[0][0]=0;cubeMap[0][1]=0;}}if(full){if(delete==1)score++;else if(delete==2)score+=4;else if(delete==3)score+=9;else if(delete==4)score+=16;rectangle();showCubeMap();if(score<50)speed=1;else if(score<100)speed=2;else if(score<500)speed=3;else if(score<1000)speed=4;else if(score<5000)speed=5;else if(score<10000)speed=6;else if(score<20000)speed=7;else if(score<30000)speed=8;else if(score<40000)speed=9;else if(score<50000)speed=10;else if(score<60000)speed=11;elsespeed=12;showScoreSpeed();}}//------------------------------------------------------------------- void moveLeft(void){clearCubeFromMap();this.column--;if(checkBorder() || checkClask())this.column++;writeCubeToMap();}//------------------------------------------------------------------- void moveRigh(void){clearCubeFromMap();this.column++;if(checkBorder() || checkClask())this.column--;writeCubeToMap();}//------------------------------------------------------------------- void moveDown(void){clearCubeFromMap();this.row++;if(checkBorder() || checkClask()){this.row--;downok=1;}elsedownok=0;writeCubeToMap();if(downok)checkMap();}//------------------------------------------------------------------ void cubeRotation(void){uchar temp;temp=this.state;clearCubeFromMap();this.state=++this.state%4;this.box=cube+16*this.cube+4*this.state;if(checkBorder() || checkClask()){this.state=temp;this.box=cube+16*this.cube+4*this.state;}writeCubeToMap();}///////////////////////////////////////////////////////////////////// void main(void){TMOD=0x1;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;lcdIni();for(t0ms=0;t0ms<MAXHANG;t0ms++){cubeMap[t0ms][0]=0;cubeMap[t0ms][1]=0;}while(1){createCube();if(checkClask()){rectangle();#define SHOWSTAR 12#define GAP 8lcdPlayChar(23,2,SHOWSTAR); //GAMElcdPlayChar(24,2,SHOWSTAR+GAP);lcdPlayChar(25,2,SHOWSTAR+2*GAP);lcdPlayChar(12,2,SHOWSTAR+3*GAP);lcdPlayChar(20,4,SHOWSTAR); //OVERlcdPlayChar(26,4,SHOWSTAR+GAP);lcdPlayChar(12,4,SHOWSTAR+2*GAP);lcdPlayChar(21,4,SHOWSTAR+3*GAP);t0ms=0;while(t0ms<95);//延时2秒t0ms=0;while(t0ms<95);((void (code *) (void)) 0x0000) ( );}while(1){timeServer();if(keyflag){keyflag=0;t0ms1=0;if(gkey==0)moveLeft();if(gkey==1)moveRigh();if(gkey==2)cubeRotation();if(gkey==3)moveDown();}if(gkey==0 && t0ms1==PUSHON){t0ms1-=10;moveLeft();}if(gkey==1 && t0ms1==PUSHON) {t0ms1-=10;moveRigh();}if(gkey==3 && t0ms1==PUSHON) {t0ms1-=10;moveDown();}if(downtimegap>(DOWNTIME-speed)){moveDown();downtimegap=0;}if(downok){downok=0;break;}}}}。

基于51单片机的俄罗斯方块游戏毕业设计论文

基于51单片机的俄罗斯方块游戏毕业设计论文
本文探讨基于8051单片机硬件平台和RTX51 Tiny多任务实时操作系统的俄罗斯方块游戏的设计与实现,将理论与实践相结合。其主要目标是再现经典的俄罗斯方块游戏,并在此基础上实现双人单机对战游戏模式,以丰富产品功能,增强游戏的趣味性。
2
2.1 STC12C5A60S2单片机概述
STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051系列单片机,指令代码完全兼容传统8051,但速度快8~12倍。用户程序空间为60KB,片上集成1280字节RAM,具有EEPROM功能,能够额外储蓄1KB的数据。该单片机共有4个16位定时器,两个与传统8051兼容的定时器/计数器,即16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,此两路可编程计数器阵列(PCA)可用来再实现2个定时器。此外,STC12C5A60S2内部还集成MAX810专用复位电路,2路PWM,8路高速度10位A/D转换(250K/S),针对电机控制,强干扰场地合。
2.5复位系统
MCS51单片机通常采用上电自动复位和按钮复位两种方式。通常因为系统运行等需要,常常需要人工复位,本设计采用按钮复位的方式,即按下开关一定时间就能使RTS引脚端为高电平,从而使单片机复位。同时,简单复位电路中,干扰信号易串入复位端,由此可能会引起内部某些寄存器错误复位,这时可在RST引脚上接去耦电容。在STC12C5A60S2单片机中有两个复位端口,即RST/P4.7、RST2/P4.6,当晶振频率小于或等于12MHz时,使用RST端口。由于本设计使用外接12MHz的晶振作为振荡时钟,所以采用如图2-4所示的复位系统。

基于51单片机的俄罗斯方块游戏课设

基于51单片机的俄罗斯方块游戏课设

基于51单片机实现的俄罗斯方块游戏整体设计方案 (5)2.1系统的核心部分单片机 (5)2.1.1单片机的选择 (5)2.1.2AT89S52引脚功能描述 (7)2.1.3晶振特性 (9)2.2液晶显示模块 (10)2.2.1液晶显示控制驱动器HD61202的特点 (10)2.2.2液晶显示控制驱动器HD61202的引脚功能 (10)2.2.3液晶显示控制驱动器HD61202的指令系统 (11)2.2.4HD61202的软件设计 (12)2.2.5JM12864J的电路结构特点 (15)2.2.6JM12864J的应用 (16)2.2.7键盘电路 (17)3系统程序的设计 (18)3.1俄罗斯方块驱动流程图 (18)3.2俄罗斯方块所有绘图工作流程图 (19)3.3俄罗斯方块中按下键的流程图 (20)3.4俄罗斯方块所有绘图工作流程图 (21)附录1:C语言程序 (30)附录2:电路原理图 (59)整体设计方案1.1系统的核心部分单片机1.1.1单片机的选择单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。

单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。

通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。

因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。

单片机经过3代的发展,正朝着多功能、高性能、低电压、低功耗、低价格、大存储容量、强I/O功能及较好的结构兼容性方向发展。

其发展趋势不外乎以下几个方面:1.多功能单片机中尽可能地把所需要的存储器和I/O口都集成在一块芯片上,使得单片机可以实现更多的功能。

比如A/D、PWM、PCA(可编程计数器阵列)、WDT(监视定时器---看家狗)、高速I/O口及计数器的捕获/比较逻辑等。

有的单片机针对某一个应用领域,集成了相关的控制设备,以减少应用系统的芯片数量。

单片机课程设计报告-俄罗斯方块

单片机课程设计报告-俄罗斯方块
; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
; <i> Set the top of the stack to the highest location.
IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
四、调试过程
1、学号显示部分单独调试
这个在之前的很多实验中都有涉及,程序较为简单,语句也不复杂,本实验中才用的是并行动态显示,调试一次成功。
2、游戏程序调试相关
五、验收结果
下图为当时的整个实验装置:
实验中,游戏随机产生方块
按下控制键,方块旋转:
按下控制键,方块加速下落
方块下落到底部,最底层被填满:
最底层填满后,自动消去这一层:
三、
1.程序整体思路
单片机上的程序设计一般是一个大循环结构,对于俄罗斯方块的程序设计,首先产生一个伪随机数,其范围是0-6,分别对应俄罗斯方块中随机产生的七种方块,然后程序根据此数值所对应的图形模块装入RAM的固定区域内,紧接着将此图像写入LCD所对应的显示缓冲区中,显示程序将缓冲区内的内容显示在显示屏上,如果没有控制键按下,图形将自动向下移动。如果有键按下,程序将根据按下的键来改变图形存储区的值,同时程序将判断图形是否已到达边界,当图形最上层到达显示区顶部,则游戏结束,此时将清除显示缓冲的内容,游戏重新开始。
2.图形显示
QH12864T液晶显示器一共有128*64个像素点,本程序中每个像素点用一个坐标表示,左上角为(0,0),右下角为(128,64)。对于显示类的基本操作是任意点亮一个点,熄灭一个点,任意点亮n个点,灭掉n个点,如此一来游戏的第一个关键点就完成了。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

参考网上资料,编写了一个俄罗斯方块,使用LCD12864显示。

效果自我感觉还可以。

界面如下:仿真界面(原文件名:方块.JPG)程序:#include <AT89C51.H>#define uchar unsigned char#define uint unsigned int#define DOWNTIME 30#define MAXHANG 20#define MAXLIE 16#define MAXPIX 3#define PUSHON 50#define LCD P2#define EN P3_0#define RW P3_1#define RS P3_2#define CS1 P3_3#define CS2 P3_4#define KEYLEFT P3_5#define KEYDOWN P3_6#define KEYRIGH P3_7#define KEYROTATION P1_0uchar gkey=0xff,keystate=0,t0ms1=0,t0ms=0,downtimegap=0; uchar miao=0,fen=0;uchar downok;bit keyflag,timeupdate,fashionupdate;uchar idata cubeMap[MAXHANG][2];typedef struct{uchar code * box;uchar cube : 4;uchar state : 4;char row;char column;} block;block this;uint score=0;uchar speed=1;uchar code bittable[8]={1,2,4,8,0x10,0x20,0x40,0x80}; uchar code cube[]={/* ■■■■*/0,4,0xe,0, 0,2,6,2, 0,7,2,0, 4,6,4,0,/*■■■■*/0,8,0xe,0, 0,4,4,0xc, 0,0,0xe,2, 0,6,4,4,/*■■■■*/0,0xe,8,0, 0,4,4,6, 0,1,7,0, 6,2,2,0, /*■■■■*/0,0xc,6,0, 0,2,6,4, 0,6,3,0, 2,6,4,0, /* ■■■■*/0,6,0xc,0, 0,4,6,2, 0,3,6,0, 4,6,2,0, /*■■■■*/0,0xf,0,0, 4,4,4,4, 0,0,0xf,0, 2,2,2,2, /*■■■■*/0,6,6,0, 0,6,6,0, 0,6,6,0, 0,6,6,0};uchar code asii[]={0x3E,0x51,0x49,0x45,0x3E, // -0-0x00,0x42,0x7F,0x40,0x00, // -1-0x62,0x51,0x49,0x49,0x46, // -2-0x21,0x41,0x49,0x4D,0x33, // -3-0x18,0x14,0x12,0x7F,0x10, // -4-0x27,0x45,0x45,0x45,0x39, // -5-0x3C,0x4A,0x49,0x49,0x31, // -6-0x01,0x71,0x09,0x05,0x03, // -7-0x36,0x49,0x49,0x49,0x36, // -8-0x46,0x49,0x49,0x29,0x1E, // -9-0x00,0x36,0x36,0x00,0x00, // -:-10//next0x7F,0x04,0x08,0x10,0x7F, // -N-110x7F,0x49,0x49,0x49,0x41, // -E-120x63,0x14,0x08,0x14,0x63, // -X-130x01,0x01,0x7F,0x01,0x01, // -T-14//speed0x26,0x49,0x49,0x49,0x32, // -S-150x7F,0x09,0x09,0x09,0x06, // -P-160x7F,0x49,0x49,0x49,0x41, // -E-170x7F,0x41,0x41,0x41,0x3E, // -D-18//score0x3E,0x41,0x41,0x41,0x22, // -C-190x3E,0x41,0x41,0x41,0x3E, // -O-200x7F,0x09,0x19,0x29,0x46, // -R-210x00,0x00,0x00,0x00,0x00, // - -22//GAME OVER0x3E,0x41,0x51,0x51,0x72, // -G-230x7C,0x12,0x11,0x12,0x7C, // -A-240x7F,0x02,0x0C,0x02,0x7F, // -M-250x1F,0x20,0x40,0x20,0x1F, // -V-26//TIME// 0x00,0x41,0x7F,0x41,0x00 // -I-27};//////////////////////////////////////////////////////////////////////////////// void lcdCmd(uchar cmd){bit ea;ea=EA;EA=0;EN=0;RW=0;RS=0;LCD=cmd;EN=1;EN=1;EN=0;EA=ea;}//------------------------------------------------------------------------------- void lcdWriteByte(uchar ch){EN=0;RS=1;RW=0;LCD=ch;EN=1;EN=1;EN=0;}//-------------------------------------------------------------------------------- void lcdSetPage(uchar page){page &=0x7;page +=0xb8;lcdCmd(page);}//-------------------------------------------------------------------------------- void lcdSetColumn(uchar column){column &=0x3f;column +=0x40;lcdCmd(column);}//-------------------------------------------------------------------------------- //character fron=5*8void lcdPlayChar(uchar index,uchar page,uchar colume){uchar i,temp;uint p;p=5*index;for(i=colume;i<colume+5;i++){if(i<64){CS1=1;CS2=0;temp=i;}else{CS1=0;CS2=1;temp=i-64;}lcdSetPage(page);lcdSetColumn(temp);lcdWriteByte(asii[p++]);}}//--------------------------------------------------------------------------------- //rectangle(3,0,50,60)void rectangle(void){uchar i,page;CS1=1;CS2=0;lcdSetPage(0);lcdSetColumn(2);EN=0;RS=1;RW=0;LCD=0xff;EN=1;EN=1;EN=0;for(i=3;i<51;i++){EN=0;RS=1;RW=0;LCD=0x1;EN=1;EN=1;EN=0;}EN=0;RW=0;LCD=0xff;EN=1;EN=1;EN=0;//--------------------------- for(page=1;page<7;page++) {lcdSetPage(page);lcdSetColumn(2);EN=0;RS=1;RW=0;LCD=0xff;EN=1;EN=1;EN=0;for(i=3;i<51;i++){EN=0;RS=1;RW=0;LCD=0x0;EN=1;EN=1;EN=0;}EN=0;RS=1;RW=0;LCD=0xff;EN=1;EN=1;EN=0;}//--------------------------- lcdSetPage(7);lcdSetColumn(2);EN=0;RS=1;RW=0;LCD=0x1f;EN=1;EN=0;for(i=3;i<51;i++){EN=0;RS=1;RW=0;LCD=0x10;EN=1;EN=1;EN=0;}EN=0;RS=1;RW=0;LCD=0x1f;EN=1;EN=1;EN=0;}//-------------------------------------------------------------------- //x:列;y行,页3*3void lcdPutPix(uchar x, uchar y,uchar flag){uchar i,dat,bitmask,nextbit;bit bflag,pflag,ea;x=x*MAXPIX;y=y*MAXPIX;bflag=0;pflag=0;i=y%8;if(i==0)bitmask=0x7;else if(i==1)bitmask=0xe;else if(i==2)bitmask=0x1c;else if(i==3)bitmask=0x38;else if(i==4)bitmask=0x70;else if(i==5)bitmask=0xe0;else if(i==6)bflag=1;bitmask=0xc0;nextbit=1;}else if(i==7){bflag=1;bitmask=0x80;nextbit=3;}if(x<62){CS1=1;CS2=0;}else if(x>63){x-=64;CS1=0;CS2=1;}elsepflag=1;lcdSetPage(y/8);for(i=x;i<x+MAXPIX;i++){if(pflag){if(i==62 || i==63){CS1=1;CS2=0;lcdSetPage(y/8);}else if(pflag && i==64){CS1=0;CS2=1;lcdSetPage(y/8);}}lcdSetColumn(i);ea=EA;EN=0;LCD=0xff;RS=1;RW=1;EN=1;EN=0;EN=1;dat=LCD;EN=0;if(flag==1)dat|=bitmask;elsedat&=~bitmask;lcdSetColumn(i);EN=0;RW=0;RS=1;LCD=dat;EN=1;EN=1;EN=0;EA=ea;}if(bflag){lcdSetPage(y/8+1);for(i=x;i<x+MAXPIX;i++){if(pflag){if(i==62 || i==63){CS1=1;CS2=0;lcdSetPage(y/8+1);}else if(pflag && i==64){CS1=0;CS2=1;lcdSetPage(y/8+1);}lcdSetColumn(i);ea=EA;EA=0;EN=0;LCD=0xff;RS=1;RW=1;EN=1;EN=0;EN=1;dat=LCD;EN=0;if(flag==1)dat|=nextbit;elsedat&=~nextbit;lcdSetColumn(i);EN=0;RW=0;RS=1;LCD=dat;EN=1;EN=1;EN=0;EA=ea;}}}//------------------------------------------------------------------ void lcdClear(void){uchar i,page;CS1=1;CS2=0;for(page=0;page<8;page++){lcdSetPage(page);lcdSetColumn(0);for(i=0;i<64;i++)lcdWriteByte(0);}CS1=0;CS2=1;for(page=0;page<8;page++){lcdSetPage(page);lcdSetColumn(0);for(i=0;i<64;i++)lcdWriteByte(0);}}//----------------------------------------------------------------- #define STAR 53#define WIDE 6void lcdIni(void){lcdCmd(0x3f);lcdCmd(0xc0);lcdClear();rectangle();//NEXTlcdPlayChar(11,0,STAR);lcdPlayChar(12,0,STAR+1*WIDE);lcdPlayChar(13,0,STAR+2*WIDE);lcdPlayChar(14,0,STAR+3*WIDE);//SPEEDlcdPlayChar(15,3,STAR);lcdPlayChar(16,3,STAR+1*WIDE);lcdPlayChar(17,3,STAR+2*WIDE);lcdPlayChar(17,3,STAR+3*WIDE);lcdPlayChar(18,3,STAR+4*WIDE);//01lcdPlayChar(0,4,STAR+2*WIDE);lcdPlayChar(1,4,STAR+3*WIDE);//SCORElcdPlayChar(15,5,STAR);lcdPlayChar(19,5,STAR+1*WIDE);lcdPlayChar(20,5,STAR+2*WIDE);lcdPlayChar(21,5,STAR+3*WIDE);lcdPlayChar(12,5,STAR+4*WIDE);lcdPlayChar(0,6,STAR+1*WIDE);lcdPlayChar(0,6,STAR+2*WIDE);lcdPlayChar(0,6,STAR+3*WIDE);lcdPlayChar(0,6,STAR+4*WIDE);//TIMElcdPlayChar(0,7,STAR);lcdPlayChar(0,7,STAR+1*WIDE);lcdPlayChar(10,7,STAR+2*WIDE);lcdPlayChar(0,7,STAR+3*WIDE);lcdPlayChar(0,7,STAR+4*WIDE);}//----------------------------------------------------------------- void showScoreSpeed(void){uchar num[5];char i;uint temp;temp=score;for(i=0;i<5;i++){num[i]=temp%10;temp=temp/10;}for(i=4;i>0;i--){if(num[i]==0)num[i]=22;elsebreak;}for(i=4;i>-1;i--)lcdPlayChar(num[i],6,STAR+(4-i)*WIDE);lcdPlayChar(speed/10,4,STAR+2*WIDE);lcdPlayChar(speed%10,4,STAR+3*WIDE);}//------------------------------------------------------------------- void timeServer(void){if(timeupdate){timeupdate=0;lcdPlayChar(fen/10,7,STAR);lcdPlayChar(fen%10,7,STAR+1*WIDE);lcdPlayChar(10,7,STAR+2*WIDE);lcdPlayChar(miao/10,7,STAR+3*WIDE);lcdPlayChar(miao%10,7,STAR+4*WIDE);}if(fashionupdate){fashionupdate=0;lcdPlayChar(22,7,STAR+2*WIDE);}}//=================================================================== void t0isr(void) interrupt 1{uchar key;TH0=(65536-10000)/256;TL0=(65536-10000)%256;downtimegap++;t0ms=++t0ms%100;if(t0ms==0){timeupdate=1;miao=++miao%60;if(miao==0)fen=++fen%60;}if(t0ms==50)fashionupdate=1;//----------------------------key=0xff;KEYLEFT=1;KEYRIGH=1;KEYROTATION=1;KEYDOWN=1;if(!KEYLEFT)key=0;if(!KEYRIGH)key=1;if(!KEYROTATION)key=2;if(!KEYDOWN)key=3;switch(keystate){case 0: if(key!=gkey){gkey=key;keystate=1;}break;case 1: if(key==gkey){t0ms1=0;keystate=2;if(key!=0xff)keyflag=1;}elsekeystate=0;break;case 2: if(key==gkey){if(t0ms1<PUSHON)t0ms1++;}else{keystate=0;keyflag=0;gkey=0xff;}break;}}//=================================================================== void showNextCube(uchar code * p,uchar x,uchar y){uchar i,j,temp;for(i=0;i<4;i++){temp=1;for(j=0;j<4;j++){if(p[i] & temp)lcdPutPix(x+j,y+i,1);elselcdPutPix(x+j,y+i,0);temp<<=1;}}}//------------------------------------------------------------------ void createCube(void){static uchar next;this.cube=next;next=TL0%7;this.row=0;this.column=6;this.state=0;this.box=cube+16*this.cube;showNextCube(cube+16*next,19,3);}//------------------------------------------------------------------ void showCubeMap(void){unsigned char hang,lie,temp;for(hang=MAXHANG-1;hang>0;hang--){if(cubeMap[hang][0]==0 && cubeMap[hang][1]==0)break;for(lie=0;lie<(MAXLIE/8);lie++){temp=8*lie;if(cubeMap[hang][lie]&0x01)lcdPutPix(temp+1,hang,1);if(cubeMap[hang][lie]&0x02)lcdPutPix(temp+2,hang,1);if(cubeMap[hang][lie]&0x04)lcdPutPix(temp+3,hang,1);if(cubeMap[hang][lie]&0x08)lcdPutPix(temp+4,hang,1);if(cubeMap[hang][lie]&0x10)lcdPutPix(temp+5,hang,1);if(cubeMap[hang][lie]&0x20)lcdPutPix(temp+6,hang,1);if(cubeMap[hang][lie]&0x40)lcdPutPix(temp+7,hang,1);if(cubeMap[hang][lie]&0x80)lcdPutPix(temp+8,hang,1);}}}//------------------------------------------------------------------- void writeCubeToMap(void){uchar row,column,temp;uchar hang,lie;for(row=0;row<4;row++){temp=1;for(column=0;column<4;column++){if(this.box[row] & temp){hang=this.row+row;lie=this.column+column;cubeMap[hang][lie/8] |=bittable[lie%8];lcdPutPix(lie+1,hang,1);}temp<<=1;}}}//------------------------------------------------------------------- void clearCubeFromMap(void){uchar row,column,temp;uchar hang,lie;for(row=0;row<4;row++){temp=1;for(column=0;column<4;column++){if(this.box[row] & temp){hang=this.row+row;lie=this.column+column;cubeMap[hang][lie/8] &=~bittable[lie%8];lcdPutPix(lie+1,hang,0);}temp<<=1;}}}//-------------------------------------------------------------------uchar checkBorder(void){if(this.box[3]!=0 && this.row>(MAXHANG-4))return 1;else if(this.box[2]!=0 && this.row>(MAXHANG-3))return 1;else if(this.box[1]!=0 && this.row>(MAXHANG-2))return 1;else if(this.box[0]!=0 && this.row>(MAXHANG-1))return 1;//---------------------if((this.box[0] & 0x01) || (this.box[1] & 0x01) || (this.box[2] & 0x01) ||(th is.box[3] & 0x01) ){if(this.column<0)return 1;}else if((this.box[0] & 0x02) || (this.box[1] & 0x02) || (this.box[2] & 0x02) ||(this.box[3] & 0x02) ){if(this.column<-1)return 1;}else if((this.box[0] & 0x04) || (this.box[1] & 0x04) || (this.box[2] & 0x04) ||(this.box[3] & 0x04) ){if(this.column<-2)return 1;}else if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08 ) ||(this.box[3] & 0x08) ){if(this.column<-3)return 1;}//---------------------if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08) ||(this.box[3] & 0x08) ){if(this.column>(MAXLIE-4))return 1;}else if((this.box[0] & 0x04) || (this.box[1] & 0x04) || (this.box[2] & 0x04) ||(this.box[3] & 0x04) ){if(this.column>(MAXLIE-3))return 1;}else if((this.box[0] & 0x02) || (this.box[1] & 0x02) || (this.box[2] & 0x02) ||(this.box[3] & 0x02) ){if(this.column>(MAXLIE-2))return 1;}else if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08) ||(this.box[3] & 0x08) ){if(this.column>(MAXLIE-1))return 1;}//--------------------return 0;}//------------------------------------------------------------------uchar checkClask(void){uchar row,column,temp;uchar hang,lie;for(row=0;row<4;row++){temp=1;for(column=0;column<4;column++){if(this.box[row] & temp){hang=this.row+row;lie=this.column+column;if(cubeMap[hang][lie/8] & bittable[lie%8])return 1;}temp<<=1;}}return 0;}//------------------------------------------------------------------- void checkMap(void){uchar i,j,delete;bit full;full=0;delete=0;for(i=MAXHANG-1;i>0;i--){if(cubeMap[i][0]==0 && cubeMap[i][1]==0)break;if(cubeMap[i][0]==0xff && cubeMap[i][1]==0xff){delete++;full=1;for(j=i;j>0;j--){cubeMap[j][0]=cubeMap[j-1][0];cubeMap[j][1]=cubeMap[j-1][1];}i++;cubeMap[0][0]=0;cubeMap[0][1]=0;}}if(full){if(delete==1)score++;else if(delete==2)score+=4;else if(delete==3)score+=9;else if(delete==4)score+=16;rectangle();showCubeMap();if(score<50)speed=1;else if(score<100)speed=2;else if(score<500)speed=3;else if(score<1000)speed=4;else if(score<5000)speed=5;else if(score<10000)speed=6;else if(score<20000)speed=7;else if(score<30000)speed=8;else if(score<40000)speed=9;else if(score<50000)speed=10;else if(score<60000)speed=11;elsespeed=12;showScoreSpeed();}}//------------------------------------------------------------------- void moveLeft(void){clearCubeFromMap();this.column--;if(checkBorder() || checkClask())this.column++;writeCubeToMap();}//------------------------------------------------------------------- void moveRigh(void){clearCubeFromMap();this.column++;if(checkBorder() || checkClask())this.column--;writeCubeToMap();}//------------------------------------------------------------------- void moveDown(void){clearCubeFromMap();this.row++;if(checkBorder() || checkClask()){this.row--;downok=1;}elsedownok=0;writeCubeToMap();if(downok)checkMap();}//------------------------------------------------------------------ void cubeRotation(void){uchar temp;temp=this.state;clearCubeFromMap();this.state=++this.state%4;this.box=cube+16*this.cube+4*this.state;if(checkBorder() || checkClask()){this.state=temp;this.box=cube+16*this.cube+4*this.state;}writeCubeToMap();}///////////////////////////////////////////////////////////////////// void main(void){TMOD=0x1;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;lcdIni();for(t0ms=0;t0ms<MAXHANG;t0ms++){cubeMap[t0ms][0]=0;cubeMap[t0ms][1]=0;}while(1){createCube();if(checkClask()){rectangle();#define SHOWSTAR 12#define GAP 8lcdPlayChar(23,2,SHOWSTAR); //GAMElcdPlayChar(24,2,SHOWSTAR+GAP);lcdPlayChar(25,2,SHOWSTAR+2*GAP);lcdPlayChar(12,2,SHOWSTAR+3*GAP);lcdPlayChar(20,4,SHOWSTAR); //OVERlcdPlayChar(26,4,SHOWSTAR+GAP);lcdPlayChar(12,4,SHOWSTAR+2*GAP);lcdPlayChar(21,4,SHOWSTAR+3*GAP);t0ms=0;while(t0ms<95);//延时2秒t0ms=0;while(t0ms<95);((void (code *) (void)) 0x0000) ( );}while(1){timeServer();if(keyflag){keyflag=0;t0ms1=0;if(gkey==0)moveLeft();if(gkey==1)moveRigh();if(gkey==2)cubeRotation();if(gkey==3)moveDown();}if(gkey==0 && t0ms1==PUSHON){t0ms1-=10;moveLeft();}if(gkey==1 && t0ms1==PUSHON) {t0ms1-=10;moveRigh();}if(gkey==3 && t0ms1==PUSHON) {t0ms1-=10;moveDown();}if(downtimegap>(DOWNTIME-speed)){moveDown();downtimegap=0;}if(downok){downok=0;break;}}}}。

相关文档
最新文档