找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7695|回复: 5
收起左侧

单片机俄罗斯方块四合一游戏源代码(贪吃蛇、经典赛车游戏、射击障碍物)

  [复制链接]
ID:400807 发表于 2018-10-19 21:43 | 显示全部楼层 |阅读模式
俄罗斯方块四合一游戏

电路原理图如下:

俄罗斯方块布线截图

俄罗斯方块布线截图

PCB版本电路图

PCB版本电路图
3位0.56寸数码管引脚图.jpg 1588点阵引脚图1.jpg 1588点阵引脚图2.jpg

单片机源程序如下:
  1. /*
  2. //功能:复古掌上俄罗斯方块游戏机源代码,包括游戏GUI,俄罗斯方块、贪吃蛇、经典赛车游戏、射击障碍物游戏
  3. v1.0:
  4.         2014-7-26 00:00:00        :完成有俄罗斯方块游戏基本模型;
  5.         2014-7-28 02:12:03        :将原先临时使用的延时键盘扫描改为外部中断状态位检测键;
  6.         2014-7-28 20:40:37        :完成俄罗斯方块分数计数及分数显示功能;
  7.         2014-8-1 01:01:54        :将较早之前完成贪吃蛇游戏代码合并植入;
  8.         2014-8-2 17:04:25        :整理之前的临时源码,使工程文件规范化;
  9.         2014-8-3 23:50:49        :构建游戏选择画面基本模型,完成画面平移效果;
  10.         2014-8-5 00:50:04        :改进LED点阵底层驱动,用软件PWM调节画面亮度;
  11.         2014-8-7 00:53:35        :完成赛车游戏,用PWM分层扫描画面,形成游戏画面对比度;
  12.         2014-8-8 02:16:44        :完成赛车游戏选择预览画面,并将三个游戏合并在一起;
  13.         2014-8-12 01:47:07        :将逐行扫描改为逐点扫描,使显示亮度均匀;增加亮度调节功能;
  14.         2014-9-9 00:32:40        :修改及优化若干细节;
  15. v1.1:
  16.         2014-9-18 0:57:23        :重新布局电路,修改原先不合理的地方,为制作PCB板作准备;
  17.         2014-9-19 22:02:36        :加入游戏音效,并且可以通过软件方式开关声音;
  18.         2014-9-21 14:59:39        :增加三位mini数码管,实时显示游戏分数,数码管共用点阵并行数据口;
  19.         ~~~~~~~~~~~忘记备注
  20.         2014-10-20 21:30:15        :加入射击游戏,将GUI模块化,简化流程
  21. */

  22. #include "config.h"
  23. volatile uint8 data keypad = K_NULL;        //键盘状态
  24. volatile uint8 data keycont = 0;                //键盘检测消抖定时器
  25. volatile uint16 data tms = 0;                        //1ms T0定时器
  26. bit key_state = 0;                                                //按键状态

  27. uint16 data speeds = 0;                //游戏速度
  28. uint16 data scores = 0;                //游戏计分
  29. bit Glife = 1;                                //游戏生命
  30. bit sound_ON = 1;                        //音效开关
  31. uint8 data duty = 80;                //PWM,默认亮度
  32. uint8 data DispRAM[16]={0};
  33. uint8 code bitman[8]={1,2,4,8,16,32,64,128};//用于数字序号定位0~7bit位

  34. uint8 code num[10][5]=                //阳码
  35. {
  36.         {0x7,0x5,0x5,0x5,0x7},
  37.         {0x2,0x6,0x2,0x2,0x7},
  38.         {0x7,0x1,0x7,0x4,0x7},
  39.         {0x7,0x1,0x7,0x1,0x7},
  40.         {0x5,0x5,0x7,0x1,0x1},
  41.         {0x7,0x4,0x7,0x1,0x7},
  42.         {0x7,0x4,0x7,0x5,0x7},
  43.         {0x7,0x1,0x1,0x1,0x1},
  44.         {0x7,0x5,0x7,0x5,0x7},
  45.         {0x7,0x5,0x7,0x1,0x7}
  46. };

  47. /*********************PORT_INIT********************/
  48. void Port_Init()
  49. {
  50.         P0M0 = 0Xff;
  51.         P0M1 = 0X00;
  52.         P1M0 = 0Xff;
  53.         P1M1 = 0X00;
  54.         P2M0 = 0Xff;
  55.         P2M1 = 0X00;
  56.         P3M0 = 0X00;
  57.         P3M1 = 0X00;
  58.         P4M0 = 0Xff;
  59.         P4M1 = 0X00;
  60.         P5M0 = 0Xff;
  61.         P5M1 = 0X00;
  62. }

  63. void Init_Timer()
  64. {
  65. /******************定时器0中断设置**********************/
  66.         AUXR |= 0x80;                   //定时器0为1T模式
  67.     TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
  68.     TL0 = T1MS;                     //初始化计时值
  69.     TH0 = T1MS >> 8;
  70.     TR0 = 1;                        //定时器0开始计时
  71.     ET0 = 1;                        //使能定时器0中断
  72.        
  73. /*****************外部中断设置*************************/       
  74.         IT0 = 1;                    //设置INT0下降沿触发
  75.     EX0 = 1;                    //使能外部中断INT0
  76.         IT1 = 1;                    //设置INT1下降沿触发
  77.     EX1 = 1;                    //使能外部中断INT1
  78.         INT_CLKO |= 0x70;           //使能INT2,INT3,INT4(EX4 = 1,EX3 = 1,EX2 = 1
  79.        
  80.         EA = 1;       
  81. }

  82. void Array_CLR(uint8 *p)
  83. {
  84.         uint8 i=0;
  85.         while(i!=16)
  86.         {
  87.                 p[i] = 0x00;
  88.                 i++;
  89.         }
  90. }

  91. void ShowScore(uint score)
  92. {
  93.         uint8 i;
  94.         uint8 qx,bx,sx,gx;
  95.         qx = score /1000;
  96.         bx = score %1000 /100;
  97.         sx = score %100/10;
  98.         gx = score %10;

  99.         Array_CLR(DispRAM);

  100.         for(i=0;i<5;i++)
  101.                 DispRAM[8-i] = (num[sx][i]<<4) | (num[gx][i]);
  102.        
  103.         for(i=0;i<5;i++)
  104.                 DispRAM[14-i] = (num[qx][i]<<5) | (num[bx][i]<<1);
  105.                                
  106. //        MatxDisp(DispRAM,duty);
  107. }

  108. void main()
  109. {
  110.         Port_Init();
  111.         Sound_Init();
  112.         Init_Timer();
  113.         Sound_Tone(1,14,5);//滴
  114.        
  115.         srand(TL0);               
  116.         delayms(100);
  117.         Play_Music(sound_game_start);
  118.         Flash_Screen_Clear();
  119.         while(1)
  120.         {
  121.                 tms = 0;
  122.                 keypad = K_NULL;//清除按键状态
  123.                 switch (GUI_Main())        //进入用户游戏选择界面,返回选择的游戏
  124.                 {
  125.                         case 1:        Tetris_Game();        break;
  126.                         case 2:        Snake_Game();        break;
  127.                         case 3:        RAC_Game();                break;
  128.                         case 4:        Shot_Game();        break;
  129.                 }
  130.                 Play_Music(sound_game_over);
  131.                 Flash_Screen_Clear();
  132.                 ShowScore(scores);        //将分数载入显存
  133.                 delayms(300);
  134.                
  135.                 keypad = K_NULL;
  136.                 while(keypad != K_UP)        //在没按下OK键时保持分数显示
  137.                 {
  138.                         MatxDisp(DispRAM,duty);
  139.                         SMG_Display(scores,duty);
  140.                 }
  141.         }       
  142. }

  143. /* Timer0 interrupt routine */
  144. void T0_Timer_1ms_int() interrupt 1 using 1
  145. {
  146.         if(tms<0xfffe)        tms++;        //防止溢出
  147.         if(key_state){ if(!--keycont) key_state=0;}

  148.         if(PIN_TR2)//TR2如果打开,则开始播放音效
  149.         {
  150.                 if(!sound_cnt_time--)
  151.                 {
  152.                         TR2_OFF;
  153.                         beep = 1;
  154.                         if(music_p[s_p][1])
  155.                         {
  156.                                 Sound_Tone(sound_ON,music_p[s_p][0],music_p[s_p][1]);
  157.                                 s_p++; //自动装载下一个音符,实现音效与游戏“同时”运行
  158.                         }
  159.                 }
  160.         }
  161.         if(KEY_DOWN==0 & KEY_UP==0)        IAP_CONTR=0x60;//软件复位下载程序
  162. }

  163. void T2_Timer_Sound_freq() interrupt 12           //中断入口
  164. {
  165.      beep = ~beep; //蜂鸣器频率震动
  166. }

  167. uint8 Get_Kvuale(uint8 key_delay)//键值消抖处理,参数为灵敏度调节
  168. {
  169.         uint8 kvuale = K_NULL;        //返回的初始值为空值
  170.         if(keypad != K_NULL)        //当键值不为NULL时,说明有按键按下
  171.         {       
  172.                 if(!key_state)                //当按键状态位state为0时说明是第一次触发有效,为1时为重复触发
  173.                 {
  174.                         key_state=1;        //置1,防止重复触发
  175.                         kvuale = keypad;//获得读取键值
  176.                         keycont = key_delay;//载入消抖时间
  177.                 }
  178.                 keypad = K_NULL;        //清楚键值
  179.         }
  180.         return kvuale;
  181. }
  182. /*********外部中断按键区**********/
  183. void exint0() interrupt 0       //INT0
  184. {
  185.         keypad = 0;
  186. }
  187. void exint1() interrupt 2       //INT1
  188. {
  189.         keypad = 1;       
  190. }
  191. void exint2() interrupt 10      //INT2
  192. {
  193.         keypad = 2;
  194. }
  195. void exint3() interrupt 11      //INT3
  196. {
  197.         keypad = 3;
  198. }
  199. void exint4() interrupt 16      //INT4
  200. {       
  201.         keypad = 4;
  202. }
复制代码

所有资料51hei提供下载:
程序.rar (194.41 KB, 下载次数: 107)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:412600 发表于 2018-10-20 09:40 | 显示全部楼层
nice  很给力啊
回复

使用道具 举报

ID:452901 发表于 2018-12-23 21:12 | 显示全部楼层
赞!感谢分享
回复

使用道具 举报

ID:401491 发表于 2019-1-12 17:42 | 显示全部楼层
感谢分享!
回复

使用道具 举报

ID:654884 发表于 2019-12-3 10:53 来自手机 | 显示全部楼层
您好,我想问一下,您这个s6是什么封装鸭。。。为什么我的电源2脚没线路啊。。。。
回复

使用道具 举报

ID:697466 发表于 2020-3-2 22:42 | 显示全部楼层
为什么我的电源2脚没线路啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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