基于51单片机做的贪吃蛇程序和仿真图都有,是用的160128液晶屏做的,比较大气。 希望对大家有帮助.下面是proteus仿真原理图:
单片机源程序如下(含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)
|