找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4598|回复: 2
打印 上一主题 下一主题
收起左侧

单片机贪吃蛇仿真程序 160128液晶屏驱动程序

[复制链接]
跳转到指定楼层
楼主
基于51单片机做的贪吃蛇程序和仿真图都有,是用的160128液晶屏做的,比较大气。 希望对大家有帮助.下面是proteus仿真原理图:


单片机源程序如下(含160128液晶屏的驱动程序):
  1. /*---------------------------------------------------------------------------
  2. 文件功能:贪吃蛇游戏主程序
  3. 编写者:笨小孩
  4. 版本:最终版本
  5. 作者邮箱:liaoguobao19860822@163.com
  6. 单片机类型:AT89C51
  7. 仿真软件:Proteus7.2
  8. 代码编译软件:Keil2  
  9. ----------------------------------------------------------------------------*/
  10. #include "t6963c.h"
  11. #include "at89x51.h"
  12. #include "MoveDeal.h"
  13. #include "160128_driver.h"
  14.                                                         /*+-----------------------+
  15.                                                           | 注意:晶振为22.1184MHz |
  16.                                                           +-----------------------+*/
  17. /*---------------------------------------------------------------*/
  18. //按键端口宏定义
  19. #define                         KEY_UP_MOVE                                P1_0                        //上移键端口
  20. #define                         KEY_LEFT_MOVE                        P1_1                        //左移键端口
  21. #define                         KEY_RIGHT_MOVE                        P1_2                        //右移键端口
  22. #define                         KEY_DOWN_MOVE                        P1_3                        //下移键端口
  23. #define                         KEY_OK                                        P1_4                        //确定键端口
  24. #define                         KEY_SPEED_MOVE                        P3_2                        //加速键端口
  25. #define                         KEY_CUSTOMS                                P3_3                        //选关键端口
  26. #define                         KEY_RESTORAL                        P3_4                        //复位键端口
  27. /*----------------------------------------------------------------------------*/
  28. //全局变量定义
  29. //游戏速度,初始值为GRADE_1(1秒移动一次蛇头)
  30. unsigned char           m_Speed = GRADE_1;
  31. //更新显示标志,当m_Flag为1时要刷新界面
  32. bit                                 m_Flag = 0;
  33. //更新时间标志,当m_TimeFlag为1时要刷新时间
  34. bit                                 m_TimeFlag = 0;
  35. //选关按钮是否被按下标志位
  36. bit                                 m_IsChoose = 0;
  37. //时间变量
  38. unsigned int            m_Time = 0;
  39. //蛇头运动方向,初始值为MOVE_DOWN(默认向下运动)
  40. unsigned char                 m_MoveState = MOVE_DOWN;
  41. /*----------------------------------------------------------------------------*/
  42. //延时10ms子程序(为键盘消抖服务)
  43. void Delay_10ms()
  44. {
  45.         unsigned char a, b, c;
  46.         for (a = 0; a < 10;  a++)
  47.         for (b = 0; b < 3;   b++)
  48.         for (c = 0; c < 220; c++);
  49. }

  50. /*----------------------------------------------------------------------------*/
  51. /*清除字符函数*/
  52. void ClearChar()                                       
  53. {
  54.         Set_xy(7,9);
  55.         Write_8_Data(0,NOC_WR);//G
  56.         Set_xy(7,10);
  57.         Write_8_Data(0,NOC_WR);//A
  58.         Set_xy(7,11);
  59.         Write_8_Data(0,NOC_WR);//M
  60.         Set_xy(7,12);
  61.         Write_8_Data(0,NOC_WR);//E

  62.         Set_xy(7,15);
  63.         Write_8_Data(0,NOC_WR);//O
  64.         Set_xy(7,16);
  65.         Write_8_Data(0,NOC_WR);//V
  66.         Set_xy(7,17);
  67.         Write_8_Data(0,NOC_WR);//E
  68.         Set_xy(7,18);
  69.         Write_8_Data(0,NOC_WR);//R
  70. }
  71. /*----------------------------------------------------------------------------*/
  72. //游戏结束或复位时的while循环
  73. void Loop()
  74. {
  75.         while (1)                                                                                /*判断确定建是否按下,屏蔽其他键的功能*/
  76.     {
  77.             if (!KEY_OK)
  78.             {
  79.                  Delay_10ms();
  80.                  if(!KEY_OK)
  81.                      while(!KEY_OK);                                                        /*等待确定键被按下*/
  82.                         m_Time = 0;                                                                /*初始时间*/
  83.                         ClearChar();                                                        /*清除字符*/
  84.                         RandFood();                                                                /*随机食物生成*/
  85.                         break;
  86.                 }
  87.         }
  88. }
  89. /*-----------------------------主程序开始---------------------------------*/
  90. void main()                                                                                       
  91. {
  92.         TMOD = 0x01;                                                                        /*定时器设置(只用到了定时器1)*/
  93.     InitializeSeries();                             /*串口初始化*/
  94.         TH0 = 0x4C;TL0 = 0x00;                                                        /*定时器0初始值设定(25ms中断一次)*/
  95.         EA = TR0 = 1;                                                                        /*开启定时器0定时*/
  96.         Init_disply(0);                                                                        /*初始化开机界面显示*/

  97.     SendString("Relive childhood popularity.");          /*虚拟终端显示*/
  98.     SendString("Challenge the limits of intellectual.");
  99.     SendString("GreedySnaker based on single-chip design.\r");
  100.     SendString("Game instructions:");
  101.     SendString("[0] key is Choice_Customs.");
  102.     SendString("[1] key is Left_Move.");
  103.     SendString("[2] key is Down_Move.");
  104.     SendString("[3] key is Right_Move.");   
  105.     SendString("[5] key is On_Move.");   
  106.     SendString("[Enter] key is pause.");  
  107.     SendString("[SpaceBar] key is SpeedUp_Move.");

  108.         while(1)                                                                                /*判断确定建是否按下,屏蔽其他键的功能*/
  109.     {
  110.             if(!KEY_OK)
  111.             {
  112.                  Delay_10ms();
  113.                  if(!KEY_OK)
  114.                      while(!KEY_OK);
  115.                         break;
  116.                 }
  117.         }
  118.         Circle(63, 79, 60, 0);                                                        /*清除圆*/
  119.         Clear_LCD();                                                                        /*清屏显示*/
  120.         Line(63, 0, 63, 127, 1);                                                /*画分隔线*/
  121.         InitStruct();                                                                        /*初始化结构体数组*/
  122.         Init_disply(1);                                                                        /*初始化游戏开始界面显示*/
  123.         RandFood();                                                                                /*随机食物生成*/
  124.         ET0=1;                                                                                        /*开启定时器0中断*/
  125.         while(1)                                                                                /*进入主循环,键盘扫描开始,响应按键事件*/
  126.         {
  127.                 if(!KEY_LEFT_MOVE)                                                        /*响应向左运动事件*/
  128.                   {
  129.                       Delay_10ms();
  130.                       if(!KEY_LEFT_MOVE)
  131.                  {
  132.                              while(!KEY_LEFT_MOVE);
  133.                                 if (m_MoveState != MOVE_RIGHT)                /*如果蛇头运动方向向右,直接跳过*/
  134.                                 m_MoveState = MOVE_LEFT;                        /*刷新蛇头运动方向(向左)*/
  135.                  }
  136.                   }

  137.                 if(!KEY_RIGHT_MOVE)                                                        /*响应向右运动事件*/
  138.                   {
  139.                       Delay_10ms();
  140.                       if(!KEY_RIGHT_MOVE)
  141.                  {
  142.                              while(!KEY_RIGHT_MOVE);
  143.                                 if (m_MoveState != MOVE_LEFT)                /*如果蛇头运动方向向左,直接跳过*/
  144.                                 m_MoveState = MOVE_RIGHT;                        /*刷新蛇头运动方向(向右)*/
  145.                  }
  146.                   }

  147.                 if(!KEY_UP_MOVE)                                                        /*响应向上运动事件*/
  148.                   {
  149.                       Delay_10ms();
  150.                       if(!KEY_UP_MOVE)
  151.                  {
  152.                              while(!KEY_UP_MOVE);
  153.                                 if (m_MoveState != MOVE_DOWN)                /*如果蛇头运动方向向下,直接跳过*/
  154.                          m_MoveState = MOVE_UP;                                /*刷新蛇头运动方向(向上)*/
  155.                  }
  156.                   }

  157.                 if (!KEY_DOWN_MOVE)                                                        /*响应向下运动事件*/
  158.                   {
  159.                       Delay_10ms();
  160.                       if (!KEY_DOWN_MOVE)
  161.                  {
  162.                              while (!KEY_DOWN_MOVE);
  163.                                 if (m_MoveState != MOVE_UP)                        /*如果蛇头运动方向向上,直接跳过*/
  164.                                 m_MoveState = MOVE_DOWN;                        /*刷新蛇头运动方向(向下)*/
  165.                  }
  166.                   }

  167.                 if(!KEY_CUSTOMS)                                                        /*响应选关事件*/
  168.                   {
  169.                       Delay_10ms();
  170.                       if(!KEY_CUSTOMS)
  171.                  {
  172.                              while(!KEY_CUSTOMS);
  173.                                 TR0 = 0;
  174.                                 m_IsChoose = 1;
  175.                          Choice_Customs();                                       
  176.                  }
  177.                   }
  178. /*******************为选关服务*********************/
  179. /**/        if(!KEY_OK && m_IsChoose)                                /**/
  180. /**/        {                                                                                /**/
  181. /**/             Delay_10ms();                                                /**/
  182. /**/               if(!KEY_OK)                                                        /**/
  183. /**/            while(!KEY_OK);                                                /**/
  184. /**/                m_IsChoose = 0;                                                /**/
  185. /**/                TR0 = 1;                                                                /**/
  186. /**/        }//只有选关后确定键才有效                                /**/
  187. /**************************************************/
  188.                 if(!KEY_RESTORAL)                                                        /*响应复位事件*/
  189.                   {
  190.                       Delay_10ms();
  191.                       if(!KEY_RESTORAL)
  192.                  {
  193.                              while(!KEY_RESTORAL);
  194.                                 Restoral();                                                        /*游戏复位处理*/
  195.                  }
  196.                   }

  197.                 if(!KEY_SPEED_MOVE)                                                        /*响应加速事件*/
  198.                   {
  199.                       Delay_10ms();
  200.                       if(!KEY_SPEED_MOVE)
  201.                  {
  202.                                 TR0 = 0;
  203.                              while(!KEY_SPEED_MOVE)
  204.                                 {
  205.                                         MoveProcess();                                        /*一直调用移动处理*/
  206.                                         Delay_100ms();                                        /*延时100毫秒,也就是加速速度*/
  207.                                 }
  208.                                 TR0 = 1;                                                                                               
  209.                  }
  210.                   }

  211.                 if (m_Flag)                                                                        /*响应正常的移动事件*/
  212.                 {
  213.                         m_Flag = 0;
  214.                         MoveProcess();                                                        /*移动处理*/
  215.                 }

  216.                 if (m_TimeFlag)                                                                /*刷新时间显示*/
  217.                 {
  218.                         m_TimeFlag = 0;
  219.                         TimeDisplay();
  220.                 }

  221.         Terminal();                                 /*响应键盘消息*/
  222.           }
  223. }
  224. ……………………

  225. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
贪吃蛇.rar (129.26 KB, 下载次数: 65)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:209804 发表于 2017-6-12 21:59 | 只看该作者
准备课设做一个这个
回复

使用道具 举报

板凳
ID:466857 发表于 2020-5-19 19:13 | 只看该作者
请问,这个中文字库是怎么获得的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表