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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于89S52單片機與12864液晶的俄羅斯方塊游戲

[復制鏈接]
跳轉到指定樓層
樓主
ID:111336 發表于 2016-3-29 19:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #ifndef _MAIN_H

  2. #define _MAIN_H

  3. #include <reg52.h>

  4. #define LcdDataPort P2   //數據端口

  5. #ifndef UCHAR_DEF

  6. #define UCHAR_DEF

  7. typedef unsigned char uchar;

  8. #endif

  9. sbit Reset = P3^0;   //復位

  10. sbit RS = P3^1;    //指令數據選擇

  11. sbit E = P3^2;    //指令數據控制

  12. sbit CS1 = P3^4;   //左屏幕選擇,低電平有效

  13. sbit CS2 = P3^5;   //右屏幕選擇

  14. sbit RW = P3^3;    //讀寫控制

  15. sbit busy = P2^7;   //忙標志

  16. void SetOnOff(uchar onoff);  //開關顯示

  17. void SelectScreen(uchar screen);//選擇屏幕

  18. void ClearScreen(uchar screen); //清屏

  19. void Show1616(uchar lin,uchar colum,uchar *address);//顯示一個漢字

  20. void CheckState();   //判斷狀態

  21. void LcdDelay(unsigned int time); //延時

  22. void WriteData(uchar dat); //寫數據

  23. void SendCommand(uchar command); //寫指令

  24. void SetLine(uchar line);  //置行地址

  25. void SetColum(uchar colum);//置列地址

  26. void SetStartLine(uchar startline);//置顯示起始行

  27. void InitLcd();    //初始化

  28. void ResetLcd();   //復位

  29. #endif

  30. /*********************************************************************/

  31. /***********************************lcd.c****************************************/

  32. void CheckState()

  33. {

  34. E = 1;

  35. RS = 0;

  36. RW = 1;

  37. LcdDataPort = 0xff;

  38. while(!busy);

  39. }

  40. void LcdDelay(unsigned int time)

  41. {

  42. while(time --);

  43. }

  44. void WriteData(uchar dat)

  45. {

  46. CheckState();

  47. E = 1;

  48. RS = 1;

  49. RW = 0;

  50. LcdDataPort = dat;

  51. E = 0;

  52. }

  53. void SendCommand(uchar command)

  54. {

  55. CheckState();

  56. E = 1;

  57. RW = 0;

  58. RS = 0;

  59. LcdDataPort = command;

  60. E = 0;

  61. }

  62. void SelectScreen(uchar screen) //0-全屏,1-左屏,2-右屏

  63. {

  64. switch(screen)

  65. {

  66.   case 0 :

  67.    CS1 = 0;

  68.    LcdDelay(2);

  69.    CS2 = 1;

  70.    LcdDelay(2);

  71.    break;

  72.   case 1 :

  73.    CS1 = 1;

  74.    LcdDelay(2);

  75.    CS2 = 0;

  76.    LcdDelay(2);

  77.    break;

  78.   case 2 :

  79.    CS1 = 0;

  80.    LcdDelay(2);

  81.    CS2 = 0;

  82.    LcdDelay(2);

  83.    break;

  84. }

  85. }

  86. void ClearScreen(uchar screen)  // screen 0-全屏,1-左屏,2-右屏

  87. {

  88. uchar i,j;

  89. SelectScreen(screen);

  90. for(i = 0;i < 8;i ++)

  91. {

  92.   SetLine(i);

  93.   SetColum(0);

  94.   for(j = 0;j < 64; j ++)

  95.    WriteData(0);

  96. }

  97. }

  98. void SetLine(uchar line)  //line -> 0 : 7

  99. {

  100. line = line & 0x07;

  101. line = line | 0xb8;   //1011 1xxx

  102. SendCommand(line);

  103. }

  104. void SetColum(uchar colum) //colum -> 0 :63

  105. {

  106. colum = colum & 0x3f;

  107. colum = colum | 0x40;  //01xx xxxx

  108. SendCommand(colum);

  109. }

  110. void SetStartLine(uchar startline) //startline -> 0 : 63

  111. {

  112. startline = startline & 0x3f;

  113. startline = startline | 0xc0; //11xxxxxx

  114. SendCommand(startline);

  115. }

  116. void SetOnOff(uchar onoff) //1-開顯示 0-關

  117. {

  118. if(onoff == 1)

  119.   SendCommand(0x3f);   //0011 111x

  120. else

  121.   SendCommand(0x3e);

  122. }

  123. void ResetLcd()

  124. {

  125. Reset = 0;

  126. LcdDelay(2);

  127. Reset = 1;

  128. LcdDelay(2);

  129. RS0 = 0;

  130. LcdDelay(2);

  131. RS1 = 0;

  132. LcdDelay(2);

  133. SetOnOff(1);

  134. }

  135. void InitLcd()

  136. {

  137. ResetLcd();

  138. SetOnOff(0);

  139. ClearScreen(2);

  140. SetLine(0);

  141. SetColum(0);

  142. SetStartLine(0);

  143. SetOnOff(1);

  144. }

  145. void Show1616(uchar lin,uchar colum,uchar *address)

  146. {

  147. uchar i;

  148. SetLine(lin);

  149. SetColum(colum);

  150. for(i = 0;i < 16;i ++)

  151.   WriteData(*(address ++));

  152. SetLine(lin + 1);

  153. SetColum(colum);

  154. for(i = 0;i < 16;i ++)

  155.   WriteData(*(address ++));

  156. }

  157. /*******************************************************************************/

  158. /********************************main.c***********************************************/

  159. #include <reg52.h>

  160. const uchar code HZ_tab[] = {44

  161. };

  162. void main()

  163. {

  164. uchar i,line,colum ;

  165. uchar *address ;

  166. InitLcd();

  167. while(1)

  168. {

  169.   colum = 16;

  170.   line = 1;

  171.   address = HZ_tab;

  172.   SetOnOff(0);                //關顯示

  173.   for(i = 1;i < 7;i ++)

  174.   {

  175.    if(i < 4)

  176.     SelectScreen(0);

  177.    else

  178.     SelectScreen(1);

  179.    Show1616(line,colum ,address);  

  180.    colum += 16;

  181.    if(colum >63)

  182.     colum = 0;

  183.    address += 32;       //向DDRAM中寫入數據

  184.   }

  185.   line = 5;

  186.   colum = 0;

  187.   for(i = 0;i <8; i ++)

  188.   {

  189.    if(i < 4)

  190.     SelectScreen(0);

  191.    else

  192.     SelectScreen(1);

  193.    Show1616(line,colum ,address);

  194.    colum += 16;

  195.    if(colum >63)

  196.     colum = 0;

  197.    address += 32;

  198.   }

  199.   SelectScreen(2);

  200.   SetOnOff(1);    // 開顯示

  201.   for(i = 0;i < 50;i ++)  //延時

  202.    LcdDelay(30000);

  203. }

  204. }







  205. /************說明******************************

  206. 此程序包含一個俄羅斯方塊.c 文件和一個12864.h 文件

  207. ********************俄羅斯方塊.c文件**************************/

  208. #include "reg51.h"

  209. #include "12864.h"

  210. #define uchar unsigned char

  211. #define uint unsigned int

  212. static unsigned long Seed = 1;

  213. #define A 48271L

  214. #define M 2147483647L

  215. #define Q (M / A)

  216. #define R (M % A)

  217. sbit K1=P3^4;

  218. sbit K2=P3^5;

  219. sbit K3=P3^6;

  220. sbit K4=P3^7;

  221. unsigned int idata num[19+2]={

  222. 0xfff,//第1行,最下面

  223. 0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,

  224. 0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,//第2行到第20行共19行

  225. 0xfff//第21行,最上面

  226. };//定義共21行,其中num[0]為下墻壁行,num[20]為上墻壁行,每行12格,最左一格為左墻壁列,最右一格為右墻壁列

  227. unsigned char code Block[28][2]={

  228. /*

  229. *   口     口口口   口口

  230. *   口     口         口      口

  231. *   口口              口  口口口      

  232. */

  233. {0x88,0xc0},{0xe8,0x00},{0x62,0x20},{0x02,0xe0},

  234. /*

  235. *   口        口口 口口口

  236. *   口 口     口       口

  237. * 口口 口口口 口   

  238. */

  239. {0x22,0x60},{0x08,0xe0},{0xc8,0x80},{0xe2,0x00},  

  240. /*

  241. *   口

  242. *   口口         口口

  243. *     口       口口

  244. */

  245. {0x8c,0x40},{0x6c,0x00},{0x8c,0x40},{0x6c,0x00},

  246. /*

  247. *   口        口口

  248. * 口口          口口

  249. * 口

  250. */

  251. {0x4c,0x80},{0xc6,0x00},{0x4c,0x80},{0xc6,0x00},  

  252. /*

  253. *          口                口

  254. *   口     口口   口口口   口口

  255. * 口口口   口       口       口

  256. */

  257. {0x04,0xe0},{0x8c,0x80},{0xe4,0x00},{0x26,0x20},

  258. /*口

  259. * 口

  260. * 口       口口口口

  261. * 口

  262. */

  263. {0x44,0x44},{0x0f,0x00},{0x44,0x44},{0x0f,0x00},  

  264. /*

  265. * 口口

  266. * 口口

  267. */  

  268. {0x06,0x60},{0x06,0x60},{0x06,0x60},{0x06,0x60}

  269. };

  270. #define PASSSCORE 20

  271. struct Jimu

  272. {

  273. unsigned int dat;

  274. char x;

  275. unsigned char y;

  276. unsigned char type;

  277. unsigned char change;

  278. }Sign[3];//積木結構體

  279. unsigned char SysFlag=0;

  280. #define NEWSIGNFLAG 0

  281. #define DEADFLAG 1

  282. #define PAUSEFLAG 2

  283. unsigned char Score=0;

  284. unsigned char Level=1;

  285. unsigned char DelayCnt=5;

  286. /*********************************************************/

  287. #define N 25

  288. /************************************

  289. 偽隨機數發生器

  290. *************************************/

  291. double Random(void)

  292. {

  293. long TmpSeed;

  294. TmpSeed=A*(Seed%Q)-R*(Seed/Q);

  295. if(TmpSeed>=0)

  296. Seed=TmpSeed;

  297. else

  298. Seed=TmpSeed+M;

  299. return (double)Seed/M;

  300. }

  301. /**************************************

  302. 為偽隨機數發生器播種

  303. ***************************************/

  304. void InitRandom(unsigned long InitVal)

  305. {

  306. Seed=InitVal;

  307. }

  308. //延時子程序

  309. void Delay(unsigned int t)

  310. {  

  311. unsigned int i,j;

  312. for(i=0;i<t;i++)

  313. for(j=0;j<10;j++);   

  314. }

  315. /*********************************

  316. 初始化MPU

  317. **********************************/

  318. void InitCpu(void)

  319. {

  320. TMOD=0x0;

  321. TH0=0;

  322. TL0=0;

  323. TR0=1;

  324. ET0=1;

  325. EX1=1;

  326. EA=1;

  327.     TCON|=0x04;

  328. }

  329. /****************************

  330. welcome  游戲選擇界面

  331. /**********************/

  332. void welcome()

  333. {

  334. Lcd_WriteStr(0,0,"歡迎來玩");

  335. Lcd_WriteStr(0,1,"俄羅斯方塊");

  336. Lcd_WriteStr(0,2,"設置按K1");

  337. Lcd_WriteStr(0,2,"開玩按K2");

  338. }

  339. /*************俄羅斯方塊部分

  340. /******************************

  341. 畫墻壁,初始化界面

  342. *******************************/

  343. void DrawBoard(void)

  344. {

  345. unsigned char n;

  346. for(n=0;n<12;n++) ////畫上下兩邊的墻壁

  347. {

  348. Lcd_Rectangle(3*n,0,3*n+2,2,1);////在最上面一行畫個2*2的方塊

  349. Lcd_Rectangle(3*n,60,3*n+2,62,1);////在最下面一行畫個2*2的方塊

  350. }

  351. for(n=0;n<20;n++) ////畫左右兩邊的墻壁

  352. {

  353. Lcd_Rectangle(0,3*n,2,3*n+2,1); ////在左面畫2*2的方塊

  354. Lcd_Rectangle(33,3*n,35,3*n+2,1);////在右面畫2*2的方塊

  355. }

  356. Lcd_WriteStr(4,0,"經典游戲");

  357. Lcd_WriteStr(3,2,"Score:");

  358. Lcd_WriteStr(3,3,"Level:");

  359. }

  360. /***********************************

  361. 游戲結束處理

  362. ************************************/

  363. void GameOver(void)

  364. {

  365. if((SysFlag&(1<<DEADFLAG))!=0)

  366. Lcd_WriteStr(3,1,"You Fail");////SysFlag=2

  367. else

  368. Lcd_WriteStr(3,1,"You Pass");////SysFlag=1或=0

  369. }

  370. unsigned int code MaskTab[16]={

  371. 0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,

  372. 0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000

  373. };

  374. /**********************************

  375. 根據積木圖標左下坐標X,Y來畫出積木圖標

  376. ***********************************/

  377. void DrawSign(struct Jimu Temp,unsigned char DrawMode)

  378. {

  379. unsigned char m,n;

  380. for(m=0;m<4;m++)

  381. for(n=0;n<4;n++)

  382. {

  383. if((Temp.dat&MaskTab[4*m+n])!=0)

  384. Lcd_Rectangle(Temp.x+n*3,Temp.y-2-3*m,Temp.x+n*3+2,Temp.y-3*m,DrawMode);

  385. }

  386. }

  387. /********************************

  388. 將積木圖標值融入num數據中

  389. 也即把積木圖標固定,無法再下降

  390. *********************************/

  391. void FixSign(void)

  392. {

  393. unsigned char m,n;

  394. for(m=0;m<4;m++)//行循環

  395. for(n=0;n<4;n++)//列循環

  396. {

  397. if((Sign[0].dat&MaskTab[4*m+n])!=0)

  398. {

  399. num[20-(Sign[0].y-2)/3+m]|=MaskTab[11-Sign[0].x/3-n];

  400. }

  401. }

  402. }

  403. /********************************

  404. 判斷積木圖標中方塊是否與障礙方塊重合

  405. *********************************/

  406. unsigned char CheckIf(void)

  407. {

  408. unsigned char m,n;

  409. for(m=0;m<4;m++)//行循環

  410. for(n=0;n<4;n++)//列循環

  411. {

  412. if((Sign[1].dat&MaskTab[4*m+n])!=0)

  413. {

  414. if((num[20-(Sign[1].y-2)/3+m]&MaskTab[11-Sign[1].x/3-n])!=0)

  415. return 0;

  416. }

  417. }

  418. return 1;

  419. }

  420. /********************************

  421. 判斷積木圖標是否可以繼續下降一格

  422. ********************************/

  423. unsigned char CheckIfDown(void)

  424. {

  425. Sign[1]=Sign[0];//

  426. Sign[1].y+=3;//假設下降一格

  427. return CheckIf();

  428. }

  429. /********************************

  430. 判斷積木圖標是否可以向左移動

  431. *********************************/

  432. unsigned char CheckIfLeft(void)

  433. {

  434. Sign[1]=Sign[0];

  435. Sign[1].x-=3;

  436. return CheckIf();

  437. }

  438. /********************************

  439. 判斷積木圖標是否可以向右移動

  440. *********************************/

  441. unsigned char CheckIfRight(void)

  442. {

  443. Sign[1]=Sign[0];

  444. Sign[1].x+=3;

  445. return CheckIf();

  446. }

  447. /********************************

  448. 判斷是否可以旋轉

  449. *********************************/

  450. unsigned char CheckIfRoll(void)

  451. {

  452. unsigned char i;

  453. unsigned int Temp;

  454. Sign[1]=Sign[0];

  455. if(++Sign[1].change>3)

  456. Sign[1].change=0;

  457.    i=Sign[1].type*4+Sign[1].change;

  458. Temp=(unsigned int)Block[i][0]<<8;

  459. Temp=Temp|Block[i][1];

  460. Sign[1].dat=Temp;

  461. return CheckIf();

  462. }

  463. /********************************

  464. 尋找滿格的行并做消除處理

  465. 最多尋找4個滿行并做消除

  466. *********************************/

  467. void DelFull(void)

  468. {

  469. unsigned char m,n;

  470. unsigned char Temp;

  471. unsigned char Flag=0;

  472. Temp=(Sign[0].y-2)/3;

  473. if(Temp>=20)//防止越過了下邊界

  474. Temp=1;

  475. else

  476. Temp=20-Temp;

  477. ////Temp為積木的最下邊界,即最下一行

  478. for(n=Temp+3;n>=Temp;n--)//積木圖標的最頂行開始尋找滿行比較有利于運算

  479. {

  480. if(num[n]==0xfff)

  481. {

  482. Flag=1;

  483. for(m=n+1;m<=19;m++)

  484. {

  485. num[m-1]=num[m];

  486. }

  487. num[m]=0x801;

  488. Score++;//每找到一個滿行,則分數加1

  489. }

  490. }

  491. if(Flag)//為加速而設置并判斷的標志,有已固定的積木有滿格消行變化則重畫積木界面

  492. {

  493. /*行*/for(m=Temp;m<=19;m++)//為加速,不必要重第一行重畫起,只需要從積木圖標最下行開始往上的重畫

  494. /*列*/for(n=1;n<=10;n++)

  495. {

  496. if((num[m]&MaskTab[n])==0)

  497. {

  498. if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)!=0)

  499. //為加速而做的讀象素操作

  500. ////如果該像素為1,即為黑點

  501. {

  502. Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,0);

  503. }////將給像素設置為0,即為空白

  504. }

  505.   else

  506. {

  507. if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)==0)//為加速而做的讀象素操作

  508. {  ////如果該像素為0

  509. Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,1);

  510. }  ////將給像素設置為1

  511. }

  512. }

  513. }

  514. }

  515. /*******************************

  516. 隨機產生一個積木圖標放到預產生區域并顯示出來

  517. ********************************/

  518. void CreatSign(void)

  519. {

  520. unsigned char n;

  521. unsigned int Temp;

  522. DrawSign(Sign[2],0);//先清除

  523. n=Random()*28;

  524. Temp=(unsigned int)Block[n][0]<<8;  ////產生積木圖形的高八位

  525. Temp=Temp|Block[n][1];  ////產生積木圖形的第八位

  526. Sign[2].dat=Temp;

  527. Sign[2].x=45;

  528. Sign[2].y=4*3+2;

  529. Sign[2].type=n/4;////什么意思

  530. Sign[2].change=n%4;

  531. DrawSign(Sign[2],1);//后畫出

  532. }

  533. void PrintScore(void)

  534. {

  535. unsigned char Str[3];

  536. Str[0]=(Score/10)|0x30;

  537. Str[1]=(Score%10)|0x30;

  538. Str[2]=0;

  539. Lcd_WriteStr(6,2,Str);

  540. }

  541. void PrintLevel(void)

  542. {

  543. unsigned char Str[3];

  544. Str[0]=(Level/10)|0x30;

  545. Str[1]=(Level%10)|0x30;

  546. Str[2]=0;

  547. Lcd_WriteStr(6,3,Str);

  548. }

  549. /********************************

  550. 游戲的具體過程,也是俄羅斯方塊算法的關鍵部分

  551. *********************************/

  552. void GamePlay(void)

  553. {

  554. unsigned char m,n;

  555. unsigned int Temp;

  556. SysFlag|=1<<NEWSIGNFLAG;//剛開始初始化為需要產生新的積木圖標  ////SysFlag=1

  557. InitRandom(TL0);  ////用以產生隨即數

  558. Lcd_WriteStr(3,1,"Playing");

  559. PrintScore();

  560. PrintLevel();

  561. CreatSign();////先清空積木顯示區域,在隨即產生一個類型的積木

  562. while(1)

  563. {

  564. if((SysFlag&(1<<NEWSIGNFLAG))==1)//判是否需要產生新的積木圖標

  565. {////SysFlag=1時產生新積木

  566. SysFlag&=~(1<<NEWSIGNFLAG);   ////SysFlag=0

  567. Sign[0]=Sign[2];

  568. CreatSign();

  569. Sign[0].x=12;

  570. Sign[0].y=14;

  571. for(m=0;m<4;m++)//行循環

  572. {

  573. for(n=0;n<4;n++)//列循環

  574. {

  575. if((Sign[0].dat&MaskTab[15-m*4-n])==0) ////從最高位開始倒序測試

  576. break;////測試Sign[0].dat的每一位,如果為該位為1,則繼續測試下一位

  577. ////若為0,則直接測試下半字節  

  578. }

  579. if(n==4)  ////如果在半個字節里面每一位數據都是1,則將縱坐標-3,即向上移動一個小方格

  580. Sign[0].y-=3;

  581. }//將積木圖標出現置頂

  582. for(m=0;m<4;m++)//行循環

  583. for(n=0;n<4;n++)//列循環

  584. {

  585. if((Sign[0].dat&MaskTab[4*m+n])!=0)////從最低位開始順序測試

  586. {

  587. if((num[20-(Sign[0].y-2)/3+m]&MaskTab[11-Sign[0].x/3-n])!=0)

  588. ////2為上墻壁,(Sign[0].y-2)/3為積木的總高度

  589. ////num[20-(Sign[0].y-2)/3+m] 從下往上變化

  590. ////MaskTab[11-Sign[0].x/3-n]為從4*4積木的最右邊往積木的最左邊變化

  591. SysFlag|=1<<DEADFLAG; ////SysFlag=2;

  592. }

  593. }

  594. if((SysFlag&(1<<DEADFLAG))!=0)

  595. break;//如果產生新的積木圖標中的方塊與已固定好的方塊重合,則死亡。游戲結束

  596. DrawSign(Sign[0],1);

  597. }

  598. if((CheckIfLeft())&&(K3==0)) //左

  599. {

  600. DrawSign(Sign[0],0);

  601. Sign[0].x-=3;

  602. DrawSign(Sign[0],1);

  603. }  

  604. if((CheckIfRight())&&(K4==0))  //右

  605. {

  606. DrawSign(Sign[0],0);

  607. Sign[0].x+=3;

  608. DrawSign(Sign[0],1);

  609. }

  610. if((CheckIfDown())&&(K2==0))//下

  611. {

  612. DrawSign(Sign[0],0);

  613. Sign[0].y+=3;

  614. DrawSign(Sign[0],1);

  615. }

  616. if((CheckIfRoll())&&(K1==0)) //翻轉

  617. {

  618. DrawSign(Sign[0],0);

  619. if(++Sign[0].change>3)

  620. Sign[0].change=0;

  621.   m=Sign[0].type*4+Sign[0].change;

  622. ////將Block數組中的元素分為7類,type為該類型;該類型分為4種,change為種類

  623. ////所以,change加1之后就表示翻轉之后的積木形態

  624. Temp=(unsigned int)Block[m][0]<<8;

  625. Temp=Temp|Block[m][1]; ////讀取翻轉之后積木形態的dat數據

  626. Sign[0].dat=Temp;   ////賦dat值給積木結構體的dat

  627. DrawSign(Sign[0],1);  ////畫出翻轉后的積木

  628. }

  629. ////2

  630. if((SysFlag&(1<<PAUSEFLAG))!=0)

  631. continue;

  632. Delay(500);

  633. if(++DelayCnt>=2*(11-Level))

  634. {

  635. DelayCnt=0;

  636. if(CheckIfDown())//判斷是否能繼續下降一格

  637. {

  638. DrawSign(Sign[0],0);

  639. Sign[0].y+=3;

  640. DrawSign(Sign[0],1);

  641. }

  642. else

  643. {

  644. FixSign();  ////將積木移入num數組中

  645. DelFull(); ////消行處理

  646. PrintScore();

  647. if(Score>=PASSSCORE)

  648. {

  649. SysFlag&=~(1<<DEADFLAG); ////SysFlag=1或=0

  650. break;//跳出玩游戲過程

  651. }

  652. SysFlag|=1<<NEWSIGNFLAG;//新的積木圖標產生標志置1

  653. }

  654. }

  655. }

  656. }

  657. void Main()

  658. {  

  659. InitCpu();//初始化CPU

  660. Lcd_Reset(); //初始化LCD屏

  661. Lcd_Clear(0);//清屏  

  662. Lcd_Reset(); //初始化LCD屏

  663. Lcd_Clear(0);//清屏

  664. DrawBoard();//畫界面

  665. GamePlay();//玩游戲

  666. GameOver();//游戲結束

  667. Lcd_Reset(); //初始化LCD屏

  668. Lcd_Clear(0);//清屏

  669. }
復制代碼


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 女同久久另类99精品国产 | 蜜桃视频在线观看免费视频网站www | 超碰97人人人人人蜜桃 | xxxxx黄色片| 正在播放国产精品 | 久久88 | 成年人在线视频 | 日本五月婷婷 | 欧美成年人网站 | 国产精品欧美一区二区三区不卡 | 天天操天天插天天干 | 日韩在线小视频 | 久久久久精 | 日韩精品一区二区三区在线观看 | 91天堂 | 亚洲精品久久久一区二区三区 | 精精国产xxxx视频在线野外 | 在线黄 | 日韩黄色av | 在线亚洲精品 | 欧美性tv| 国产欧美日韩视频 | 久久久免费毛片 | 欧美亚洲高清 | 国产精品99免费视频 | 欧美在线亚洲 | 国产日韩欧美 | 免费h在线 | 国产在线a视频 | 日韩一区二区免费视频 | 免费久久久 | 日韩精品在线观看视频 | 国产精品乱码一区二三区小蝌蚪 | 欧美中文字幕一区 | 一区二区三区四区毛片 | 日本精品裸体写真集在线观看 | 日本三级网| 亚洲网在线| 欧美一区二区三区在线观看 | 亚洲精品久久久久中文字幕欢迎你 | 国产目拍亚洲精品99久久精品 |