久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8335|回復: 5
打印 上一主題 下一主題
收起左側

單片機俄羅斯方塊四合一游戲源代碼(貪吃蛇、經典賽車游戲、射擊障礙物)

  [復制鏈接]
跳轉到指定樓層
樓主
俄羅斯方塊四合一游戲

電路原理圖如下:


單片機源程序如下:
  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 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:412600 發表于 2018-10-20 09:40 | 只看該作者
nice  很給力啊
回復

使用道具 舉報

板凳
ID:452901 發表于 2018-12-23 21:12 | 只看該作者
贊!感謝分享
回復

使用道具 舉報

地板
ID:401491 發表于 2019-1-12 17:42 | 只看該作者
感謝分享!
回復

使用道具 舉報

5#
ID:654884 發表于 2019-12-3 10:53 來自手機 | 只看該作者
您好,我想問一下,您這個s6是什么封裝鴨。。。為什么我的電源2腳沒線路啊。。。。
回復

使用道具 舉報

6#
ID:697466 發表于 2020-3-2 22:42 | 只看該作者
為什么我的電源2腳沒線路啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜日韩精品 | 偷牌自拍| 草久在线视频 | 精品乱人伦一区二区三区 | 欧美日韩精品中文字幕 | 午夜电影福利 | 欧美性大战久久久久久久蜜臀 | 国产精品揄拍一区二区 | 欧美99| 日韩一区二区av | 国产精品成人久久久久 | 色婷婷影院 | 久久精品国产精品青草 | 中文字幕在线观看av | 天堂久 | 激情五月综合 | 草草网| 精品国产乱码久久久久久中文 | 欧美日韩在线国产 | www.久| 99影视| 亚洲小视频在线播放 | 超碰91在线 | 美女国内精品自产拍在线播放 | 精品美女在线观看 | 国产h在线 | 久草资源在线视频 | 91九色婷婷| 国产亚洲精品成人av久久ww | 99亚洲国产精品 | 成人动漫一区二区 | 色片在线观看 | 国产成人一区二区三区久久久 | 成人综合一区 | 亚洲高清在线观看 | 伊人网站| 国产在线一区二区 | 亚洲精品在线视频 | 日韩精品一区二区三区在线播放 | hitomi一区二区三区精品 | 91网站在线观看视频 |