- //該游戲采用函數(shù)指針制作確保的數(shù)據(jù)的安全性
- #include "sys.h"
- #include "key.h"
- sbit key0 = P1^0; //上移按鍵
- sbit key1 = P1^1; //下移按鍵
- sbit key2 = P1^2; //順時(shí)針旋轉(zhuǎn)按鍵
- sbit key3 = P1^3; //逆時(shí)針·旋轉(zhuǎn)按鍵
- sbit led1 = P1^4; //測試的小燈
- /* 按鍵檢測函數(shù) */
- void KeyScan()
- {
- if(key0 == 0)
- {
- Control.delay_ms(5); //消抖延時(shí)
- if(key0 == 0)
- {
- switch(num3)
- {
- case 1:break;
- case 2:break;
- case 3:num3 = Control.Find_position(0xbf); break;
- case 4:break;
- case 5:break;
- case 6:num3 = Control.Find_position(0xfe); break;
- case 7:break;
- case 8:break;
- case 9:break;
- case 10:num3 = Control.Find_position(0x9c);break;
- case 12:num3 = Control.Find_position(0xdc);break;
- }
- while(!key0); //等待按鍵釋放
- }
- }
- /*以上是第一個(gè)按鍵按下的函數(shù)即是上移的函數(shù)*/
- else if(key1 == 0 )
- {
- Control.delay_ms(5); //消抖延時(shí)
- if(key1 == 0)
- {
- switch(num3)
- {
- case 0:num3 = Control.Find_position(0xbf);break;
- case 1:break;
- case 2:break;
- case 4:break;
- case 5:break;
- case 6:num3 = Control.Find_position(0xf7);break;
- case 7:break;
- case 8:num3 = Control.Find_position(0xa3);break;
- case 9:num3 = Control.Find_position(0xe3);break;
- }
- while(!key1); //等待按鍵釋放
- }
- }
- /*以上是第二個(gè)按鍵按下的函數(shù)即是下移的函數(shù)*/
- else if(key2 == 0)
- {
- Control.delay_ms(5);//消抖延時(shí)
- if(key2 == 0)
- {
- switch(num3)
- {
- case 0: num3=Control.Find_position(0xfd);break;
- case 1: num3=Control.Find_position(0xfb);break;
- case 2: num3=Control.Find_position(0xf7);break;
- case 3: num3=Control.Find_position(0xef);break;
- case 4: num3=Control.Find_position(0xdf);break;
- case 5: num3=Control.Find_position(0xbf);break;
- case 6: num3=Control.Find_position(0xfe);break;
- case 7: num3=Control.Find_position(0xcf);break;
- case 11:num3=Control.Find_position(0xf9);break;
- }
- while(!key2); //等待按鍵釋放
- }
- }
- /*以上是第三個(gè)按鍵按下的函數(shù)即是順時(shí)針的函數(shù)*/
- else if(key3 == 0 )
- {
- Control.delay_ms(5); //消抖延時(shí)
- if(key3 == 0 )
- {
- switch(num3)
- {
- case 0: num3=Control.Find_position(0xdf);break;
- case 5: num3=Control.Find_position(0xef);break;
- case 4: num3=Control.Find_position(0xf7);break;
- case 3: num3=Control.Find_position(0xfb);break;
- case 2: num3=Control.Find_position(0xfd);break;
- case 1: num3=Control.Find_position(0xbf);break;
- case 6: num3=Control.Find_position(0xfe);break;
- case 7: num3=Control.Find_position(0xcf);break;
- case 11:num3=Control.Find_position(0xf9);break;
- }
- while(!key3); //等待按鍵釋放
- }
- }
- /*以上是第四個(gè)按鍵按下的函數(shù)即是逆時(shí)針的函數(shù)*/
- }
- #include "Game.h"
- #include "main.h"
- #include "sys.h"
- Enable flag = False;
- uint num0,num1,num2;
- void T0_timer() interrupt 1
- {
- TH0 =(65536-45872)/256;
- TL0 =(65536-45872)%256;
- num0++;
-
- if(num0==20)
- {
- num1++;
- num0=0;
- }
- if(num1==10)
- {
- num1=0;
- num2++;
- }
- if(num2==10)
- {
- num2=0;
- }
-
- Control.Nixie_Display(num1);
- Control.Nixie_Display(num2);
- Control.CS_Enable(True);
-
- }
- void Sys_init()
- {
-
- TMOD = 0X01;
- TH0 = (65536-45872)/256;
- TL0 = (65536-45872)%256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- num2=0;
- num0 = 0;
- num1 = 0;
- }
- void Game_Init()
- {
- //Sys_init();
- Control.Init_LCD();
- Control.LCD_PutString(1,1,"俄羅斯方塊");
- Control.LCD_PutString(0,2,"當(dāng)前得分");
- Control.LCD_PutString(0,3,"電氣信息工程學(xué)院");
- Control.LCD_PutString(0,4,"2018年10月31");
- while(1)
- {
- //Left_shift();
-
- Control.Write_Cmd(0x90+5);
- Control.Write_Data('0'+score/10);
- Control.Write_Data('0'+score%10);
- //Control.Left_shift() ;
- Control.Regulation_Game(2);
-
-
- // Disable(0,8);
- }
- #include "sys.h"
- #include "main.h"
- #include "game.h"
- #include "st7290.h"
- #include "key.h"
- int score=0;
- uint num3=0;
- uchar code Nixie[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0x80,0X90,0xff}; //顯示的數(shù)
- uchar code vide_Game[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0xf9,0x9c,0xdc,0xa3,0xcf,0xe3,0xff}; //方塊
- void beep_enabel(Enable enable,uint index)
- {
- uint x=0;
- for(;x<index;x++)
- {
- Control.delay_ms(100);
- beep = enable == True? 1 : 0;
- }
- }
- uint Find_position(char parameter) //查找位置函數(shù)
- {
- uint index=0,i;
- uint length = sizeof(vide_Game);
- for(i=0;i<length;i++)
- {
- if(parameter==vide_Game[i])
- {
- index=i;
- break;
- }
- }
- return index;
- }
- void delay_ms(uint flag) //延時(shí)函數(shù)
- {
- uint i,j;
- for(i = 0; i < flag; i++)
- for(j = 110; j > 0; j--);
- }
- void CS_Enable(Enable enable) //CS使能或失能函數(shù)
- {
- if(enable == True)
- {
- P2 = 0XFF;
- }
- else
- if(enable == False)
- {
- P2 = 0XDF;
- }
- }
- void Nixie_Display(uint index) //數(shù)碼管顯示函數(shù)
- {
- char temp,i = 0;
- clk = 0;
- Control.CS_Enable(False);
- temp = Nixie[index];
- for(;i<8;i++)
- {
- din = temp&0x80;
- clk = 1;
- clk = 1;
- clk = 0;
- clk = 0;
- temp <<=1;
- }
- }
- void Game_Display(uint index) //游戲產(chǎn)生的種子
- {
- char temp,i = 0;
- clk = 0;
- Control.CS_Enable(False);
- temp = vide_Game[index];
- for(;i<8;i++)
- {
- din = temp&0x80;
- clk = 1;
- clk = 1;
- clk = 0;
- clk = 0;
- temp <<=1;
- }
- }
- void Result_Display(char index) //用來顯示最后的記分的
- {
- char temp,i = 0;
- clk = 0;
- Control.CS_Enable(False);
- temp = index;
- for(;i<8;i++)
- {
- din = temp&0x80;
- clk = 1;
- clk = 1;
- clk = 0;
- clk = 0;
- temp <<=1;
- }
- }
- void Disable(uchar index1,uchar index2 ) //這個(gè)函數(shù)是用來設(shè)置數(shù)碼管哪幾個(gè)不亮的
- {
- for(;index1 < index2;index1++)
- {
- Nixie_Display(10);
- }
- }
- void Regulation_Game(uint index) //這個(gè)函數(shù)是用來執(zhí)行游戲的規(guī)則的
- {
- int i;
- static uint seed=1,value=sizeof(vide_Game)-1 ,bug=5;
- static char temp=0xff;
- srand(seed);
- num3=1+rand()%bug; //隨機(jī)種子
- for(i=7;i>=0;i--)
- {
- Control.KeyScan();
- Game_Display(num3); //這個(gè)是移動的數(shù)
- Disable(0,i);
- Control.Result_Display(temp); //這個(gè)是用來顯示在第一位數(shù)碼管上的值
- CS_Enable(True);
- delay_ms(1000);
- CS_Enable(False);
- delay_ms(1000);
- Disable(0,8);
- seed++; //更新隨機(jī)種子
- }
- /****************************以下為該游戲的協(xié)議****************************************/
- temp = temp&vide_Game[num3]; value=num3; //進(jìn)行與操作顯示最后一位數(shù)
- if(temp==Nixie[8]) { score++; temp=0xff; Control.beep_enabel(True,3); Control.beep_enabel(False,1);} //出結(jié)果后進(jìn)行消去數(shù)碼管上的數(shù)
- if(bug==12) { bug=5; } //限制隨機(jī)種子的范圍
- else{ bug++; }
-
- }
- void Left_shift() //這個(gè)是左移函數(shù)
- {
- int i;
- for(i = 7;i >= 0;i--)
- {
- Control.Nixie_Display(i);
- Control.Disable(0,i);
- Control.CS_Enable(True);
- Control.delay_ms(1000);
- Control.CS_Enable(False);
- Control.delay_ms(1000);
- Control.Disable(0,8);
- }
- }
- void Right_shift() //這個(gè)是又移函數(shù)
- {
- int i;
- for(i=0;i<8;i++)
- {
- Control.Nixie_Display(i);
- Control.CS_Enable(True);
- Control.delay_ms(1000);
- Control.CS_Enable(False);
- Control.delay_ms(1000);
- }
- }
- CONTROL Control=
- {
- CS_Enable,
- Game_Init,
- delay_ms,
- Disable,
- Regulation_Game,
- Nixie_Display,
- Left_shift,
- Right_shift,
- Init_LCD,
- LCD_PutString,
- Write_Data,
- Write_Cmd,
- Game_Display,
- KeyScan,
- Find_position,
- Result_Display,
- beep_enabel,
- };
復(fù)制代碼 |