标题:
单片机贪吃蛇仿真程序 160128液晶屏驱动程序
[打印本页]
作者:
ouyang666
时间:
2017-5-25 20:26
标题:
单片机贪吃蛇仿真程序 160128液晶屏驱动程序
基于51单片机做的贪吃蛇程序和仿真图都有,是用的160128液晶屏做的,比较大气。 希望对大家有帮助.下面是proteus仿真原理图:
0.png
(28.75 KB, 下载次数: 95)
下载附件
2017-5-26 01:56 上传
0.png
(56.23 KB, 下载次数: 134)
下载附件
2017-5-26 01:54 上传
单片机源程序如下(含160128液晶屏的驱动程序):
/*---------------------------------------------------------------------------
文件功能:贪吃蛇游戏主程序
编写者:笨小孩
版本:最终版本
作者邮箱:liaoguobao19860822@163.com
单片机类型:AT89C51
仿真软件:Proteus7.2
代码编译软件:Keil2
----------------------------------------------------------------------------*/
#include "t6963c.h"
#include "at89x51.h"
#include "MoveDeal.h"
#include "160128_driver.h"
/*+-----------------------+
| 注意:晶振为22.1184MHz |
+-----------------------+*/
/*---------------------------------------------------------------*/
//按键端口宏定义
#define KEY_UP_MOVE P1_0 //上移键端口
#define KEY_LEFT_MOVE P1_1 //左移键端口
#define KEY_RIGHT_MOVE P1_2 //右移键端口
#define KEY_DOWN_MOVE P1_3 //下移键端口
#define KEY_OK P1_4 //确定键端口
#define KEY_SPEED_MOVE P3_2 //加速键端口
#define KEY_CUSTOMS P3_3 //选关键端口
#define KEY_RESTORAL P3_4 //复位键端口
/*----------------------------------------------------------------------------*/
//全局变量定义
//游戏速度,初始值为GRADE_1(1秒移动一次蛇头)
unsigned char m_Speed = GRADE_1;
//更新显示标志,当m_Flag为1时要刷新界面
bit m_Flag = 0;
//更新时间标志,当m_TimeFlag为1时要刷新时间
bit m_TimeFlag = 0;
//选关按钮是否被按下标志位
bit m_IsChoose = 0;
//时间变量
unsigned int m_Time = 0;
//蛇头运动方向,初始值为MOVE_DOWN(默认向下运动)
unsigned char m_MoveState = MOVE_DOWN;
/*----------------------------------------------------------------------------*/
//延时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++);
}
/*----------------------------------------------------------------------------*/
/*清除字符函数*/
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
}
/*----------------------------------------------------------------------------*/
//游戏结束或复位时的while循环
void Loop()
{
while (1) /*判断确定建是否按下,屏蔽其他键的功能*/
{
if (!KEY_OK)
{
Delay_10ms();
if(!KEY_OK)
while(!KEY_OK); /*等待确定键被按下*/
m_Time = 0; /*初始时间*/
ClearChar(); /*清除字符*/
RandFood(); /*随机食物生成*/
break;
}
}
}
/*-----------------------------主程序开始---------------------------------*/
void main()
{
TMOD = 0x01; /*定时器设置(只用到了定时器1)*/
InitializeSeries(); /*串口初始化*/
TH0 = 0x4C;TL0 = 0x00; /*定时器0初始值设定(25ms中断一次)*/
EA = TR0 = 1; /*开启定时器0定时*/
Init_disply(0); /*初始化开机界面显示*/
SendString("Relive childhood popularity."); /*虚拟终端显示*/
SendString("Challenge the limits of intellectual.");
SendString("GreedySnaker based on single-chip design.\r");
SendString("Game instructions:");
SendString("[0] key is Choice_Customs.");
SendString("[1] key is Left_Move.");
SendString("[2] key is Down_Move.");
SendString("[3] key is Right_Move.");
SendString("[5] key is On_Move.");
SendString("[Enter] key is pause.");
SendString("[SpaceBar] key is SpeedUp_Move.");
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); /*画分隔线*/
InitStruct(); /*初始化结构体数组*/
Init_disply(1); /*初始化游戏开始界面显示*/
RandFood(); /*随机食物生成*/
ET0=1; /*开启定时器0中断*/
while(1) /*进入主循环,键盘扫描开始,响应按键事件*/
{
if(!KEY_LEFT_MOVE) /*响应向左运动事件*/
{
Delay_10ms();
if(!KEY_LEFT_MOVE)
{
while(!KEY_LEFT_MOVE);
if (m_MoveState != MOVE_RIGHT) /*如果蛇头运动方向向右,直接跳过*/
m_MoveState = MOVE_LEFT; /*刷新蛇头运动方向(向左)*/
}
}
if(!KEY_RIGHT_MOVE) /*响应向右运动事件*/
{
Delay_10ms();
if(!KEY_RIGHT_MOVE)
{
while(!KEY_RIGHT_MOVE);
if (m_MoveState != MOVE_LEFT) /*如果蛇头运动方向向左,直接跳过*/
m_MoveState = MOVE_RIGHT; /*刷新蛇头运动方向(向右)*/
}
}
if(!KEY_UP_MOVE) /*响应向上运动事件*/
{
Delay_10ms();
if(!KEY_UP_MOVE)
{
while(!KEY_UP_MOVE);
if (m_MoveState != MOVE_DOWN) /*如果蛇头运动方向向下,直接跳过*/
m_MoveState = MOVE_UP; /*刷新蛇头运动方向(向上)*/
}
}
if (!KEY_DOWN_MOVE) /*响应向下运动事件*/
{
Delay_10ms();
if (!KEY_DOWN_MOVE)
{
while (!KEY_DOWN_MOVE);
if (m_MoveState != MOVE_UP) /*如果蛇头运动方向向上,直接跳过*/
m_MoveState = MOVE_DOWN; /*刷新蛇头运动方向(向下)*/
}
}
if(!KEY_CUSTOMS) /*响应选关事件*/
{
Delay_10ms();
if(!KEY_CUSTOMS)
{
while(!KEY_CUSTOMS);
TR0 = 0;
m_IsChoose = 1;
Choice_Customs();
}
}
/*******************为选关服务*********************/
/**/ if(!KEY_OK && m_IsChoose) /**/
/**/ { /**/
/**/ Delay_10ms(); /**/
/**/ if(!KEY_OK) /**/
/**/ while(!KEY_OK); /**/
/**/ m_IsChoose = 0; /**/
/**/ TR0 = 1; /**/
/**/ }//只有选关后确定键才有效 /**/
/**************************************************/
if(!KEY_RESTORAL) /*响应复位事件*/
{
Delay_10ms();
if(!KEY_RESTORAL)
{
while(!KEY_RESTORAL);
Restoral(); /*游戏复位处理*/
}
}
if(!KEY_SPEED_MOVE) /*响应加速事件*/
{
Delay_10ms();
if(!KEY_SPEED_MOVE)
{
TR0 = 0;
while(!KEY_SPEED_MOVE)
{
MoveProcess(); /*一直调用移动处理*/
Delay_100ms(); /*延时100毫秒,也就是加速速度*/
}
TR0 = 1;
}
}
if (m_Flag) /*响应正常的移动事件*/
{
m_Flag = 0;
MoveProcess(); /*移动处理*/
}
if (m_TimeFlag) /*刷新时间显示*/
{
m_TimeFlag = 0;
TimeDisplay();
}
Terminal(); /*响应键盘消息*/
}
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
贪吃蛇.rar
(129.26 KB, 下载次数: 65)
2017-5-25 20:25 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
快点冬天
时间:
2017-6-12 21:59
准备课设做一个这个
作者:
rrrrrrrrou
时间:
2020-5-19 19:13
请问,这个中文字库是怎么获得的?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1