亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4932|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)俄羅斯方塊源碼 通過(guò)LCD12864實(shí)現(xiàn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
俄羅斯方塊通過(guò)LCD12864實(shí)現(xiàn),全部源碼,超清晰注釋.


單片機(jī)源程序如下:
  1. /*******************************************************
  2. * 文件名稱(chēng):Tetris.c
  3. * 單 片 機(jī):STC89C52RC
  4. * 簡(jiǎn)    述:使用LCD12864顯示的俄羅斯方塊程序
  5. * 功    能:計(jì)分,下一個(gè)方塊預(yù)覽,歡迎結(jié)束界面,長(zhǎng)按連續(xù)左右移,暫停(按鍵Left+Turn)
  6. * 作    者:劉琦
  7. * 完成日期:2015年4月21日
  8. * IO口設(shè)定:按鍵
  9.                         sbit key_sr_left=P3^7;
  10.                         sbit key_sr_turn=P3^6;
  11.                         sbit key_sr_right=P3^5;
  12.                         sbit key_sr_down=P3^4;
  13.                         LCD12864
  14.                         sbit RS_Port=P1^0;
  15.                         sbit RW_Port=P1^1;
  16.                         sbit E_Port=P2^5;
  17.                         sbit PSB_Port=P1^2;
  18.                         sbit RST_Port=P1^4;
  19.                         數(shù)碼管鎖存器
  20.                         sbit dula=P2^6;
  21.                         sbit wela=P2^7;

  22. *******************************************************/

  23. /*****************************頭文件區(qū)*****************************************************/
  24. #include<reg52.h>
  25. //#include"STC15F2K60S2.h"
  26. #include"task_key.h"
  27. #include"task_activation.h"
  28. #include"12864b.h"
  29. #include"TaskBlock.h"
  30. #include"Block.h"
  31. /*****************************宏定義區(qū)*****************************************************/

  32. //需要判斷是否刷新的任務(wù)總數(shù)
  33. //1KeyLeft,2KeyTurn,3KeyRight,4KeyDown,5TaskGoingDown,6KeyPause
  34. #define NUM_TASK_FLAG 7
  35. //需要定時(shí)刷新的任務(wù)總數(shù)
  36. //1TaskGoingDown,2KeyService
  37. #define NUM_TASK_REFRESH 3
  38. //刷新頻率
  39. #define TIME_PER_SEC 200                                                        //每次進(jìn)入中斷的頻率,200Hz
  40. #define TIME_CLOCK 11059200                                                        //晶振頻率
  41. #define TIME_KEY_SERVICE_50HZ  TIME_PER_SEC/50          //按鍵服務(wù)頻率,0.02s
  42. #define TIME_TASKGOINGDOWN_2HZ  TIME_PER_SEC/2          //下落頻率,0.5s

  43. /******************************子函數(shù)聲明區(qū)***********************************************/

  44. void initial_myself(void);   
  45. void initial_peripheral(void);
  46. void delay100ms(void);       

  47. /******************************全局變量定義區(qū)***********************************************/
  48. unsigned char uc_state=1;//狀態(tài)標(biāo)示:1歡迎界面,2等待開(kāi)始界面,3下落界面,4死亡界面,5暫停界面
  49. enum Block{S1,S2,Z1,Z2,L1,L2,L3,L4,J1,J2,J3,J4,I1,I2,O1,T_1,T_2,T_3,T_4}enumBlock;//方塊編號(hào)
  50. unsigned char ucBlockNow=0;//當(dāng)前方塊
  51. unsigned char ucBlockNext=0;//下一個(gè)方塊

  52. unsigned char ucFlagScreenChange=1;//界面變更標(biāo)志,界面更改時(shí)置1,激活task_activation

  53. unsigned char ucCoordinate[2];//方塊的旋轉(zhuǎn)點(diǎn)坐標(biāo),橫H,豎S
  54. unsigned char xdata ucxMap[10][20];//整張屏幕的標(biāo)記地圖,用來(lái)記錄未消除方塊位置,有方塊則為1
  55. unsigned char ucxBlockPosition[4][2];//方塊的4個(gè)小方塊坐標(biāo),[0][0],[0][1]為旋轉(zhuǎn)點(diǎn)坐標(biāo)H,S

  56. unsigned int uc_delay_task_cnt[NUM_TASK_REFRESH];//任務(wù)刷新延遲
  57. unsigned char uc_flag_taskrefresh[NUM_TASK_FLAG];//任務(wù)刷新標(biāo)志

  58. unsigned long int ucScore=0;//得分

  59. /******************************主函數(shù)開(kāi)始***********************************************/
  60. void main(void)
  61. {
  62.         unsigned char i=0;
  63.         initial_myself();
  64.         delay100ms();   
  65.     initial_peripheral();


  66.         while(1)
  67.         {
  68.                 if(ucFlagScreenChange==1)//界面變更標(biāo)志為1時(shí),進(jìn)行任務(wù)激活,防止一直刷新界面
  69.                 {
  70.                         task_activation(uc_state);
  71.                         ucFlagScreenChange=0;
  72.                 }
  73.                 if(uc_delay_task_cnt[2]==0)//20HZ頻率刷新key_service
  74.                 {
  75.                         task_key_service();
  76.                         ET0=0;//在中斷中也有可能變化的變量在更改前時(shí)先關(guān)閉中斷
  77.                         uc_delay_task_cnt[2]=TIME_KEY_SERVICE_50HZ;//延遲重置
  78.                         ET0=1;
  79.                 }
  80.                 if(uc_flag_taskrefresh[5]&&uc_delay_task_cnt[1]==0)//需要時(shí),2HZ頻率刷新TaskGoingDown
  81.                 {
  82.                         if(!TaskGoingDown())//下落失敗
  83.                         {
  84.                                 //將當(dāng)前方塊位置寫(xiě)入Map
  85.                                 for(i=0;i<4;i++)
  86.                                 {
  87.                                         ucxMap[ ucxBlockPosition[i][0] ][ ucxBlockPosition[i][1] ]=1;
  88.                                 }
  89.                                 //調(diào)用消除方塊函數(shù)
  90.                                 TaskClear();
  91.                         }
  92.                         ET0=0;//在中斷中也有可能變化的變量在更改前時(shí)先關(guān)閉中斷
  93.                         uc_delay_task_cnt[1]=TIME_TASKGOINGDOWN_2HZ;//延遲重置
  94.                         ET0=1;
  95.                 }

  96.         }
  97. }

  98. //中斷函數(shù)
  99. void timer0(void) interrupt 1
  100. {
  101.         unsigned char i;
  102.         TR0=0;
  103.         TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
  104.         TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
  105.         //task_delay[]減到0時(shí),相應(yīng)的函數(shù)準(zhǔn)備就緒
  106.         for(i=0;i<NUM_TASK_REFRESH;i++)
  107.         {
  108.                 if(uc_delay_task_cnt[i]!=0)//延遲不為0時(shí)才減
  109.                         {uc_delay_task_cnt[i]--;};
  110.         }
  111.         task_key_scan();//按鍵掃描函數(shù),放在中斷中,保證準(zhǔn)時(shí)掃描
  112.         TR0=1;
  113. }

  114. //初始化區(qū)
  115. void initial_myself(void)//第一區(qū) 初始化單片機(jī)
  116. {
  117.         unsigned char i;
  118.         for(i=0;i<NUM_TASK_REFRESH;i++)uc_delay_task_cnt[i]=0;//初始化讓所有任務(wù)就緒
  119.         TMOD=0X21; //定時(shí)器0為16位不自動(dòng)重裝,用來(lái)定時(shí);定時(shí)器1為8位自動(dòng)重裝,用來(lái)產(chǎn)生隨機(jī)數(shù)
  120.         TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
  121.         TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
  122.         TH1=0;
  123.         TL1=0;
  124. }

  125. void initial_peripheral(void) //第二區(qū) 初始化外圍
  126. {
  127.         Lcd_Init();//初始化12864
  128.         EA=1;     //開(kāi)總中斷
  129.         ET0=1;    //允許定時(shí)器0中斷,定時(shí)器1無(wú)需開(kāi)啟中斷
  130.     TR0=1;    //啟動(dòng)定時(shí)器0
  131.     TR1=1;         //啟動(dòng)定時(shí)器1
  132. }

  133. void delay100ms(void)                //@11.0592MHz
  134. {
  135.         unsigned char i, j, k;

  136.         ;
  137.         ;
  138.         i = 5;
  139.         j = 52;
  140.         k = 195;
  141.         do
  142.         {
  143.                 do
  144.                 {
  145.                         while (--k);
  146.                 } while (--j);
  147.         } while (--i);
  148. }
復(fù)制代碼
  1. /*******************************************************
  2. * 文件名稱(chēng):TaskBlock.c
  3. * 單 片 機(jī):STC89C52RC
  4. * 簡(jiǎn)    述:方塊子程序,包含,下落,出新,消除,檢測(cè)
  5. * 作    者:劉琦
  6. * 完成日期:2015年4月21日
  7. *******************************************************/
  8. #include<reg52.h>
  9. #include"Tetris.h"
  10. #include"Block.h"
  11. #include"tetris.h"
  12. #include"Score.h"
  13. /*******************************************************
  14. * 函 數(shù) 名:TaskCheck(void)
  15. * 功能描述:檢測(cè)
  16. * 函數(shù)說(shuō)明:檢測(cè)左右移,下落,出新,旋轉(zhuǎn)
  17. * 輸入?yún)?shù):無(wú)
  18. * 返 回 值:成功失敗標(biāo)示,ucReturn
  19. *******************************************************/
  20. unsigned char TaskCheck(void)
  21. {
  22.         unsigned char ucReturn=0;
  23.         unsigned char i=0;
  24.         //加入檢測(cè)部分,包括邊界檢測(cè),碰撞檢測(cè)
  25.         //邊界檢測(cè)
  26.         for(i=0;i<4;i++)
  27.         {
  28.                 if(ucxBlockPosition[i][0]>=0&&ucxBlockPosition[i][0]<=9                        //檢測(cè)左右
  29.                    &&ucxBlockPosition[i][1]>=0&&ucxBlockPosition[i][1]<=19)                //檢測(cè)上下
  30.                 {
  31.                         ucReturn=1;
  32.                 }
  33.                 else
  34.                 {
  35.                         ucReturn=0;
  36.                         return ucReturn;//如果邊界檢測(cè)失敗,就不進(jìn)行下面檢測(cè),直接返回失敗
  37.                 }
  38.         }
  39.         //碰撞檢測(cè)
  40.         for(i=0;i<4;i++)
  41.         {
  42.                 if(ucxMap[ ucxBlockPosition[i][0] ][ ucxBlockPosition[i][1] ]!=0)//與地圖標(biāo)記位置進(jìn)行比較
  43.                 {
  44.                         ucReturn=0;
  45.                         return ucReturn;
  46.                 }
  47.         }
  48.         return ucReturn;
  49. }
  50. /*******************************************************
  51. * 函 數(shù) 名:unsigned char TaskGoingDown(void)
  52. * 功能描述:方塊下落
  53. * 函數(shù)說(shuō)明:
  54. * 輸入?yún)?shù):無(wú)
  55. * 返 回 值:ucResult,1無(wú)碰撞,0碰撞
  56. *******************************************************/
  57. unsigned char TaskGoingDown(void)
  58. {
  59.         unsigned char ucCheck=0;
  60.         unsigned char ucResult=0;
  61.         ucCoordinate[1]++;                                //旋轉(zhuǎn)點(diǎn)坐標(biāo),豎S+1
  62.         WriteBlockCoordinate();                        //將其他三個(gè)小方塊坐標(biāo)寫(xiě)入數(shù)組
  63.         ucCheck=TaskCheck();                        //檢測(cè)碰撞
  64.         if(ucCheck)                                                //無(wú)碰撞
  65.         {
  66.                 ucCoordinate[1]--;                        //坐標(biāo)復(fù)位
  67.                 ChangeBlock(0);                                //在老位置消除方塊,只刷新有改變的位置,加快顯示速度
  68.                 ucCoordinate[1]++;                        //坐標(biāo)+1
  69.                 ChangeBlock(1);                                //在新位置畫(huà)方塊
  70.                 ucResult=1;
  71.         }
  72.         else                                                        //有碰撞,則不變
  73.         {
  74.                 ucCoordinate[1]--;                       
  75.                 WriteBlockCoordinate();
  76.                 ucResult=0;
  77.         }
  78.         return ucResult;
  79. }
  80. /*******************************************************
  81. * 函 數(shù) 名:unsigned char TaskComingNew(void)
  82. * 功能描述:方塊出新
  83. * 函數(shù)說(shuō)明:
  84. * 輸入?yún)?shù):無(wú)
  85. * 返 回 值:ucResult,1成功,0失敗
  86. *******************************************************/
  87. unsigned char TaskComingNew(void)
  88. {
  89.         unsigned char ucCheck=0;
  90.         unsigned char ucResult=0;
  91.         //寫(xiě)入當(dāng)前方塊的相關(guān)信息
  92.         switch(ucBlockNow)                                         
  93.         {
  94.                 case 0:
  95.                                 enumBlock=S1;
  96.                                 ucCoordinate[0]=4;
  97.                                 ucCoordinate[1]=0;
  98.                 break;
  99.                 case 1:
  100.                                 enumBlock=Z1;
  101.                                 ucCoordinate[0]=4;
  102.                                 ucCoordinate[1]=0;
  103.                 break;
  104.                 case 2:
  105.                                 enumBlock=L1;
  106.                                 ucCoordinate[0]=4;
  107.                                 ucCoordinate[1]=1;
  108.                 break;
  109.                 case 3:
  110.                                 enumBlock=J1;
  111.                                 ucCoordinate[0]=4;
  112.                                 ucCoordinate[1]=1;
  113.                 break;
  114.                 case 4:
  115.                                 enumBlock=I1;
  116.                                 ucCoordinate[0]=5;
  117.                                 ucCoordinate[1]=0;
  118.                 break;
  119.                 case 5:
  120.                                 enumBlock=O1;
  121.                                 ucCoordinate[0]=5;
  122.                                 ucCoordinate[1]=0;
  123.                 break;
  124.                 case 6:
  125.                                 enumBlock=T_1;
  126.                                 ucCoordinate[0]=4;
  127.                                 ucCoordinate[1]=0;
  128.                 break;
  129.                 default:
  130.                 break;
  131.         }
  132.         //檢測(cè)碰撞
  133.         WriteBlockCoordinate();       
  134.         ucCheck=TaskCheck();
  135.         if(ucCheck)                                                //成功
  136.         {
  137.                 ChangeSmallBlock(0);                //將預(yù)覽的方塊清除
  138.                 ucBlockNext=TL1%7;                        //產(chǎn)生隨機(jī)數(shù),作為預(yù)覽方塊
  139.                 ChangeBlock(1);                         //畫(huà)新的方塊
  140.                 ChangeSmallBlock(1);                //畫(huà)新的預(yù)覽方塊
  141.                 ucBlockNow=ucBlockNext;
  142.                 ucResult=1;
  143.         }
  144.         else
  145.         {
  146.                 ucResult=0;
  147.         }

  148.         return ucResult;
  149. }
  150. /*******************************************************
  151. * 函 數(shù) 名:void TaskClear(void)
  152. * 功能描述:消除滿行
  153. * 函數(shù)說(shuō)明:消除滿行,并出新
  154. * 輸入?yún)?shù):無(wú)
  155. * 返 回 值:無(wú)
  156. *******************************************************/
  157. void TaskClear(void)
  158. {
  159.         char i=0,j=0,n=0;
  160.         unsigned char m=0;
  161.         unsigned char k=0;
  162.         unsigned char flag_man=1,flag_kong=1,flag_clear=0;//滿行、空行、待清除標(biāo)志
  163.         unsigned char man[4],count=0;                                          //滿行位置數(shù)組,滿行數(shù)量
  164.         unsigned char kong=20;                                                          //空行位置
  165.         unsigned char oldkong=20;                                                  //用來(lái)儲(chǔ)存舊的空行位置

  166.         unsigned char ucResult=0;

  167.         //標(biāo)記出來(lái)滿行及第一個(gè)空行
  168.         for(i=19;i>=0;i--)
  169.         {
  170.                 for(j=9;j>=0;j--)
  171.                 {
  172.                         if(ucxMap[j][i]==0)
  173.                         {
  174.                                 flag_man=0;
  175.                         }
  176.                         else
  177.                         {
  178.                                 flag_kong=0;
  179.                         }
  180.                 }
  181.                 if(flag_man==1)
  182.                 {
  183.                         flag_clear=1;//激活消除標(biāo)記
  184.                         man[k]=i;//標(biāo)記滿行
  185.                         count++;
  186.                         k++;
  187.                 }
  188.                 else if(flag_kong==1)
  189.                 {
  190.                          kong=i;
  191.                         break;//檢測(cè)到第一個(gè)空行,就退出循環(huán)
  192.                 }
  193.                 flag_man=1;//將滿行標(biāo)志復(fù)位
  194.                 flag_kong=1;
  195.         }

  196.         //計(jì)分
  197.         switch(count)
  198.         {
  199.                 case 0:
  200.                                 ucScore=ucScore+100;
  201.                                 break;
  202.                 case 1:
  203.                                 ucScore=ucScore+200;
  204.                                 break;
  205.                 case 2:
  206.                                 ucScore=ucScore+400;
  207.                                 break;
  208.                 case 3:
  209.                                 ucScore=ucScore+700;
  210.                                 break;
  211.                 case 4:
  212.                                 ucScore=ucScore+1100;
  213.                                 break;
  214.                 default:
  215.                                 break;
  216.         }

  217.         oldkong=kong;
  218.         //消除滿行
  219.         if(flag_clear==1)
  220.         {
  221.                 while(count!=0)//至少有一個(gè)滿行,才進(jìn)行消除
  222.                 {
  223.                         //逐行下移
  224.                         for(m=0;m<man[count-1]-kong-1;m++)
  225.                         {
  226.                                 for(n=9;n>=0;n--)
  227. ……………………

  228. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
俄羅斯方塊全部源碼.zip (147.88 KB, 下載次數(shù): 73)


評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
深藍(lán)遠(yuǎn)景 + 10 很給力!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩1
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:362455 發(fā)表于 2018-7-2 16:17 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:362455 發(fā)表于 2018-7-2 16:17 | 只看該作者
可以移植到iap15上嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:522661 發(fā)表于 2019-5-27 21:27 | 只看該作者
謝謝樓主的分享
回復(fù)

使用道具 舉報(bào)

5#
ID:573484 發(fā)表于 2019-6-27 15:40 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表