/*---------------------------------------------------------------------------
文件功能:俄罗斯方块游戏主程序
编写者:笨小孩
完成时间:2009.3.1
版本:最终版本
作者邮箱:liaoguobao19860822@163.com
单片机类型:AT89C51
仿真软件:Proteus
代码编译软件:Keil2
----------------------------------------------------------------------------*/
#include "key.h"
#include "t6963c.h"
#include "at89x51.h"
#include "Assistant.h"
#include "160128_driver.h"
/*+-----------------------+
| 注意:晶振为22.1184MHz |
+-----------------------+*/
/*----------------------------------------------------------------------------*/
//按键端口宏定义
#define KEY_ADDY P1_0 //旋转键端口
#define KEY_LEFT_MOVE P1_1 //左移键端口
#define KEY_RIGHT_MOVE P1_2 //右移键端口
#define KEY_SPEED_MOVE P1_3 //加速键端口
#define KEY_OK P1_4 //确定键端口
#define KEY_PAUSE P3_2 //暂停键端口
#define KEY_CUSTOMS P3_3 //选关键端口
#define KEY_RESTORAL P3_4 //复位键端口
/*----------------------------------------------------------------------------*/
//全局变量定义
//游戏速度,初始值为GRADE_1
unsigned char m_Speed = GRADE_1;
//更新显示标志,当m_Flag为1时要刷新界面
bit m_Flag = 0;
//更新时间标志,当m_TimeFlag为1时要刷新时间
bit m_TimeFlag = 0;
//图形种类
unsigned char m_Kind, m_NextKind;
//图形位置
unsigned char Point_x = 4, Point_y = 0; //初始图形坐标
//时间变量
unsigned int m_Time = 0;
//选关按钮是否被按下标志位
bit m_IsChoose = 0;
//是否暂停(如果为1则暂停,为0不暂停)
bit m_IsPause = 0;
/*----------------------------------------------------------------------------*/
//延时10ms子程序(为键盘消抖服务)
void Delay_10ms()
{
unsigned char a, b, c;
for (a = 0; a < 10; a++)
for (b = 0; b < 3; b++)
for (c = 0; c < 220; c++);
}
//延时100ms子程序(为游戏加速服务)
void Delay_100ms()
{
unsigned char a, b, c;
for (a = 0; a < 100; a++)
for (b = 0; b < 3; b++)
for (c = 0; c < 220; c++);
}
/*----------------------------------------------------------------------------*/
/*清除字符函数*/
void ClearChar()
{
Set_xy(7,9);
Write_8_Data(0,NOC_WR);//G
Set_xy(7,10);
Write_8_Data(0,NOC_WR);//A
Set_xy(7,11);
Write_8_Data(0,NOC_WR);//M
Set_xy(7,12);
Write_8_Data(0,NOC_WR);//E
Set_xy(7,15);
Write_8_Data(0,NOC_WR);//O
Set_xy(7,16);
Write_8_Data(0,NOC_WR);//V
Set_xy(7,17);
Write_8_Data(0,NOC_WR);//E
Set_xy(7,18);
Write_8_Data(0,NOC_WR);//R
}
/*----------------------------------------------------------------------------*/
//善后处理
void MixedDeal()
{
ClearRow(Point_y); /*消去操作*/
Point_x=4;Point_y=0; /*初始化坐标位置*/
ShowCleanLeftGraph(2, 0, m_NextKind, 0); /*清除左端的旧显示*/
m_Kind=m_NextKind; /*移交下一个要显示的方块*/
ShowCleanGraph(Point_x, Point_y, m_Kind, 1); /*显示下降方块*/
m_NextKind=TL0%19; /*产生一个新的随机方块*/
ShowCleanLeftGraph(2, 0, m_NextKind, 1); /*将新方块显示在左端*/
}
/*----------------------------------------------------------------------------*/
//游戏结束或复位时的while循环
void Loop()
{
while(1) /*判断确定建是否按下,屏蔽其他键的功能*/
{
if(!KEY_OK)
{
Delay_10ms();
if(!KEY_OK)
while(!KEY_OK); /*等待确定键被按下*/
Point_x=4,Point_y=0; /*初始图形坐标*/
m_Time=0; /*初始时间*/
ClearChar(); /*清除字符*/
MarkDisplay(); //*更新分数显示
TimeDisplay(); //*更新时间显示
CustomDisplay(); //*更新关数显示
m_Speed = GRADE_1; //速度更新
break;
}
}
}
/*----------------------------------------------------------------------------*/
void main() /*程序入口*/
{
TMOD=0x01; /*定时器设置*/
InitializeSeries(); /*初始化串口*/
SendString("Relive childhood popularity."); /*虚拟终端显示*/
SendString("Challenge the limits of intellectual.");
SendString("RussiaBlock based on single-chip design.");
SendString("Game instructions:");
SendString("[1] key is Left_Move.");
SendString("[2] key is Rotation.");
SendString("[3] key is Right_Move.");
SendString("[Enter] key is pause.");
SendString("[SpaceBar] key is SpeedUp_Move.");
TH0=0x4C;TL0=0; /*定时器0初始值设定*/
EA=TR0=1; /*开启定时器0定时*/
Init_disply(0); /*初始化开机界面显示*/
while(1) /*判断确定建是否按下,屏蔽其他键的功能*/
{
if(!KEY_OK)
{
Delay_10ms();
if(!KEY_OK)
while(!KEY_OK);
break;
}
}
Circle(63, 79, 60, 0); /*清除圆*/
Clear_LCD(); /*清屏显示*/
Line(63,0,63,127,1); /*画分隔线*/
Init_disply(1); /*初始化游戏开始界面显示*/
m_Kind=TH0%19; /*产生随机方块*/
m_NextKind=TL0%19; /*产生下一个随机方块*/
ShowCleanGraph(Point_x, Point_y, m_Kind, 1); /*显示下降方块*/
ShowCleanLeftGraph(2, 0, m_NextKind, 1); /*将新方块显示在左端*/
ET0=1; /*开启定时器1中断*/
while(1) /*进入主循环,键盘扫描开始,响应按键事件*/
{
if(!KEY_LEFT_MOVE)
{
Delay_10ms();
if(!KEY_LEFT_MOVE)
{
ET0 = 0;
Delay_100ms();
if (KEY_LEFT_MOVE) Left_Move(); /*响应左移事件*/
else /*响应加速左移事件*/
{
while(!KEY_LEFT_MOVE)
{
Left_Move();
Delay_100ms(); /*延时100毫秒,也就是加速速度*/
}
ET0 = 1;
}
}
}
if(!KEY_RIGHT_MOVE)
{
Delay_10ms();
if(!KEY_RIGHT_MOVE)
{
ET0 = 0;
Delay_100ms();
if (KEY_RIGHT_MOVE) Right_Move(); /*响应右移事件*/
else /*响应加速右移事件*/
{
while(!KEY_RIGHT_MOVE)
{
Right_Move();
Delay_100ms(); /*延时100毫秒,也就是加速速度*/
}
ET0 = 1;
}
}
}
if(!KEY_ADDY)
{
Delay_10ms();
if(!KEY_ADDY)
{
while(!KEY_ADDY);
ET0 = 0;
g_EddyShape(); /*响应旋转事件*/
ET0 = 1;
}
}
if(!KEY_CUSTOMS)
{
Delay_10ms();
if(!KEY_CUSTOMS)
{
while(!KEY_CUSTOMS);
ET0 = 0;
m_IsChoose = 1;
Choice_Customs(); /*响应选关事件*/
}
}
/*******************为选关服务*********************/
/**/ if(!KEY_OK && m_IsChoose) /**/
/**/ { /**/
/**/ Delay_10ms(); /**/
/**/ if(!KEY_OK) /**/
/**/ while(!KEY_OK); /**/
/**/ m_IsChoose = 0; /**/
/**/ ET0 = 1; /**/
/**/ } /**/
/**************************************************/
if(!KEY_RESTORAL)
{
Delay_10ms();
if(!KEY_RESTORAL)
{
while(!KEY_RESTORAL);
ET0=0;
Restoral(); /*响应复位事件*/
Loop(); /*游戏复位的while处理*/
ET0=1; /*开中断*/
}
}
if (!KEY_SPEED_MOVE)
{
Delay_10ms();
if (!KEY_SPEED_MOVE)
{
while (!KEY_SPEED_MOVE);
ET0=0; /*关定时器*/
SpeedUp_Move(); /*响应加速下降事件*/
MixedDeal(); /*善后处理*/
ET0=1; /*开定时器*/
}
}
if (m_Flag)
{
m_Flag=0;
if (AbleMoveDown(Point_x, Point_y, m_Kind))
{
ShowCleanGraph(Point_x, Point_y, m_Kind, 0);/*清除旧的图形*/
Point_y += 1; /*更新坐标*/
ShowCleanGraph(Point_x, Point_y, m_Kind, 1);/*画出新的图形*/
}
else
{
if (GameEnd()) /*判断游戏是否结束*/
{
EA=0; /*游戏结束后先关中断*/
GameEndDeal(); /*游戏结束的处理*/
Loop(); /*游戏结束的while处理*/
80c51基于proteus制作的 俄罗斯方块 小游戏(可玩并附源码)
需积分: 9 128 浏览量
2010-10-18
16:44:38
上传
评论 1
收藏 166KB ZIP 举报
dfck007
- 粉丝: 2
- 资源: 37
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈