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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機實習的數碼管俄羅斯方塊游戲的制作

[復制鏈接]
跳轉到指定樓層
樓主
ID:390172 發表于 2018-11-3 21:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. //該游戲采用函數指針制作確保的數據的安全性
  2. #include "sys.h"
  3. #include "key.h"
  4. sbit key0 = P1^0;  //上移按鍵
  5. sbit key1 = P1^1;  //下移按鍵
  6. sbit key2 = P1^2;  //順時針旋轉按鍵
  7. sbit key3 = P1^3;  //逆時針·旋轉按鍵
  8. sbit led1 = P1^4;  //測試的小燈
  9. /*         按鍵檢測函數        */
  10. void KeyScan()
  11. {
  12.   if(key0 == 0)
  13.   {
  14.   Control.delay_ms(5); //消抖延時
  15.   if(key0 == 0)
  16.   {
  17.   switch(num3)
  18.   {
  19.   case 1:break;
  20.   case 2:break;
  21.   case 3:num3 = Control.Find_position(0xbf); break;
  22.   case 4:break;
  23.   case 5:break;
  24.   case 6:num3 = Control.Find_position(0xfe); break;
  25.   case 7:break;
  26.   case 8:break;
  27.   case 9:break;
  28.   case 10:num3 = Control.Find_position(0x9c);break;
  29.   case 12:num3 = Control.Find_position(0xdc);break;
  30.   }
  31.   while(!key0);     //等待按鍵釋放
  32.   }
  33.   }
  34.   /*以上是第一個按鍵按下的函數即是上移的函數*/
  35.   else if(key1 == 0 )
  36.   {
  37.    Control.delay_ms(5); //消抖延時
  38.    if(key1 == 0)
  39.    {
  40.    switch(num3)
  41.    {
  42.     case 0:num3 = Control.Find_position(0xbf);break;
  43. case 1:break;
  44. case 2:break;
  45. case 4:break;
  46. case 5:break;
  47. case 6:num3 = Control.Find_position(0xf7);break;
  48. case 7:break;
  49. case 8:num3 = Control.Find_position(0xa3);break;
  50. case 9:num3 = Control.Find_position(0xe3);break;
  51.    }
  52.    while(!key1);       //等待按鍵釋放
  53.    }
  54.   }
  55.   /*以上是第二個按鍵按下的函數即是下移的函數*/
  56.   else if(key2 == 0)
  57.   {
  58.     Control.delay_ms(5);//消抖延時
  59. if(key2 == 0)
  60. {
  61. switch(num3)
  62. {
  63. case 0: num3=Control.Find_position(0xfd);break;
  64. case 1: num3=Control.Find_position(0xfb);break;
  65. case 2: num3=Control.Find_position(0xf7);break;
  66. case 3: num3=Control.Find_position(0xef);break;
  67. case 4: num3=Control.Find_position(0xdf);break;
  68. case 5: num3=Control.Find_position(0xbf);break;
  69. case 6: num3=Control.Find_position(0xfe);break;
  70. case 7: num3=Control.Find_position(0xcf);break;
  71. case 11:num3=Control.Find_position(0xf9);break;
  72. }
  73. while(!key2);      //等待按鍵釋放
  74. }
  75.   }
  76.   /*以上是第三個按鍵按下的函數即是順時針的函數*/
  77.   else if(key3 == 0 )
  78.   {
  79.     Control.delay_ms(5); //消抖延時
  80. if(key3 == 0 )
  81. {
  82. switch(num3)
  83. {
  84. case 0: num3=Control.Find_position(0xdf);break;
  85. case 5: num3=Control.Find_position(0xef);break;
  86. case 4: num3=Control.Find_position(0xf7);break;
  87. case 3: num3=Control.Find_position(0xfb);break;
  88. case 2: num3=Control.Find_position(0xfd);break;
  89. case 1: num3=Control.Find_position(0xbf);break;
  90. case 6: num3=Control.Find_position(0xfe);break;
  91. case 7: num3=Control.Find_position(0xcf);break;
  92. case 11:num3=Control.Find_position(0xf9);break;
  93. }
  94. while(!key3);   //等待按鍵釋放
  95. }
  96.   }
  97.   /*以上是第四個按鍵按下的函數即是逆時針的函數*/
  98. }

  99. #include "Game.h"
  100. #include "main.h"
  101. #include "sys.h"
  102. Enable flag = False;
  103. uint num0,num1,num2;

  104. void T0_timer() interrupt 1
  105. {
  106.   TH0 =(65536-45872)/256;
  107.   TL0 =(65536-45872)%256;
  108.   num0++;

  109.   if(num0==20)
  110.   {
  111.   num1++;
  112.   num0=0;
  113.   }
  114.   if(num1==10)
  115.   {
  116.    num1=0;
  117.   num2++;
  118.   }
  119.   if(num2==10)
  120.   {
  121.   num2=0;
  122.   }

  123.   Control.Nixie_Display(num1);
  124.   Control.Nixie_Display(num2);
  125.   Control.CS_Enable(True);
  126.   
  127. }
  128. void Sys_init()
  129. {
  130.   
  131.     TMOD = 0X01;
  132. TH0 = (65536-45872)/256;
  133. TL0 = (65536-45872)%256;
  134. EA = 1;
  135. ET0 = 1;
  136. TR0 = 1;
  137. num2=0;
  138.     num0 = 0;
  139. num1 = 0;
  140. }
  141. void Game_Init()
  142. {
  143.     //Sys_init();
  144. Control.Init_LCD();
  145. Control.LCD_PutString(1,1,"俄羅斯方塊");
  146. Control.LCD_PutString(0,2,"當前得分");
  147. Control.LCD_PutString(0,3,"電氣信息工程學院");
  148. Control.LCD_PutString(0,4,"2018年10月31");
  149. while(1)
  150.     {
  151.   //Left_shift();
  152.   
  153. Control.Write_Cmd(0x90+5);
  154. Control.Write_Data('0'+score/10);
  155. Control.Write_Data('0'+score%10);
  156. //Control.Left_shift() ;
  157. Control.Regulation_Game(2);
  158.   
  159.   
  160. //  Disable(0,8);
  161. }

  162. #include "sys.h"
  163. #include "main.h"
  164. #include "game.h"
  165. #include "st7290.h"
  166. #include "key.h"
  167. int score=0;
  168. uint num3=0;
  169. uchar code Nixie[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0x80,0X90,0xff};     //顯示的數
  170. uchar code vide_Game[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0xf9,0x9c,0xdc,0xa3,0xcf,0xe3,0xff};     //方塊

  171. void beep_enabel(Enable enable,uint index)
  172. {
  173.    uint x=0;
  174.    for(;x<index;x++)
  175.    {
  176.    Control.delay_ms(100);
  177.    beep = enable == True? 1 : 0;
  178.    }
  179. }
  180. uint Find_position(char parameter)  //查找位置函數
  181. {
  182.    uint index=0,i;
  183.    uint length = sizeof(vide_Game);
  184.    for(i=0;i<length;i++)
  185.    {
  186.      if(parameter==vide_Game[i])
  187.   {
  188.     index=i;
  189.     break;
  190.   }
  191.    }
  192.      return index;
  193. }

  194. void delay_ms(uint flag)  //延時函數
  195. {
  196.    uint i,j;
  197.    for(i = 0; i < flag; i++)
  198.    for(j = 110; j > 0; j--);
  199. }

  200. void CS_Enable(Enable enable)    //CS使能或失能函數
  201. {
  202.   if(enable == True)
  203.   {
  204.    P2 = 0XFF;
  205.   }
  206.   else
  207.   if(enable == False)
  208.   {
  209.    P2 = 0XDF;
  210.   }
  211. }

  212. void Nixie_Display(uint index)        //數碼管顯示函數
  213. {
  214. char temp,i = 0;
  215. clk = 0;
  216. Control.CS_Enable(False);
  217. temp = Nixie[index];
  218. for(;i<8;i++)
  219. {
  220.   din = temp&0x80;
  221.   clk = 1;
  222.   clk = 1;
  223.   clk = 0;
  224.   clk = 0;
  225.   temp <<=1;
  226. }
  227. }

  228. void Game_Display(uint index)        //游戲產生的種子
  229. {
  230. char temp,i = 0;
  231. clk = 0;
  232. Control.CS_Enable(False);
  233. temp = vide_Game[index];
  234. for(;i<8;i++)
  235. {
  236.   din = temp&0x80;
  237.   clk = 1;
  238.   clk = 1;
  239.   clk = 0;
  240.   clk = 0;
  241.   temp <<=1;
  242. }
  243. }
  244. void Result_Display(char index)        //用來顯示最后的記分的
  245. {
  246. char temp,i = 0;
  247. clk = 0;
  248. Control.CS_Enable(False);
  249. temp = index;
  250. for(;i<8;i++)
  251. {
  252.   din = temp&0x80;
  253.   clk = 1;
  254.   clk = 1;
  255.   clk = 0;
  256.   clk = 0;
  257.   temp <<=1;
  258. }
  259. }

  260. void Disable(uchar index1,uchar index2 )   //這個函數是用來設置數碼管哪幾個不亮的
  261. {
  262.    for(;index1 < index2;index1++)
  263.    {
  264.        Nixie_Display(10);
  265.    }
  266. }

  267. void Regulation_Game(uint index)      //這個函數是用來執行游戲的規則的
  268. {
  269.   int i;
  270.   static uint seed=1,value=sizeof(vide_Game)-1 ,bug=5;
  271.   static char temp=0xff;
  272.   srand(seed);
  273.    num3=1+rand()%bug;       //隨機種子
  274.   for(i=7;i>=0;i--)
  275.   {
  276.   Control.KeyScan();
  277.      Game_Display(num3);        //這個是移動的數
  278.   Disable(0,i);
  279.   Control.Result_Display(temp);      //這個是用來顯示在第一位數碼管上的值
  280.   CS_Enable(True);
  281.   delay_ms(1000);
  282.   CS_Enable(False);
  283.   delay_ms(1000);
  284.   Disable(0,8);
  285.   seed++;            //更新隨機種子
  286.   }
  287.   /****************************以下為該游戲的協議****************************************/
  288.   temp = temp&vide_Game[num3];  value=num3;     //進行與操作顯示最后一位數
  289.   if(temp==Nixie[8]) { score++; temp=0xff; Control.beep_enabel(True,3); Control.beep_enabel(False,1);}  //出結果后進行消去數碼管上的數
  290.   if(bug==12) { bug=5; }       //限制隨機種子的范圍
  291.   else{ bug++; }
  292.   
  293. }
  294. void Left_shift()      //這個是左移函數
  295. {
  296.   int i;
  297.   for(i = 7;i >= 0;i--)
  298.   {
  299.    Control.Nixie_Display(i);
  300.    Control.Disable(0,i);
  301.    Control.CS_Enable(True);
  302.    Control.delay_ms(1000);
  303.    Control.CS_Enable(False);
  304.    Control.delay_ms(1000);
  305.    Control.Disable(0,8);
  306.   }
  307. }
  308. void Right_shift()                  //這個是又移函數
  309. {
  310.   int i;
  311.   for(i=0;i<8;i++)
  312.   {
  313.   Control.Nixie_Display(i);
  314.   Control.CS_Enable(True);
  315.   Control.delay_ms(1000);
  316.   Control.CS_Enable(False);
  317.   Control.delay_ms(1000);
  318.   }
  319. }


  320. CONTROL Control=
  321. {
  322. CS_Enable,
  323. Game_Init,
  324. delay_ms,
  325. Disable,
  326. Regulation_Game,
  327. Nixie_Display,
  328.     Left_shift,
  329. Right_shift,
  330. Init_LCD,
  331. LCD_PutString,
  332. Write_Data,
  333. Write_Cmd,
  334. Game_Display,
  335. KeyScan,
  336. Find_position,
  337. Result_Display,
  338. beep_enabel,
  339. };

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

使用道具 舉報

沙發
ID:1 發表于 2018-11-4 00:35 | 只看該作者
補全頭文件 原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

板凳
ID:418731 發表于 2018-11-4 20:20 | 只看該作者
這是什么板子的??戰艦v3還是阿波羅?可以直接燒進去嗎?
回復

使用道具 舉報

地板
ID:390172 發表于 2018-11-4 21:54 | 只看該作者
王孫浩 發表于 2018-11-4 20:20
這是什么板子的??戰艦v3還是阿波羅?可以直接燒進去嗎?

51單片機
回復

使用道具 舉報

5#
ID:390172 發表于 2018-11-4 21:55 | 只看該作者
王孫浩 發表于 2018-11-4 20:20
這是什么板子的??戰艦v3還是阿波羅?可以直接燒進去嗎?

這個是自己用于單片機實習寫的程序
回復

使用道具 舉報

6#
ID:390172 發表于 2018-11-4 22:02 | 只看該作者
admin 發表于 2018-11-4 00:35
補全頭文件 原理圖或者詳細說明一下電路連接即可獲得100+黑幣

這個板子是51單片機的板子,在資料的sys.h文件中,#include "reg52.h"
回復

使用道具 舉報

7#
ID:390172 發表于 2018-11-4 22:03 | 只看該作者
王孫浩 發表于 2018-11-4 20:20
這是什么板子的??戰艦v3還是阿波羅?可以直接燒進去嗎?

游戲是用數碼管寫的
回復

使用道具 舉報

8#
ID:504322 發表于 2020-5-24 19:37 | 只看該作者
寫得太好了,感謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色91在线 | 国产精品日本一区二区在线播放 | 成人网av | 毛片免费看 | 亚洲精品一区二区二区 | 男女网站免费观看 | 国产一在线观看 | 在线免费av电影 | 国产香蕉视频在线播放 | 激情黄色在线观看 | 亚洲欧美在线视频 | 国产一区二区在线91 | 国产电影一区二区在线观看 | 欧美激情久久久 | 青青99| 在线观看av中文字幕 | 黄色毛片一级 | 国产一级视频在线 | 亚洲一区二区三区免费在线 | 亚洲乱码一区二区三区在线观看 | 亚洲精品久久久久久首妖 | 自拍 亚洲 欧美 老师 丝袜 | 天天看夜夜 | 亚洲一区二区在线播放 | 国产欧美一区二区三区久久人妖 | 超碰97在线免费 | 久久精品免费一区二区 | 亚洲一区二区三区在线视频 | 日本黄色短片 | 国产精品99久久久久久大便 | 国产精品久久久久久久久久尿 | 精品久久久久久一区二区 | 伊人激情综合网 | 免费一区二区三区 | 天堂在线中文字幕 | 亚洲毛片在线 | 国产一级一级 | 日韩国产一区 | 精品一区国产 | www.国产一区| 久久综合九色综合欧美狠狠 |