【51项目】51单片机自制小霸王游戏机

打印 上一主题 下一主题

主题 1029|帖子 1029|积分 3087

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
视频演示结果:

     纳新作品——小霸王游戏机
  
目录:

   目录
  视频演示结果:
  目录:
  前言:
  一、毗连方式:
  1.1 控制引脚
  1.2. 显示模块
  1.3. 定时器
  1.4. 游戏逻辑与硬件结合
  1.5. 中断处理
  二、源码分析:
  2.1. 全局变量与常量定义
  2.2. 游戏初始化函数
  2.3. 游戏状态与逻辑
  2.4. 辅助功能
  2.5. 显示与输入
  2.6. 中断处理
  2.7. 主函数
  2.8. 源码整合:
  完备工程源码获取方式:
  
  
  前言:

51单片机自制小霸王游戏机不仅是一个布满乐趣的DIY项目,而且蕴含了深刻的教诲和技术意义。通过这一过程,可以加深对嵌入式系统原理的明确,锻炼实践操作本领,同时也是一种对经典电子游戏文化的致敬和传承

起首,这一项目使得制作者能够深入明确51单片机的内部结构和工作原理。51单片机作为一种基础的微控制器,其编程和硬件接口设计对于电子工程的学习者来说是基础且关键的。在自制游戏机的实践中,制作者必要对51单片机的I/O端口、定时器、中断系统等有深入的了解和运用,这有助于提升对微控制器应用的熟练度。
其次,自制小霸王游戏机的过程是对电子电路设计本领的考验和提升。从电路板的布局设计到元件的选择,再到焊接和调试,每一步都必要精细的操作和严谨的思考。这不仅能够锻炼动手本领,还能培养解决现实题目的本领。

此外,该项目具有浓重的文化意义。小霸王游戏机是很多80后乃至70后的童年影象,通过自制游戏机,可以体验复古游戏带来的乐趣,同时也是对谁人期间电子游戏文化的一种纪念和传承。
这一项目能够引发创新头脑和独立解决题目的本领。在制作过程中,可能会遇到各种预料之外的挑战,好比如何优化电路设计以减小体积,如何编写更高效的代码来提升游戏性能,如何使游戏机界面更友好等。这些题目的解决,都必要制作者发挥创新头脑,探求最佳解决方案。
末了,自制小霸王游戏机也是一种良好的技术交换方式。制作者可以将本身的设计分享给他人,通过社区交换获取反馈和建议,从而不停提升本身的技术程度,同时也促进了技术爱好者和偕行之间的交换与合作。
一、毗连方式:

1.1 控制引脚



  • P2口:用于控制方向和确认操作。

    • 0x04: 表示向上移动。
    • 0x10: 表示向下移动。
    • 0x01: 表示向左移动。
    • 0x40: 表示向右移动。
    • 0x80: 表示确认操作。

  • P3口:用于控制蜂鸣器。

    • P3^7 (loud): 控制蜂鸣器的开关状态。

  • P0口:用于检测键盘输入,具体检测到哪个键由P0的值决定。

    • P0=0xf7: 检测第一列键盘输入。
    • P0=0xfb: 检测第二列键盘输入。
    • P0=0xfd: 检测第三列键盘输入。
    • P0=0xfe: 检测第四列键盘输入。

1.2. 显示模块

相干接口


  • LCD接口:用于显示游戏信息和状态。

    • 涉及到LCD的初始化、位置设置、数据写入等操作。
    • wr_i_lcd 和 wr_d_lcd 函数用于写入指令和数据到LCD。

该代码主要涉及对 LCD 的控制,LCD 通常通过多个引脚与微控制器毗连。在本代码中,利用了一些特定的控制信号:


  • RS (Register Select):选择寄存器信号,用于选择指令寄存器或数据寄存器。rs=0表示指令寄存器,rs=1表示数据寄存器。
  • RW (Read/Write):读写控制信号。rw=0表示写操作,rw=1表示读操作。
  • E (Enable):使能信号。LCD 在 E 由高变低的瞬间捕获数据。
  • busy_lcd():检查 LCD 的繁忙状态,确保在其准备好之前不会发送新的指令或数据。
 数据线


  • lcddata:用于发送指令或数据到 LCD 的数据线。在特定指令下,将数据或命令通报给 LCD。
 电路接口功能


  • 延时函数 (delaynms):用于产生精确的时间延长,以满足 LCD 的指令和数据处理的时间要求。通过软件延时的方式确保 LCD 在指令或数据写入后有充足的时间来完成操作。
  • 初始化函数 (init_lcd):对 LCD 举行初始化设置,包括配置 LCD 的指令集、显示控制和清屏等操作。
  • 图像处理函数 (img_disp, lcd_set_dot, clear_pic):这些函数用于在 LCD 上绘制图像或图形,通过操控特定的寄存器和位来改变显示内容。
硬件毗连


  • 接口引脚:通常 LCD 与微控制器之间会有多个 GPIO 口毗连,上述信号(RS, RW, E, lcddata)都必要毗连到微控制器的相应引脚。
  • 电源与接地:LCD 显示屏必要毗连合适的电源和接地,以确保稳定工作。
工作原理


  • 指令与数据传输:通过上述信号的组合,微控制器可以发送差别的命令和数据到 LCD,实现各种显示结果。
  • 繁忙检测:在执行新的指令或写入数据之前,通过 busy_lcd() 检测 LCD 的繁忙状态,以防止由于过快的指令发送导致的数据丢失或指令失效。
1.3. 定时器



  • 定时器设置

    • 利用定时器(如T1)来产生随机数,用于游戏逻辑中的随机天生(如食物位置的随机天生)。
    • TH1 和 TL1 分别用于设置定时器高位和低位。

1.4. 游戏逻辑与硬件结合



  • 游戏状态:通过变量flag来控制差别的游戏状态,如贪吃蛇、飞机大战等。
  • 随机数天生:利用定时器的计数值来随机天生游戏中的元素位置。
1.5. 中断处理



  • 中断服务程序:负责处理按键输入。

    • 对应的中断例程负责检测按键输入,并根据输入修改游戏状态或控制动作(如改变方向、选择菜单选项等)。

电路接口主要包括按键检测、LCD显示、蜂鸣器控制等部分。通过这些硬件接口,代码实现了一个简单的游戏控制系统。每个硬件接口的功能都通过相应的端口和位定义清晰地映射到特定的操作上,如移动、选择、确认等。

二、源码分析:

2.1. 全局变量与常量定义

代码开头定义了一些全局变量和常量,用于控制游戏的状态和举动。


  • 字符串常量:用于显示在 LCD 上的差别游戏名称和提示信息,如 name、game1、loser 等。
  • 全局变量:如 p、px、length、flag、slect 等,这些变量用于控制菜单选择、游戏状态、长度计数等。
  • 硬件接口:loud 是一个特别位(sbit),用于控制蜂鸣器的开关。
  1. #include "includes.h"
  2. #include "intrins.h"
  3. #include "stdlib.h"
  4. /*fx=0 ÓÒ
  5.   fx=1 ×ó
  6.   fx=2 ÉÏ
  7.   fx=3 ÏÂ*/
  8. /*P2 ÉÏ 0x04 ÏÂ 0x10 ×ó 0x01 ÓÒ 0x40 È·ÈÏ 0x80 */
  9. uchar code name[]={"С°ÔÍõÓÎÏ·»ú"};
  10. uchar code game1[]={"̰³ÔÉß"};
  11. uchar code game2[]={"´òµØÊó"};
  12. uchar code game3[]={"·É»ú´óÕ½"};
  13. uchar code game4[]={"ͼƬ"};
  14. uchar code loser[]={"ÄãÊäÁË"};
  15. uchar code lxy1[]={"¼ÌÐø"};
  16. uchar code lxy2[]={"·µ»Ø"};
  17. uchar code cj[]={"³¤¶È: "};
  18. uchar code fjs[]={"·É»ú: "};
  19. char code  mouse[]={"ÀÏÊó: "};
  20. uchar p=1,px=1;
  21. uchar length=9;       
  22. uchar flag=0,slect=0,choose=0;
  23. uchar ran1,ran2,food=0;
  24. uchar planex[3]={28,30,0};
  25. uchar zidan_x[10]={0},zidan_y[10]={0};
  26. uchar boom_x[10]={0},boom_y[10]={0};
  27. char dishu=0;
  28. sbit loud=P3^7;                                       
  29. struct xx
  30. {
  31.     char x[22];
  32.         char y[22];
  33.         char head;
  34.         char tail;
  35.         char dir;
  36. }snake;
复制代码
 
2.2. 游戏初始化函数



  • snake_init():初始化贪吃蛇游戏的状态,在 LCD 上绘制初始蛇的形状,并设置蛇的坐标、头尾指针和方向。
  1. void snake_init(void)
  2. {
  3.    lcd_set_dot(1,1,0);
  4.    lcd_set_dot(2,1,0);
  5.    lcd_set_dot(3,1,0);
  6.    lcd_set_dot(4,1,0);
  7.    lcd_set_dot(5,1,0);
  8.    lcd_set_dot(6,1,0);
  9.    snake.x[0]=1;snake.y[0]=1;
  10.    snake.x[1]=2;snake.y[1]=1;
  11.    snake.x[2]=3;snake.y[2]=1;
  12.    snake.x[3]=4;snake.y[3]=1;
  13.    snake.x[4]=5;snake.y[4]=1;
  14.    snake.x[5]=6;snake.y[5]=1;
  15.    snake.head=5;
  16.    snake.tail=0;
  17.    snake.dir=0;       
  18. }
复制代码
2.3. 游戏状态与逻辑



  • die():处理游戏失败的情况,显示失败信息并等候用户选择继续或返回。
  • cata():菜单选择功能,显示可选游戏列表,并根据用户输入更新选择。
  • game_snake():贪吃蛇游戏的焦点逻辑,包括蛇的移动、食物天生、碰撞检测等。
  • game_plane():飞机大战游戏的逻辑,处理子弹和敌机的碰撞、飞机的移动等。
  • game_mouse():打地鼠游戏逻辑,随机天生地鼠位置,并检测玩家是否成功击中。
  1. void die(void)
  2. {
  3.         uchar i;
  4.         loud=0;
  5.         flag=5;
  6.         clear_pic();
  7.         wr_i_lcd(0x30);
  8.         wr_i_lcd(0x01);
  9.         i=0;
  10.         lcd_pos(0,2);
  11.         while(loser[i]!='\0')
  12.         {
  13.                 wr_d_lcd(loser[i]);
  14.                 i++;
  15.         }
  16.         i=0;
  17.         lcd_pos(2,0);
  18.         while(lxy1[i]!='\0')
  19.         {
  20.                 wr_d_lcd(lxy1[i]);
  21.                 i++;       
  22.         }
  23.         i=0;
  24.         lcd_pos(2,5);
  25.         while(lxy2[i]!='\0')
  26.         {
  27.                 wr_d_lcd(lxy2[i]);
  28.                 i++;       
  29.         }
  30.         lcd_pos(3,0); wr_d_lcd('o');
  31.         delay(1000);
  32.         loud=1;
  33.         while(flag==5);       
  34. }
  35. uchar cata(void)
  36. {
  37.         uchar i;
  38.         i=0;
  39.         slect=0;
  40.         lcd_pos(0,0);
  41.         wr_d_lcd('o');
  42.         lcd_pos(0,1);
  43.         while(game1[i]!='\0')
  44.         {
  45.                  wr_d_lcd(game1[i]);
  46.                  i++;
  47.         }
  48.         lcd_pos(1,1);
  49.         i=0;
  50.         while(game3[i]!='\0')
  51.         {
  52.                  wr_d_lcd(game2[i]);
  53.                  i++;
  54.         }
  55.         lcd_pos(2,1);
  56.         i=0;
  57.         while(game3[i]!='\0')
  58.         {
  59.                  wr_d_lcd(game3[i]);
  60.                  i++;
  61.         }
  62.         lcd_pos(3,1);
  63.         i=0;
  64.         while(game4[i]!='\0')
  65.         {
  66.                  wr_d_lcd(game4[i]);
  67.                  i++;
  68.         }
  69.         while(flag==0);       
  70. }
  71. void game_snake(void)
  72. {
  73.         uchar i,k,j;
  74.         k=0;
  75.         food=0;
  76.         length=6;
  77.         lcd_pos(3,0);
  78.                 i=0;
  79.                 while(cj[i]!='\0')
  80.                 {
  81.                          wr_d_lcd(cj[i]);
  82.                         i++;       
  83.                 }
  84.                 wr_d_lcd(length+48);
  85.                 while(1)
  86.            {
  87.                            if(food==0)
  88.                         {
  89.                                
  90.                                 while(1)//·ÀÖ¹²úÉúµÄʳÎï³öÏÖÔÚÉß×Ô¼ºÉíÉÏ
  91.                                 {
  92.                                         ran1=TH1%59+1;
  93.                                         ran2=TL1%30+1;
  94.                                         food=1;
  95.                                         i=snake.tail;
  96.                                         while(i!=snake.head)
  97.                                         {
  98.                                                 if(snake.x[i]==ran1&&snake.y[i]==ran2)
  99.                                                 {
  100.                                                         break;
  101.                                                 }
  102.                                                 i++;
  103.                                                 if(i==22) i=0;
  104.                                                 if(i==snake.head)
  105.                                                 {
  106.                                                         if(snake.x[i]==ran1&&snake.y[i]==ran2)
  107.                                                         {
  108.                                                                 i=snake.head-1;
  109.                                                                 break;
  110.                                                         }
  111.                                                 }       
  112.                                         }
  113.                                         if(i==snake.head) break;       
  114.                                 }
  115.                                 lcd_set_dot(ran1,ran2,0);
  116.                         }
  117.                         i=snake.tail;
  118.                         while(i!=snake.head)//ÉßÒ§µ½×Ô¼º
  119.                         {
  120.                                 if(snake.x[i]==snake.x[snake.head]&&snake.y[i]==snake.y[snake.head])
  121.                                 {
  122.                                         die();       
  123.                                         break;       
  124.                                 }
  125.                                 i++;
  126.                                 if(i==22) i=0;
  127.                         }
  128.                         if(i!=snake.head) break;
  129.                         if(snake.x[snake.head] >= 60 || snake.y[snake.head] >= 30 ||snake.x[snake.head] == 0 ||snake.y[snake.head] == 0) //ÉßÅöǽ
  130.                         {
  131.                                 die();       
  132.                                 break;       
  133.                         }
  134.                            snake.head++;
  135.                         if(snake.head==22)
  136.                         {
  137.                                 snake.head=0;
  138.                                 if(snake.dir==0)         //ÓÒ
  139.                                 {
  140.                                         snake.x[snake.head]=snake.x[21]+1;
  141.                                         snake.y[snake.head]=snake.y[21];       
  142.                                 }
  143.                                 else if(snake.dir==1)  //×ó
  144.                                 {
  145.                                         snake.x[snake.head]=snake.x[21]-1;
  146.                                         snake.y[snake.head]=snake.y[21];       
  147.                                 }
  148.                                 else if(snake.dir==2) //ÏÂ
  149.                                 {               
  150.                                         snake.x[snake.head]=snake.x[21];
  151.                                         snake.y[snake.head]=snake.y[21]+1;
  152.                                 }
  153.                                 else if(snake.dir==3) //ÉÏ
  154.                                 {
  155.                                         snake.x[snake.head]=snake.x[21];
  156.                                         snake.y[snake.head]=snake.y[21]-1;       
  157.                                 }       
  158.                         }
  159.                         else
  160.                         {
  161.                                 if(snake.dir==0)
  162.                                 {
  163.                                         snake.x[snake.head]=snake.x[snake.head-1]+1;
  164.                                         snake.y[snake.head]=snake.y[snake.head-1];       
  165.                                 }
  166.                                 else if(snake.dir==1)
  167.                                 {
  168.                                         snake.x[snake.head]=snake.x[snake.head-1]-1;
  169.                                         snake.y[snake.head]=snake.y[snake.head-1];       
  170.                                 }
  171.                                 else if(snake.dir==2)
  172.                                 {
  173.                                            snake.x[snake.head]=snake.x[snake.head-1];
  174.                                         snake.y[snake.head]=snake.y[snake.head-1]+1;
  175.                                 }
  176.                                 else if(snake.dir==3)
  177.                                 {
  178.                                            snake.x[snake.head]=snake.x[snake.head-1];
  179.                                         snake.y[snake.head]=snake.y[snake.head-1]-1;
  180.                                 }
  181.                         }
  182.                         lcd_set_dot(snake.x[snake.head],snake.y[snake.head],0);
  183.                         if(snake.x[snake.head]!=ran1 || snake.y[snake.head]!=ran2)//Éßû³Ôµ½Ê³Îï
  184.                         {
  185.                                
  186.                                 lcd_set_dot(snake.x[snake.tail],snake.y[snake.tail],1);
  187.                                 snake.tail++;
  188.                                 if(snake.tail==22) snake.tail=0;
  189.                         }
  190.                         else  //Éß³Ôµ½Ê³Îï
  191.                         {
  192.                                 if(k<90) k+=10;
  193.                                 loud=0;
  194.                                 length++;
  195.                                 wr_i_lcd(0x30);
  196.                         //        wr_i_lcd(0x01);
  197.                                 lcd_pos(3,3);
  198.                                 wr_d_lcd(length/10+48);
  199.                                 wr_d_lcd(length%10+48);
  200.                                 food=0;
  201.                         }
  202.                         for(i=0;i<100;i++)
  203.                                 for(j=0;j<100-k;j++)
  204.                                         time_1ms(1000);
  205.                        
  206.                         loud=1;       
  207.                    }       
  208. }
复制代码
2.4. 辅助功能



  • plane_init():初始化飞机的位置和状态。
  • back_ground():绘制游戏背景,好比边界和初始分数。
  • picture():显示图片的功能,通过选择差别的图片页来更新显示内容。
  • mouse_back():初始化打地鼠游戏的背景。
  1. void plane_init(void)
  2. {
  3.         uchar i;
  4.         lcd_set_dot(29,29,0);
  5.         lcd_set_dot(28,30,0);
  6.         lcd_set_dot(30,30,0);
  7.         lcd_set_dot(29,30,0);
  8.         for(i=0;i<10;i++)
  9.         {
  10.                 zidan_x[i]=0;
  11.                 zidan_y[i]=0;
  12.                 boom_x[i]=0;
  13.                 boom_y[i]=0;       
  14.         }
  15.         planex[0]=28;       
  16.         planex[1]=30;
  17. }
  18. void back_ground(void)
  19. {
  20.         uchar i;
  21.         clear_pic();
  22.         wr_i_lcd(0x30);
  23.         wr_i_lcd(0x01);
  24.         for(i=0;i<=60;i++)
  25.         {
  26.                 lcd_set_dot(i,0,0);
  27.                 lcd_set_dot(i,31,0);       
  28.         }
  29.         for(i=0;i<=32;i++)
  30.         {
  31.                 lcd_set_dot(0,i,0);
  32.                 lcd_set_dot(60,i,0);       
  33.         }
  34.         if(flag==3)
  35.         {
  36.                 lcd_pos(3,0);
  37.                 i=0;
  38.                 while(fjs[i]!='\0')
  39.                 {
  40.                         wr_d_lcd(fjs[i]);
  41.                         i++;
  42.                 }
  43.                 wr_d_lcd(length+48);
  44.         }               
  45. }
  46. void game_plane(void)
  47. {
  48.         uchar i,t=0,j=0;
  49.         while(1)
  50.         {
  51.                 i=0;
  52.                 while(i<10)
  53.                 {
  54.                         j=0;
  55.                         while(j<10)
  56.                         {
  57.                                 if(((zidan_x[i])==boom_x[j]) && ((zidan_y[i]-1==boom_y[j]) || (zidan_y[i]==boom_y[j])) && (zidan_x[i]!=0) && (zidan_y[i] != 0))
  58.                                 {
  59.                                         lcd_set_dot(zidan_x[i],zidan_y[i],1);
  60.                                         lcd_set_dot(boom_x[j],boom_y[j],1);
  61.                                         zidan_y[i]=0;
  62.                                         zidan_x[i]=0;
  63.                                         boom_x[j]=0;
  64.                                         boom_y[j]=0;
  65.                                         wr_i_lcd(0x30);
  66.                                         length++;
  67.                                         lcd_pos(3,3);
  68.                                         if(length<10) wr_d_lcd(length+48);
  69.                                         else
  70.                                         {
  71.                                                 wr_d_lcd(length/10+48);
  72.                                                 wr_d_lcd(length%10+48);
  73.                                         }
  74.                                 }
  75.                                 j++;
  76.                         }
  77.                         i++;
  78.                 }
  79.                 i=0;
  80.                 while(i<10)
  81.                 {
  82.                         j=0;
  83.                         while(j<10)
  84.                         {
  85.                                 if(((zidan_x[i])==boom_x[j]) && (zidan_y[i]-1==boom_y[j]) && (zidan_x[i]!=0) && (zidan_y[i] != 0))
  86.                                 {
  87.                                         lcd_set_dot(zidan_x[i],zidan_y[i],1);
  88.                                         lcd_set_dot(boom_x[j],boom_y[j],1);
  89.                                         zidan_y[i]=0;
  90.                                         zidan_x[i]=0;
  91.                                         boom_x[j]=0;
  92.                                         boom_y[j]=0;
  93.                                 }
  94.                                 j++;
  95.                         }
  96.                         if((boom_x[i] ==planex[0]&& boom_y[i] ==29) || (boom_x[i] ==planex[1]&& boom_y[i] ==29) || ((boom_x[i] ==(planex[1]+planex[0])/2) && boom_y[i] ==29) )
  97.                         {
  98.                                 die();
  99.                                 break;       
  100.                         }
  101.                         i++;
  102.                 }
  103.                 if(i!=10) break;
  104.                 i=0;
  105.                 t++;
  106.                 ran2=TL1%59;
  107.                 while(i<10)
  108.                 {
  109.                         if(zidan_x[i]!=0)
  110.                         {
  111.                                 if(zidan_y[i]==1)
  112.                                 {
  113.                                         lcd_set_dot(zidan_x[i],zidan_y[i],1);
  114.                                         zidan_y[i]=0;
  115.                                         zidan_x[i]=0;
  116.                                 }
  117.                                 else
  118.                                 {
  119.                                         lcd_set_dot(zidan_x[i],zidan_y[i],1); busy_lcd();
  120.                                         zidan_y[i]--;
  121.                                         lcd_set_dot(zidan_x[i],zidan_y[i],0);
  122.                                 }       
  123.                         }                                  
  124.                         i++;
  125.                 }
  126.                
  127.                 i=0;
  128.                 while(boom_x[i]!=0) i++;
  129.                 if(t==4)
  130.                 {
  131.                         t=0;
  132.                         boom_x[i]=ran2+1;
  133.                         boom_y[i]=1;
  134.                 }
  135.                 i=0;
  136.                 while(i<10)
  137.                 {
  138.                         if(boom_x[i]!=0)
  139.                         {
  140.                                 if(boom_y[i]==30)
  141.                                 {
  142.                                         lcd_set_dot(boom_x[i],boom_y[i],1);
  143.                                         boom_y[i]=0;
  144.                                         boom_x[i]=0;               
  145.                                 }
  146.                                 else
  147.                                 {
  148.                                         lcd_set_dot(boom_x[i],boom_y[i],1); busy_lcd();
  149.                                         boom_y[i]++;
  150.                                         lcd_set_dot(boom_x[i],boom_y[i],0);
  151.                                 }
  152.                         }
  153.                         i++;
  154.                 }                       
  155.                 for(i=0;i<200;i++)
  156.                                 for(j=0;j<50;j++)
  157.                                 {
  158.                                 //        if(i==70) loud=1;
  159.                                         time_1ms(1000);
  160.                                 }        
  161.         }       
  162. }
  163. void picture(void)
  164. {
  165.         img_disp(tab1);
  166.         while(1)
  167.         {
  168.                 if(p!=px)
  169.                 {
  170.                         if(px==4)
  171.                         {
  172.                                 flag=0;
  173.                                 break;
  174.                         }
  175.                         clear_pic();
  176.                         p=px;
  177.                         if(p==1) img_disp(tab1);
  178.                 //        else if(p==2) img_disp(tab1);
  179.                         else if(p==2) img_disp(tab3);
  180.                        
  181.                 }          
  182.         }
  183. }
  184. void mouse_back(void)
  185. {
  186.         char i,j;
  187.         clear_pic();
  188.         wr_i_lcd(0x30);
  189.         wr_i_lcd(0x01);       
  190.         for(i=0;i<4;i++)
  191.                 for(j=0;j<4;j++)
  192.                 {
  193.                         lcd_pos(i,j);
  194.                         wr_d_lcd('o');       
  195.                 }
  196.         i=0;
  197.         lcd_pos(1,4);
  198.         while(mouse[i]!='\0')
  199.         {
  200.                 wr_d_lcd(mouse[i]);
  201.                 i++;               
  202.         }
  203.         wr_d_lcd(length+48);
  204. }
复制代码
 
2.5. 显示与输入



  • lcd_pos():设置 LCD 的显示位置,用于更新屏幕上的字符位置。
  • lcd_set_dot():在特定坐标设置点,用于绘制图形或游戏元素。
  • clear_pic():清除屏幕内容,为下一次显示做好准备。
  1. void game_mouse(void)
  2. {
  3.         uchar i,j,k;
  4.         k=0;
  5.         length=0;
  6.         while(1)
  7.         {
  8.                 ran1=TH1%4;
  9.                 ran2=TL1%4;
  10.                 lcd_pos(ran1,ran2);
  11.                 wr_d_lcd(0x02);
  12.                 dishu=1;
  13.                 loud=0;
  14.                 for(i=0;i<200;i++)
  15.                                 for(j=0;j<200-k;j++)
  16.                                 {
  17.                                         if(i==70) loud=1;
  18.                                         time_1ms(1000);
  19.                                 }
  20.                 if(k<150) k+=10;
  21.                 if(dishu==1)
  22.                 {
  23.                         die();       
  24.                         break;
  25.                 }
  26.                
  27.                 lcd_pos(1,7);
  28.                 length++;
  29.                 if(length<10) wr_d_lcd(length+48);
  30.                 else
  31.                 {
  32.                         wr_d_lcd(length/10+48); wr_d_lcd(length%10+48);       
  33.                 }
  34.                 lcd_pos(ran1,ran2);
  35.                 wr_d_lcd('o');
  36.         }
  37. }
复制代码
 
2.6. 中断处理



  • T0_():中断服务程序,用于处理按键输入,根据按键的差别改变游戏状态或控制游戏举动。包括方向键和确认键的处理。
  1. void T0_() interrupt 3
  2. {
  3.         /*P2 ÉÏ 0x04 ÏÂ 0x10 ×ó 0x01 ÓÒ 0x40 È·ÈÏ 0x80 */
  4.         uchar temp,i,j;
  5.         if(flag==1||flag==2)
  6.         {
  7.                 TH1=(65536-30000)/256;
  8.                 TL1=(65536-30000)%256;
  9.         }
  10.         else
  11.         {
  12.                 TH1=(65536-200)/256;
  13.                 TL1=(65536-200)%256;       
  14.         }
  15.         P2=0x00;
  16.         temp=P2;
  17.         if(temp!=0x00)
  18.         {
  19.                 time_1ms(20);
  20.                 if(temp!=0x00)
  21.                 {       
  22.                         switch(temp)
  23.                         {
  24.                                 case 0x04:
  25.                                 {
  26.                                         loud=0;
  27.                                          if(flag==0)
  28.                                          {
  29.                                                  lcd_pos(slect,0);
  30.                                                  wr_d_lcd(' ');
  31.                                                 if(slect==0) slect==3;
  32.                                                 else slect--;
  33.                                                 lcd_pos(slect,0);
  34.                                                  wr_d_lcd('o');
  35.                                                 while(P2!=0x00);
  36.                                                 time_1ms(50);       
  37.                                          }
  38.                                          else if(flag==1)
  39.                                                          if(snake.dir!=2) snake.dir=3;
  40.                                         loud=1;
  41.                                 }break;
  42.                                 case 0x10:
  43.                                 {
  44.                                         loud=0;
  45.                                         if(flag==0)
  46.                                         {
  47.                                                
  48.                                                 lcd_pos(slect,0);
  49.                                                  wr_d_lcd(' ');
  50.                                                 if(slect==3) slect==0;
  51.                                                 else slect++;
  52.                                                 lcd_pos(slect,0);
  53.                                                  wr_d_lcd('o');
  54.                                                 while(P2!=0x00);
  55.                                                 time_1ms(20);
  56.                                         }
  57.                                          else if(flag==1)
  58.                                                  if(snake.dir!=3) snake.dir=2;
  59.                                  loud=1;
  60.                                 }break;
  61.                                 case 0x01:
  62.                                 {
  63.                                         loud=0;
  64.                                         if(flag==5)
  65.                                         {
  66.                                                 if(choose != 0)
  67.                                                 {
  68.                                                         lcd_pos(3,0);
  69.                                                         wr_d_lcd('o');
  70.                                                         lcd_pos(3,6);
  71.                                                         wr_d_lcd(' ');
  72.                                                         choose=0;
  73.                                                         while(P2!=0x00);
  74.                                                         time_1ms(20);       
  75.                                                 }       
  76.                                         }
  77.                                          else if(flag==1)
  78.                                          {
  79.                                                 if(snake.dir!=0) snake.dir=1;
  80.                                         }
  81.                                             else if(flag==3)
  82.                                          {
  83.                                                  if(planex[0]>1)
  84.                                                 {
  85.                                                                
  86.                                                         planex[0]--;
  87.                                                         planex[1]--;
  88.                                                         lcd_set_dot(planex[0],30,0); busy_lcd();
  89.                                                         if((planex[0]-1)!=0) lcd_set_dot(planex[0]-1,30,1); busy_lcd();
  90.                                                         lcd_set_dot(planex[1],30,0);  busy_lcd();
  91.                                                         if((planex[1]+1)!=113) lcd_set_dot(planex[1]+1,30,1); busy_lcd();
  92.                                                         lcd_set_dot((planex[0]+planex[1])/2,29,0); busy_lcd();
  93.                                                         lcd_set_dot((planex[0]+planex[1])/2+1,29,1); busy_lcd();
  94.                                                         while(P2!=0x00)
  95.                                                         {
  96.                                                                 i=0;
  97.                                                                 while(i<10)
  98.                                                                 {
  99.                                                                         j=0;
  100.                                                                         while(j<10)
  101.                                                                         {
  102.                                                                                 if(((zidan_x[i])==boom_x[j]) && (zidan_y[i]-1==boom_y[j]) && (zidan_x[i]!=0) && (zidan_y[i] != 0))
  103.                                                                                 {
  104.                                                                                         lcd_set_dot(zidan_x[i],zidan_y[i],1);
  105.                                                                                         lcd_set_dot(boom_x[j],boom_y[j],1);
  106.                                                                                         zidan_y[i]=0;
  107.                                                                                         zidan_x[i]=0;
  108.                                                                                         boom_x[j]=0;
  109.                                                                                         boom_y[j]=0;
  110.                                                                                         wr_i_lcd(0x30);
  111.                                                                                         length++;
  112.                                                                                         lcd_pos(3,3);
  113.                                                                                         if(length<10) wr_d_lcd(length+48);
  114.                                                                                         else
  115.                                                                                         {
  116.                                                                                                 wr_d_lcd(length/10+48);
  117.                                                                                                 wr_d_lcd(length%10+48);
  118.                                                                                         }
  119.                                                                                 }
  120.                                                                                 j++;
  121.                                                                         }
  122.                                                                         i++;
  123.                                                                 }       
  124.                                                         }
  125.                                                         time_1ms(20);
  126.                                                        
  127.                                                 }
  128.                                         }
  129.                                         else if(flag==4)
  130.                                         {
  131.                                                 if(px>1) px--;
  132.                                                 else if(px==1) px=2;
  133.                                                 while(P2!=0x00);
  134.                                                 time_1ms(20);
  135.                                         }
  136.                                         loud=1;               
  137.                                 }break;
  138.                                 case 0x40:
  139.                                 {
  140.                                         loud=0;
  141.                                         if(flag==5)
  142.                                         {
  143.                                                 if(choose != 1)
  144.                                                 {
  145.                                                         lcd_pos(3,6);
  146.                                                         wr_d_lcd('o');
  147.                                                         lcd_pos(3,0);
  148.                                                         wr_d_lcd(' ');
  149.                                                         choose=1;
  150.                                                         while(P2!=0x00);
  151.                                                         time_1ms(20);       
  152.                                                 }       
  153.                                         }
  154.                                          else if(flag==1)
  155.                                          {
  156.                                                 if(snake.dir!=1) snake.dir=0;
  157.                                         }
  158.                                          else if(flag==3)
  159.                                          {
  160.                                                  if(planex[1]<59)
  161.                                                 {
  162.                                                                                                
  163.                                                         planex[1]++;
  164.                                                         planex[0]++;
  165.                                                         lcd_set_dot(planex[0],30,0); busy_lcd();
  166.                                                         if((planex[0]-1)!=0) lcd_set_dot(planex[0]-1,30,1); busy_lcd();
  167.                                                         lcd_set_dot(planex[1],30,0);  busy_lcd();
  168.                                                         if((planex[1]+1)!=60) lcd_set_dot(planex[1]+1,30,1); busy_lcd();
  169.                                                         lcd_set_dot((planex[0]+planex[1])/2,29,0); busy_lcd();
  170.                                                         lcd_set_dot((planex[0]+planex[1])/2-1,29,1); busy_lcd();
  171.                                                         while(P2!=0x00)
  172.                                                         {
  173.                                                                 i=0;
  174.                                                                 while(i<10)
  175.                                                                 {
  176.                                                                         j=0;
  177.                                                                         while(j<10)
  178.                                                                         {
  179.                                                                                 if(((zidan_x[i])==boom_x[j]) && (zidan_y[i]-1==boom_y[j]) && (zidan_x[i]!=0) && (zidan_y[i] != 0))
  180.                                                                                 {
  181.                                                                                         lcd_set_dot(zidan_x[i],zidan_y[i],1);
  182.                                                                                         lcd_set_dot(boom_x[j],boom_y[j],1);
  183.                                                                                         zidan_y[i]=0;
  184.                                                                                         zidan_x[i]=0;
  185.                                                                                         boom_x[j]=0;
  186.                                                                                         boom_y[j]=0;
  187.                                                                                         wr_i_lcd(0x30);
  188.                                                                                         length++;
  189.                                                                                         lcd_pos(3,3);
  190.                                                                                         if(length<10) wr_d_lcd(length+48);
  191.                                                                                         else
  192.                                                                                         {
  193.                                                                                                 wr_d_lcd(length/10+48);
  194.                                                                                                 wr_d_lcd(length%10+48);
  195.                                                                                         }
  196.                                                                                 }
  197.                                                                                 j++;
  198.                                                                         }
  199.                                                                         i++;
  200.                                                                 }
  201.                                                         }
  202.                                                         time_1ms(20);
  203.                                                        
  204.                                                 }
  205.                                          }
  206.                                          else if(flag==4)
  207.                                          {
  208.                                                  if(px<2) px++;
  209.                                                 else if(px==2) px=1;
  210.                                                 while(P2!=0x00);
  211.                                                 time_1ms(20);
  212.                                          }
  213.                                          loud=1;               
  214.                                 }break;
  215.                                 case 0x80:
  216.                                 {
  217.                                         loud=0;
  218.                                         if(flag==0)
  219.                                         {
  220.                                                 if(slect==0) flag=1;
  221.                                                 else if(slect==1) flag=2;
  222.                                                 else if(slect==2) flag=3;
  223.                                                 else if(slect==3) flag=4;
  224.                                                 while(P2!=0x00);
  225.                                                 time_1ms(20);
  226.                                         }
  227.                                         else if(flag==5)
  228.                                         {
  229.                                                 if(choose==0)
  230.                                                 {
  231.                                                         flag=slect+1;
  232.                                                 }
  233.                                                 else if(choose==1) flag=0;
  234.                                                 choose=0;
  235.                                                 while(P2!=0x00);
  236.                                                 time_1ms(20);
  237.                                         }
  238.                                         else if(flag==3)
  239.                                         {
  240.                                                 i=0;
  241.                                                 while(zidan_x[i]!=0) i++;
  242.                                                 zidan_x[i]=planex[0]+1;
  243.                                                 zidan_y[i]=28;
  244.                                                 while(P2!=0x00);
  245.                                                 time_1ms(100);       
  246.                                         }               
  247.                                         else if(flag==4)
  248.                                         {
  249.                                                 px=4;
  250.                                                 while(P2!=0x00);
  251.                                                 time_1ms(100);
  252.                                         }
  253.                                         loud=1;       
  254.                                 }break;
  255.                         }
  256.                 }          
  257.         }
  258.         /*0x77           0xb7           0xd7           0xe7
  259.           0x7b           0xbb           0xdb           0xeb
  260.           0x7d           0xbd           0xdd           0xed
  261.           0x7e     0xbe    0xde    0xee */
  262.         P0=0xf7;
  263.         temp=P0;
  264.         if(temp!=0xf7)
  265.         {
  266.                
  267.                 time_1ms(20);
  268.                 if(temp!=0xf7)
  269.                 {
  270.                         switch(temp)
  271.                         {
  272.                                 case 0x77:
  273.                                 {
  274.                                         if(ran1==0&&ran2==0) dishu=0;       
  275.                                 }break;
  276.                                 case 0xb7:
  277.                                 {
  278.                                         if(ran1==0&&ran2==1) dishu=0;       
  279.                                 }break;
  280.                                 case 0xd7:
  281.                                 {
  282.                                         if(ran1==0&&ran2==2) dishu=0;
  283.                                 }break;
  284.                                 case 0xe7:
  285.                                 {
  286.                                         if(ran1==0&&ran2==3) dishu=0;       
  287.                                 }break;
  288.                         }
  289.         //           while(P0!=0xf7);
  290.                     time_1ms(20);
  291.                 }
  292.         }
  293.         P0=0xfb;
  294.         temp=P0;
  295.         if(temp!=0xfb)
  296.         {
  297.                
  298.                 time_1ms(20);
  299.                 if(temp!=0xfb)
  300.                 {
  301.                         switch(temp)
  302.                         {
  303.                                 case 0x7b:
  304.                                 {
  305.                                         if(ran1==1&&ran2==0) dishu=0;               
  306.                                 }break;
  307.                                 case 0xbb:
  308.                                 {
  309.                                         if(ran1==1&&ran2==1) dishu=0;       
  310.                                 }break;
  311.                                 case 0xdb:
  312.                                 {
  313.                                         if(ran1==1&&ran2==2) dishu=0;
  314.                                 }break;
  315.                                 case 0xeb:
  316.                                 {
  317.                                         if(ran1==1&&ran2==3) dishu=0;       
  318.                                 }break;
  319.                         }
  320.                 //        while(P0!=0xfb);
  321.                     time_1ms(20);
  322.                 }
  323.         }
  324.         P0=0xfd;
  325.         temp=P0;
  326.         if(temp!=0xfd)
  327.         {
  328.                
  329.                 time_1ms(20);
  330.                 if(temp!=0xfd)
  331.                 {
  332.                         switch(temp)
  333.                         {
  334.                                 case 0x7d:
  335.                                 {
  336.                                         if(ran1==2&&ran2==0) dishu=0;       
  337.                                 }break;
  338.                                 case 0xbd:
  339.                                 {
  340.                                         if(ran1==2&&ran2==1) dishu=0;                       
  341.                                 }break;
  342.                                 case 0xdd:
  343.                                 {
  344.                                         if(ran1==2&&ran2==2) dishu=0;
  345.                                 }break;
  346.                                 case 0xed:
  347.                                 {
  348.                                         if(ran1==2&&ran2==3) dishu=0;               
  349.                                 }break;
  350.                         }
  351.         //           while(P0!=0xfd);
  352.                     time_1ms(20);
  353.                 }
  354.         }
  355.         P0=0xfe;
  356.         temp=P0;
  357.         if(temp!=0xfe)
  358.         {
  359.                
  360.                 time_1ms(20);
  361.                 if(temp!=0xfe)
  362.                 {
  363.                         switch(temp)
  364.                         {
  365.                                 case 0x7e:
  366.                                 {       
  367.                                         if(ran1==3&&ran2==0) dishu=0;       
  368.                                 }break;
  369.                                 case 0xbe:
  370.                                 {
  371.                                         if(ran1==3&&ran2==1) dishu=0;       
  372.                                 }break;
  373.                                 case 0xde:
  374.                                 {
  375.                                         if(ran1==3&&ran2==2) dishu=0;         
  376.                                 }break;
  377.                                 case 0xee:
  378.                                 {
  379.                                         if(ran1==3&&ran2==3) dishu=0;       
  380.                                 }break;
  381.                         }
  382.                 //         while(P0!=0xfe);
  383.                     time_1ms(20);
  384.                 }
  385.         }       
  386. }
复制代码
 
2.7. 主函数



  • main():程序的入口,初始化 LCD,显示起始画面,进入主循环。根据差别的 flag 值进入相应的游戏模块或功能模块。
  1. void main()
  2. {
  3.    char i=0,j;
  4.    loud=1;
  5.    init_lcd();     //³õʼ»¯
  6.   img_disp(tab1);    //ÏÔʾͼÏñ
  7.   delaynms(1000);
  8.   wr_i_lcd(0x30);
  9.    wr_i_lcd(0x01);
  10.    lcd_pos(1,1);
  11.    while(name[i]!='\0')
  12.    {
  13.                    wr_d_lcd(name[i]);
  14.                 i++;
  15.                 if(i%2!=0)loud=0;
  16.                 delay(20000);
  17.    }
  18.    clear_pic();
  19.    wr_i_lcd(0x30);
  20.         wr_i_lcd(0x01);
  21.         TMOD=0x10;
  22.         TH1=(65536-8000)/256;
  23.         TL1=(65536-8000)%256;
  24.         EA=1;                 
  25.         ET1=1;
  26.         TR1=1;
  27.         while(1)
  28.         {
  29.                 clear_pic();
  30.                 wr_i_lcd(0x30);
  31.                 wr_i_lcd(0x01);
  32.                 cata();
  33.                 if(flag==1)
  34.                 {
  35.                         while(flag==1)
  36.                         {
  37.                                 food=0;
  38.                                 back_ground();
  39.                                 snake_init();
  40.                                 game_snake();
  41.                         }       
  42.                 }
  43.                 if(flag==2)
  44.                 {                       
  45.                         while(flag==2)
  46.                         {
  47.                                 /*Ò»ÅÅ16¸öµØÊó
  48.                                 00 01 02 03
  49.                                 10 11 12 13
  50.                                 20 21 22 23
  51.                                 30 31 32 33*/
  52.                                 length=0;
  53.                                 mouse_back();
  54.                                 game_mouse();
  55.                         }               
  56.                 }
  57.                 if(flag==3)
  58.                 {
  59.                         while(flag==3)
  60.                         {
  61.                                 length=0;
  62.                                 back_ground();
  63.                                 plane_init();
  64.                                 game_plane();
  65.                         }       
  66.                 }
  67.                 if(flag==4)
  68.                 {
  69.                         px=1;
  70.                         p=1;
  71.                         clear_pic();
  72.                         wr_i_lcd(0x30);
  73.                         wr_i_lcd(0x01);
  74.                         picture();               
  75.                 }
  76.         }
  77.                
  78. }
复制代码
2.8. 源码整合:

  1. #include "includes.h"
  2. #include "intrins.h"
  3. #include "stdlib.h"
  4. // 方向代码:0 右,1 左,2 上,3 下
  5. // P2 端口:上 0x04,下 0x10,左 0x01,右 0x40,确认 0x80
  6. uchar code name[] = {"小龟游戏机"};
  7. uchar code game1[] = {"贪吃蛇"};
  8. uchar code game2[] = {"打地鼠"};
  9. uchar code game3[] = {"飞机大战"};
  10. uchar code game4[] = {"图片"};
  11. uchar code loser[] = {"你输了"};
  12. uchar code lxy1[] = {"继续"};
  13. uchar code lxy2[] = {"返回"};
  14. uchar code cj[] = {"长度: "};
  15. uchar code fjs[] = {"飞机: "};
  16. char code mouse[] = {"老鼠: "};
  17. // 全局变量定义
  18. uchar p = 1, px = 1;
  19. uchar length = 9;       
  20. uchar flag = 0, slect = 0, choose = 0;
  21. uchar ran1, ran2, food = 0;
  22. uchar planex[3] = {28, 30, 0};
  23. uchar zidan_x[10] = {0}, zidan_y[10] = {0};
  24. uchar boom_x[10] = {0}, boom_y[10] = {0};
  25. char dishu = 0;
  26. sbit loud = P3^7; // 定义蜂鸣器的开关
  27. // 贪吃蛇的结构体
  28. struct xx {
  29.     char x[22];
  30.     char y[22];
  31.     char head;
  32.     char tail;
  33.     char dir;
  34. } snake;
  35. // 贪吃蛇初始化函数
  36. void snake_init(void) {
  37.     lcd_set_dot(1, 1, 0);
  38.     lcd_set_dot(2, 1, 0);
  39.     lcd_set_dot(3, 1, 0);
  40.     lcd_set_dot(4, 1, 0);
  41.     lcd_set_dot(5, 1, 0);
  42.     lcd_set_dot(6, 1, 0);
  43.     snake.x[0] = 1; snake.y[0] = 1;
  44.     snake.x[1] = 2; snake.y[1] = 1;
  45.     snake.x[2] = 3; snake.y[2] = 1;
  46.     snake.x[3] = 4; snake.y[3] = 1;
  47.     snake.x[4] = 5; snake.y[4] = 1;
  48.     snake.x[5] = 6; snake.y[5] = 1;
  49.     snake.head = 5;
  50.     snake.tail = 0;
  51.     snake.dir = 0;       
  52. }
  53. // 游戏失败处理函数
  54. void die(void) {
  55.     uchar i;
  56.     loud = 0; // 关闭蜂鸣器
  57.     flag = 5; // 设置标志为5,表示游戏结束
  58.     clear_pic();
  59.     wr_i_lcd(0x30);
  60.     wr_i_lcd(0x01);
  61.     i = 0;
  62.     lcd_pos(0, 2);
  63.     while (loser[i] != '\0') {
  64.         wr_d_lcd(loser[i]);
  65.         i++;
  66.     }
  67.     i = 0;
  68.     lcd_pos(2, 0);
  69.     while (lxy1[i] != '\0') {
  70.         wr_d_lcd(lxy1[i]);
  71.         i++;       
  72.     }
  73.     i = 0;
  74.     lcd_pos(2, 5);
  75.     while (lxy2[i] != '\0') {
  76.         wr_d_lcd(lxy2[i]);
  77.         i++;       
  78.     }
  79.     lcd_pos(3, 0);
  80.     wr_d_lcd('o');
  81.     delay(1000);
  82.     loud = 1; // 打开蜂鸣器
  83.     while (flag == 5);       
  84. }
  85. // 游戏菜单选择
  86. uchar cata(void) {
  87.     uchar i;
  88.     i = 0;
  89.     slect = 0;
  90.     lcd_pos(0, 0);
  91.     wr_d_lcd('o');
  92.     lcd_pos(0, 1);
  93.     while (game1[i] != '\0') {
  94.          wr_d_lcd(game1[i]);
  95.          i++;
  96.     }
  97.     lcd_pos(1, 1);
  98.     i = 0;
  99.     while (game3[i] != '\0') {
  100.          wr_d_lcd(game2[i]);
  101.          i++;
  102.     }
  103.     lcd_pos(2, 1);
  104.     i = 0;
  105.     while (game3[i] != '\0') {
  106.          wr_d_lcd(game3[i]);
  107.          i++;
  108.     }
  109.     lcd_pos(3, 1);
  110.     i = 0;
  111.     while (game4[i] != '\0') {
  112.          wr_d_lcd(game4[i]);
  113.          i++;
  114.     }
  115.     while (flag == 0);       
  116. }
  117. // 贪吃蛇游戏逻辑
  118. void game_snake(void) {
  119.     uchar i, k, j;
  120.     k = 0;
  121.     food = 0;
  122.     length = 6;
  123.     lcd_pos(3, 0);
  124.     i = 0;
  125.     while (cj[i] != '\0') {
  126.         wr_d_lcd(cj[i]);
  127.         i++;       
  128.     }
  129.     wr_d_lcd(length + 48);
  130.     while (1) {
  131.         if (food == 0) {
  132.             while (1) { // 确保生成的食物不在蛇身上
  133.                 ran1 = TH1 % 59 + 1;
  134.                 ran2 = TL1 % 30 + 1;
  135.                 food = 1;
  136.                 i = snake.tail;
  137.                 while (i != snake.head) {
  138.                     if (snake.x[i] == ran1 && snake.y[i] == ran2) {
  139.                         break;
  140.                     }
  141.                     i++;
  142.                     if (i == 22) i = 0;
  143.                     if (i == snake.head) {
  144.                         if (snake.x[i] == ran1 && snake.y[i] == ran2) {
  145.                             i = snake.head - 1;
  146.                             break;
  147.                         }
  148.                     }       
  149.                 }
  150.                 if (i == snake.head) break;       
  151.             }
  152.             lcd_set_dot(ran1, ran2, 0);
  153.         }
  154.         i = snake.tail;
  155.         while (i != snake.head) { // 蛇碰到自己
  156.             if (snake.x[i] == snake.x[snake.head] && snake.y[i] == snake.y[snake.head]) {
  157.                 die();       
  158.                 break;       
  159.             }
  160.             i++;
  161.             if (i == 22) i = 0;
  162.         }
  163.         if (i != snake.head) break;
  164.         if (snake.x[snake.head] >= 60 || snake.y[snake.head] >= 30 || snake.x[snake.head] == 0 || snake.y[snake.head] == 0) { // 蛇撞墙
  165.             die();       
  166.             break;       
  167.         }
  168.         snake.head++;
  169.         if (snake.head == 22) {
  170.             snake.head = 0;
  171.             if (snake.dir == 0) { // 右
  172.                 snake.x[snake.head] = snake.x[21] + 1;
  173.                 snake.y[snake.head] = snake.y[21];       
  174.             } else if (snake.dir == 1) { // 左
  175.                 snake.x[snake.head] = snake.x[21] - 1;
  176.                 snake.y[snake.head] = snake.y[21];       
  177.             } else if (snake.dir == 2) { // 下
  178.                 snake.x[snake.head] = snake.x[21];
  179.                 snake.y[snake.head] = snake.y[21] + 1;
  180.             } else if (snake.dir == 3) { // 上
  181.                 snake.x[snake.head] = snake.x[21];
  182.                 snake.y[snake.head] = snake.y[21] - 1;       
  183.             }       
  184.         } else {
  185.             if (snake.dir == 0) {
  186.                 snake.x[snake.head] = snake.x[snake.head - 1] + 1;
  187.                 snake.y[snake.head] = snake.y[snake.head - 1];       
  188.             } else if (snake.dir == 1) {
  189.                 snake.x[snake.head] = snake.x[snake.head - 1] - 1;
  190.                 snake.y[snake.head] = snake.y[snake.head - 1];       
  191.             } else if (snake.dir == 2) {
  192.                 snake.x[snake.head] = snake.x[snake.head - 1];
  193.                 snake.y[snake.head] = snake.y[snake.head - 1] + 1;
  194.             } else if (snake.dir == 3) {
  195.                 snake.x[snake.head] = snake.x[snake.head - 1];
  196.                 snake.y[snake.head] = snake.y[snake.head - 1] - 1;
  197.             }
  198.         }
  199.         lcd_set_dot(snake.x[snake.head], snake.y[snake.head], 0);
  200.         if (snake.x[snake.head] != ran1 || snake.y[snake.head] != ran2) { // 蛇没有吃到食物
  201.             lcd_set_dot(snake.x[snake.tail], snake.y[snake.tail], 1);
  202.             snake.tail++;
  203.             if (snake.tail == 22) snake.tail = 0;
  204.         } else {  // 蛇吃到食物
  205.             if (k < 90) k += 10;
  206.             loud = 0;
  207.             length++;
  208.             wr_i_lcd(0x30);
  209.             // wr_i_lcd(0x01);
  210.             lcd_pos(3, 3);
  211.             wr_d_lcd(length / 10 + 48);
  212.             wr_d_lcd(length % 10 + 48);
  213.             food = 0;
  214.         }
  215.         for (i = 0; i < 100; i++)
  216.             for (j = 0; j < 100 - k; j++)
  217.                 time_1ms(1000);
  218.         loud = 1;       
  219.     }       
  220. }
  221. // 飞机初始化函数
  222. void plane_init(void) {
  223.     uchar i;
  224.     lcd_set_dot(29, 29, 0);
  225.     lcd_set_dot(28, 30, 0);
  226.     lcd_set_dot(30, 30, 0);
  227.     lcd_set_dot(29, 30, 0);
  228.     for (i = 0; i < 10; i++) {
  229.         zidan_x[i] = 0;
  230.         zidan_y[i] = 0;
  231.         boom_x[i] = 0;
  232.         boom_y[i] = 0;       
  233.     }
  234.     planex[0] = 28;       
  235.     planex[1] = 30;
  236. }
  237. // 游戏背景绘制
  238. void back_ground(void) {
  239.     uchar i;
  240.     clear_pic();
  241.     wr_i_lcd(0x30);
  242.     wr_i_lcd(0x01);
  243.     for (i = 0; i <= 60; i++) {
  244.         lcd_set_dot(i, 0, 0);
  245.         lcd_set_dot(i, 31, 0);       
  246.     }
  247.     for (i = 0; i <= 32; i++) {
  248.         lcd_set_dot(0, i, 0);
  249.         lcd_set_dot(60, i, 0);       
  250.     }
  251.     if (flag == 3) {
  252.         lcd_pos(3, 0);
  253.         i = 0;
  254.         while (fjs[i] != '\0') {
  255.             wr_d_lcd(fjs[i]);
  256.             i++;
  257.         }
  258.         wr_d_lcd(length + 48);
  259.     }               
  260. }
  261. // 飞机大战游戏逻辑
  262. void game_plane(void) {
  263.     uchar i, t = 0, j = 0;
  264.     while (1) {
  265.         i = 0;
  266.         while (i < 10) {
  267.             j = 0;
  268.             while (j < 10) {
  269.                 if (((zidan_x[i]) == boom_x[j]) && ((zidan_y[i] - 1 == boom_y[j]) || (zidan_y[i] == boom_y[j])) && (zidan_x[i] != 0) && (zidan_y[i] != 0)) {
  270.                     lcd_set_dot(zidan_x[i], zidan_y[i], 1);
  271.                     lcd_set_dot(boom_x[j], boom_y[j], 1);
  272.                     zidan_y[i] = 0;
  273.                     zidan_x[i] = 0;
  274.                     boom_x[j] = 0;
  275.                     boom_y[j] = 0;
  276.                     wr_i_lcd(0x30);
  277.                     length++;
  278.                     lcd_pos(3, 3);
  279.                     if (length < 10) wr_d_lcd(length + 48);
  280.                     else {
  281.                         wr_d_lcd(length / 10 + 48);
  282.                         wr_d_lcd(length % 10 + 48);
  283.                     }
  284.                 }
  285.                 j++;
  286.             }
  287.             i++;
  288.         }
  289.         i = 0;
  290.         while (i < 10) {
  291.             j = 0;
  292.             while (j < 10) {
  293.                 if (((zidan_x[i]) == boom_x[j]) && (zidan_y[i] - 1 == boom_y[j]) && (zidan_x[i] != 0) && (zidan_y[i] != 0)) {
  294.                     lcd_set_dot(zidan_x[i], zidan_y[i], 1);
  295.                     lcd_set_dot(boom_x[j], boom_y[j], 1);
  296.                     zidan_y[i] = 0;
  297.                     zidan_x[i] = 0;
  298.                     boom_x[j] = 0;
  299.                     boom_y[j] = 0;
  300.                 }
  301.                 j++;
  302.             }
  303.             if ((boom_x[i] == planex[0] && boom_y[i] == 29) || (boom_x[i] == planex[1] && boom_y[i] == 29) || ((boom_x[i] == (planex[1] + planex[0]) / 2) && boom_y[i] == 29)) {
  304.                 die();
  305.                 break;       
  306.             }
  307.             i++;
  308.         }
  309.         if (i != 10) break;
  310.         i = 0;
  311.         t++;
  312.         ran2 = TL1 % 59;
  313.         while (i < 10) {
  314.             if (zidan_x[i] != 0) {
  315.                 if (zidan_y[i] == 1) {
  316.                     lcd_set_dot(zidan_x[i], zidan_y[i], 1);
  317.                     zidan_y[i] = 0;
  318.                     zidan_x[i] = 0;
  319.                 } else {
  320.                     lcd_set_dot(zidan_x[i], zidan_y[i], 1); busy_lcd();
  321.                     zidan_y[i]--;
  322.                     lcd_set_dot(zidan_x[i], zidan_y[i], 0);
  323.                 }       
  324.             }                                  
  325.             i++;
  326.         }
  327.         
  328.         i = 0;
  329.         while (boom_x[i] != 0) i++;
  330.         if (t == 4) {
  331.             t = 0;
  332.             boom_x[i] = ran2 + 1;
  333.             boom_y[i] = 1;
  334.         }
  335.         i = 0;
  336.         while (i < 10) {
  337.             if (boom_x[i] != 0) {
  338.                 if (boom_y[i] == 30) {
  339.                     lcd_set_dot(boom_x[i], boom_y[i], 1);
  340.                     boom_y[i] = 0;
  341.                     boom_x[i] = 0;               
  342.                 } else {
  343.                     lcd_set_dot(boom_x[i], boom_y[i], 1); busy_lcd();
  344.                     boom_y[i]++;
  345.                     lcd_set_dot(boom_x[i], boom_y[i], 0);
  346.                 }
  347.             }
  348.             i++;
  349.         }                       
  350.         for (i = 0; i < 200; i++)
  351.             for (j = 0; j < 50; j++) {
  352.                 // if (i == 70) loud = 1;
  353.                 time_1ms(1000);
  354.             }        
  355.     }       
  356. }
  357. // 图片显示函数
  358. void picture(void) {
  359.     img_disp(tab1);
  360.     while (1) {
  361.         if (p != px) {
  362.             if (px == 4) {
  363.                 flag = 0;
  364.                 break;
  365.             }
  366.             clear_pic();
  367.             p = px;
  368.             if (p == 1) img_disp(tab1);
  369.             // else if (p == 2) img_disp(tab1);
  370.             else if (p == 2) img_disp(tab3);
  371.             
  372.         }          
  373.     }
  374. }
  375. // 打地鼠背景初始化
  376. void mouse_back(void) {
  377.     char i, j;
  378.     clear_pic();
  379.     wr_i_lcd(0x30);
  380.     wr_i_lcd(0x01);       
  381.     for (i = 0; i < 4; i++)
  382.         for (j = 0; j < 4; j++) {
  383.             lcd_pos(i, j);
  384.             wr_d_lcd('o');       
  385.         }
  386.     i = 0;
  387.     lcd_pos(1, 4);
  388.     while (mouse[i] != '\0') {
  389.         wr_d_lcd(mouse[i]);
  390.         i++;               
  391.     }
  392.     wr_d_lcd(length + 48);
  393. }
  394. // 打地鼠游戏逻辑
  395. void game_mouse(void) {
  396.     uchar i, j, k;
  397.     k = 0;
  398.     length = 0;
  399.     while (1) {
  400.         ran1 = TH1 % 4;
  401.         ran2 = TL1 % 4;
  402.         lcd_pos(ran1, ran2);
  403.         wr_d_lcd(0x02);
  404.         dishu = 1;
  405.         loud = 0;
  406.         for (i = 0; i < 200; i++)
  407.             for (j = 0; j < 200 - k; j++) {
  408.                 if (i == 70) loud = 1;
  409.                 time_1ms(1000);
  410.             }
  411.         if (k < 150) k += 10;
  412.         if (dishu == 1) {
  413.             die();       
  414.             break;
  415.         }
  416.         
  417.         lcd_pos(1, 7);
  418.         length++;
  419.         if (length < 10) wr_d_lcd(length + 48);
  420.         else {
  421.             wr_d_lcd(length / 10 + 48);
  422.             wr_d_lcd(length % 10 + 48);       
  423.         }
  424.         lcd_pos(ran1, ran2);
  425.         wr_d_lcd('o');
  426.     }
  427. }
  428. // 主函数入口
  429. void main() {
  430.     char i = 0, j;
  431.     loud = 1;
  432.     init_lcd();     // 初始化LCD
  433.     img_disp(tab1); // 显示图片
  434.     delaynms(1000);
  435.     wr_i_lcd(0x30);
  436.     wr_i_lcd(0x01);
  437.     lcd_pos(1, 1);
  438.     while (name[i] != '\0') {
  439.         wr_d_lcd(name[i]);
  440.         i++;
  441.         if (i % 2 != 0) loud = 0;
  442.         delay(20000);
  443.     }
  444.     clear_pic();
  445.     wr_i_lcd(0x30);
  446.     wr_i_lcd(0x01);
  447.     TMOD = 0x10;
  448.     TH1 = (65536 - 8000) / 256;
  449.     TL1 = (65536 - 8000) % 256;
  450.     EA = 1;                 
  451.     ET1 = 1;
  452.     TR1 = 1;
  453.     while (1) {
  454.         clear_pic();
  455.         wr_i_lcd(0x30);
  456.         wr_i_lcd(0x01);
  457.         cata();
  458.         if (flag == 1) {
  459.             while (flag == 1) {
  460.                 food = 0;
  461.                 back_ground();
  462.                 snake_init();
  463.                 game_snake();
  464.             }       
  465.         }
  466.         if (flag == 2) {                       
  467.             while (flag == 2) {
  468.                 /* 一个4x4的打地鼠格子
  469.                 00 01 02 03
  470.                 10 11 12 13
  471.                 20 21 22 23
  472.                 30 31 32 33 */
  473.                 length = 0;
  474.                 mouse_back();
  475.                 game_mouse();
  476.             }               
  477.         }
  478.         if (flag == 3) {
  479.             while (flag == 3) {
  480.                 length = 0;
  481.                 back_ground();
  482.                 plane_init();
  483.                 game_plane();
  484.             }       
  485.         }
  486.         if (flag == 4) {
  487.             px = 1;
  488.             p = 1;
  489.             clear_pic();
  490.             wr_i_lcd(0x30);
  491.             wr_i_lcd(0x01);
  492.             picture();               
  493.         }
  494.     }
  495. }
  496. // 中断处理函数
  497. void T0_() interrupt 3 {
  498.     /* P2 上 0x04 下 0x10 左 0x01 右 0x40 确认 0x80 */
  499.     uchar temp, i, j;
  500.     if (flag == 1 || flag == 2) {
  501.         TH1 = (65536 - 30000) / 256;
  502.         TL1 = (65536 - 30000) % 256;
  503.     } else {
  504.         TH1 = (65536 - 200) / 256;
  505.         TL1 = (65536 - 200) % 256;       
  506.     }
  507.     P2 = 0x00; // 初始化P2为0
  508.     temp = P2;
  509.     if (temp != 0x00) {
  510.         time_1ms(20);
  511.         if (temp != 0x00) {       
  512.             switch (temp) {
  513.                 case 0x04: { // 上键
  514.                     loud = 0;
  515.                     if (flag == 0) { // 菜单导航
  516.                         lcd_pos(slect, 0);
  517.                         wr_d_lcd(' ');
  518.                         if (slect == 0) slect = 3;
  519.                         else slect--;
  520.                         lcd_pos(slect, 0);
  521.                         wr_d_lcd('o');
  522.                         while (P2 != 0x00);
  523.                         time_1ms(50);       
  524.                     } else if (flag == 1) { // 贪吃蛇游戏中
  525.                         if (snake.dir != 2) snake.dir = 3;
  526.                     }
  527.                     loud = 1;
  528.                 } break;
  529.                 case 0x10: { // 下键
  530.                     loud = 0;
  531.                     if (flag == 0) { // 菜单导航
  532.                         lcd_pos(slect, 0);
  533.                         wr_d_lcd(' ');
  534.                         if (slect == 3) slect = 0;
  535.                         else slect++;
  536.                         lcd_pos(slect, 0);
  537.                         wr_d_lcd('o');
  538.                         while (P2 != 0x00);
  539.                         time_1ms(20);
  540.                     } else if (flag == 1) { // 贪吃蛇游戏中
  541.                         if (snake.dir != 3) snake.dir = 2;
  542.                     }
  543.                     loud = 1;
  544.                 } break;
  545.                 case 0x01: { // 左键
  546.                     loud = 0;
  547.                     if (flag == 5) { // 游戏失败后
  548.                         if (choose != 0) {
  549.                             lcd_pos(3, 0);
  550.                             wr_d_lcd('o');
  551.                             lcd_pos(3, 6);
  552.                             wr_d_lcd(' ');
  553.                             choose = 0;
  554.                             while (P2 != 0x00);
  555.                             time_1ms(20);       
  556.                         }       
  557.                     } else if (flag == 1) { // 贪吃蛇游戏中
  558.                         if (snake.dir != 0) snake.dir = 1;
  559.                     } else if (flag == 3) { // 飞机大战游戏中
  560.                         if (planex[0] > 1) {
  561.                             planex[0]--;
  562.                             planex[1]--;
  563.                             lcd_set_dot(planex[0], 30, 0); busy_lcd();
  564.                             if ((planex[0] - 1) != 0) lcd_set_dot(planex[0] - 1, 30, 1); busy_lcd();
  565.                             lcd_set_dot(planex[1], 30, 0);  busy_lcd();
  566.                             if ((planex[1] + 1) != 113) lcd_set_dot(planex[1] + 1, 30, 1); busy_lcd();
  567.                             lcd_set_dot((planex[0] + planex[1]) / 2, 29, 0); busy_lcd();
  568.                             lcd_set_dot((planex[0] + planex[1]) / 2 + 1, 29, 1); busy_lcd();
  569.                             while (P2 != 0x00) {
  570.                                 i = 0;
  571.                                 while (i < 10) {
  572.                                     j = 0;
  573.                                     while (j < 10) {
  574.                                         if (((zidan_x[i]) == boom_x[j]) && (zidan_y[i] - 1 == boom_y[j]) && (zidan_x[i] != 0) && (zidan_y[i] != 0)) {
  575.                                             lcd_set_dot(zidan_x[i], zidan_y[i], 1);
  576.                                             lcd_set_dot(boom_x[j], boom_y[j], 1);
  577.                                             zidan_y[i] = 0;
  578.                                             zidan_x[i] = 0;
  579.                                             boom_x[j] = 0;
  580.                                             boom_y[j] = 0;
  581.                                             wr_i_lcd(0x30);
  582.                                             length++;
  583.                                             lcd_pos(3, 3);
  584.                                             if (length < 10) wr_d_lcd(length + 48);
  585.                                             else {
  586.                                                 wr_d_lcd(length / 10 + 48);
  587.                                                 wr_d_lcd(length % 10 + 48);
  588.                                             }
  589.                                         }
  590.                                         j++;
  591.                                     }
  592.                                     i++;
  593.                                 }       
  594.                             }
  595.                             time_1ms(20);
  596.                         }
  597.                     } else if (flag == 4) { // 图片显示中
  598.                         if (px > 1) px--;
  599.                         else if (px == 1) px = 2;
  600.                         while (P2 != 0x00);
  601.                         time_1ms(20);
  602.                     }
  603.                     loud = 1;               
  604.                 } break;
  605.                 case 0x40: { // 右键
  606.                     loud = 0;
  607.                     if (flag == 5) { // 游戏失败后
  608.                         if (choose != 1) {
  609.                             lcd_pos(3, 6);
  610.                             wr_d_lcd('o');
  611.                             lcd_pos(3, 0);
  612.                             wr_d_lcd(' ');
  613.                             choose = 1;
  614.                             while (P2 != 0x00);
  615.                             time_1ms(20);       
  616.                         }       
  617.                     } else if (flag == 1) { // 贪吃蛇游戏中
  618.                         if (snake.dir != 1) snake.dir = 0;
  619.                     } else if (flag == 3) { // 飞机大战游戏中
  620.                         if (planex[1] < 59) {
  621.                             planex[1]++;
  622.                             planex[0]++;
  623.                             lcd_set_dot(planex[0], 30, 0); busy_lcd();
  624.                             if ((planex[0] - 1) != 0) lcd_set_dot(planex[0] - 1, 30, 1); busy_lcd();
  625.                             lcd_set_dot(planex[1], 30, 0);  busy_lcd();
  626.                             if ((planex[1] + 1) != 60) lcd_set_dot(planex[1] + 1, 30, 1); busy_lcd();
  627.                             lcd_set_dot((planex[0] + planex[1]) / 2, 29, 0); busy_lcd();
  628.                             lcd_set_dot((planex[0] + planex[1]) / 2 - 1, 29, 1); busy_lcd();
  629.                             while (P2 != 0x00) {
  630.                                 i = 0;
  631.                                 while (i < 10) {
  632.                                     j = 0;
  633.                                     while (j < 10) {
  634.                                         if (((zidan_x[i]) == boom_x[j]) && (zidan_y[i] - 1 == boom_y[j]) && (zidan_x[i] != 0) && (zidan_y[i] != 0)) {
  635.                                             lcd_set_dot(zidan_x[i], zidan_y[i], 1);
  636.                                             lcd_set_dot(boom_x[j], boom_y[j], 1);
  637.                                             zidan_y[i] = 0;
  638.                                             zidan_x[i] = 0;
  639.                                             boom_x[j] = 0;
  640.                                             boom_y[j] = 0;
  641.                                             wr_i_lcd(0x30);
  642.                                             length++;
  643.                                             lcd_pos(3, 3);
  644.                                             if (length < 10) wr_d_lcd(length + 48);
  645.                                             else {
  646.                                                 wr_d_lcd(length / 10 + 48);
  647.                                                 wr_d_lcd(length % 10 + 48);
  648.                                             }
  649.                                         }
  650.                                         j++;
  651.                                     }
  652.                                     i++;
  653.                                 }
  654.                             }
  655.                             time_1ms(20);
  656.                         }
  657.                     } else if (flag == 4) { // 图片显示中
  658.                         if (px < 2) px++;
  659.                         else if (px == 2) px = 1;
  660.                         while (P2 != 0x00);
  661.                         time_1ms(20);
  662.                     }
  663.                     loud = 1;               
  664.                 } break;
  665.                 case 0x80: { // 确认键
  666.                     loud = 0;
  667.                     if (flag == 0) { // 在菜单中选择游戏
  668.                         if (slect == 0) flag = 1;
  669.                         else if (slect == 1) flag = 2;
  670.                         else if (slect == 2) flag = 3;
  671.                         else if (slect == 3) flag = 4;
  672.                         while (P2 != 0x00);
  673.                         time_1ms(20);
  674.                     } else if (flag == 5) { // 游戏失败后选择继续或返回
  675.                         if (choose == 0) {
  676.                             flag = slect + 1;
  677.                         } else if (choose == 1) flag = 0;
  678.                         choose = 0;
  679.                         while (P2 != 0x00);
  680.                         time_1ms(20);
  681.                     } else if (flag == 3) { // 飞机大战游戏中
  682.                         i = 0;
  683.                         while (zidan_x[i] != 0) i++;
  684.                         zidan_x[i] = planex[0] + 1;
  685.                         zidan_y[i] = 28;
  686.                         while (P2 != 0x00);
  687.                         time_1ms(100);       
  688.                     } else if (flag == 4) { // 图片显示中
  689.                         px = 4;
  690.                         while (P2 != 0x00);
  691.                         time_1ms(100);
  692.                     }
  693.                     loud = 1;       
  694.                 } break;
  695.             }
  696.         }          
  697.     }
  698.     // 检测P0口的输入,判断打地鼠游戏中的鼠标位置
  699.     P0 = 0xf7;
  700.     temp = P0;
  701.     if (temp != 0xf7) {
  702.         time_1ms(20);
  703.         if (temp != 0xf7) {
  704.             switch (temp) {
  705.                 case 0x77: {
  706.                     if (ran1 == 0 && ran2 == 0) dishu = 0;       
  707.                 } break;
  708.                 case 0xb7: {
  709.                     if (ran1 == 0 && ran2 == 1) dishu = 0;       
  710.                 } break;
  711.                 case 0xd7: {
  712.                     if (ran1 == 0 && ran2 == 2) dishu = 0;
  713.                 } break;
  714.                 case 0xe7: {
  715.                     if (ran1 == 0 && ran2 == 3) dishu = 0;       
  716.                 } break;
  717.             }
  718.             time_1ms(20);
  719.         }
  720.     }
  721.     P0 = 0xfb;
  722.     temp = P0;
  723.     if (temp != 0xfb) {
  724.         time_1ms(20);
  725.         if (temp != 0xfb) {
  726.             switch (temp) {
  727.                 case 0x7b: {
  728.                     if (ran1 == 1 && ran2 == 0) dishu = 0;               
  729.                 } break;
  730.                 case 0xbb: {
  731.                     if (ran1 == 1 && ran2 == 1) dishu = 0;       
  732.                 } break;
  733.                 case 0xdb: {
  734.                     if (ran1 == 1 && ran2 == 2) dishu = 0;
  735.                 } break;
  736.                 case 0xeb: {
  737.                     if (ran1 == 1 && ran2 == 3) dishu = 0;       
  738.                 } break;
  739.             }
  740.             time_1ms(20);
  741.         }
  742.     }
  743.     P0 = 0xfd;
  744.     temp = P0;
  745.     if (temp != 0xfd) {
  746.         time_1ms(20);
  747.         if (temp != 0xfd) {
  748.             switch (temp) {
  749.                 case 0x7d: {
  750.                     if (ran1 == 2 && ran2 == 0) dishu = 0;       
  751.                 } break;
  752.                 case 0xbd: {
  753.                     if (ran1 == 2 && ran2 == 1) dishu = 0;                       
  754.                 } break;
  755.                 case 0xdd: {
  756.                     if (ran1 == 2 && ran2 == 2) dishu = 0;
  757.                 } break;
  758.                 case 0xed: {
  759.                     if (ran1 == 2 && ran2 == 3) dishu = 0;               
  760.                 } break;
  761.             }
  762.             time_1ms(20);
  763.         }
  764.     }
  765.     P0 = 0xfe;
  766.     temp = P0;
  767.     if (temp != 0xfe) {
  768.         time_1ms(20);
  769.         if (temp != 0xfe) {
  770.             switch (temp) {
  771.                 case 0x7e: {       
  772.                     if (ran1 == 3 && ran2 == 0) dishu = 0;       
  773.                 } break;
  774.                 case 0xbe: {
  775.                     if (ran1 == 3 && ran2 == 1) dishu = 0;       
  776.                 } break;
  777.                 case 0xde: {
  778.                     if (ran1 == 3 && ran2 == 2) dishu = 0;         
  779.                 } break;
  780.                 case 0xee: {
  781.                     if (ran1 == 3 && ran2 == 3) dishu = 0;       
  782.                 } break;
  783.             }
  784.             time_1ms(20);
  785.         }
  786.     }       
  787. }
复制代码
完备工程源码获取方式:毕设&课设&项目&实训-51单片机自制小霸王游戏机资源-CSDN文库








免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

愛在花開的季節

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表