|
|
俄羅斯方塊通過(guò)LCD12864實(shí)現(xiàn),全部源碼,超清晰注釋.
0.jpg (40.86 KB, 下載次數(shù): 25)
下載附件
2018-4-26 18:32 上傳
單片機(jī)源程序如下:
- /*******************************************************
- * 文件名稱(chēng):Tetris.c
- * 單 片 機(jī):STC89C52RC
- * 簡(jiǎn) 述:使用LCD12864顯示的俄羅斯方塊程序
- * 功 能:計(jì)分,下一個(gè)方塊預(yù)覽,歡迎結(jié)束界面,長(zhǎng)按連續(xù)左右移,暫停(按鍵Left+Turn)
- * 作 者:劉琦
- * 完成日期:2015年4月21日
- * IO口設(shè)定:按鍵
- sbit key_sr_left=P3^7;
- sbit key_sr_turn=P3^6;
- sbit key_sr_right=P3^5;
- sbit key_sr_down=P3^4;
- LCD12864
- sbit RS_Port=P1^0;
- sbit RW_Port=P1^1;
- sbit E_Port=P2^5;
- sbit PSB_Port=P1^2;
- sbit RST_Port=P1^4;
- 數(shù)碼管鎖存器
- sbit dula=P2^6;
- sbit wela=P2^7;
-
- *******************************************************/
- /*****************************頭文件區(qū)*****************************************************/
- #include<reg52.h>
- //#include"STC15F2K60S2.h"
- #include"task_key.h"
- #include"task_activation.h"
- #include"12864b.h"
- #include"TaskBlock.h"
- #include"Block.h"
- /*****************************宏定義區(qū)*****************************************************/
- //需要判斷是否刷新的任務(wù)總數(shù)
- //1KeyLeft,2KeyTurn,3KeyRight,4KeyDown,5TaskGoingDown,6KeyPause
- #define NUM_TASK_FLAG 7
- //需要定時(shí)刷新的任務(wù)總數(shù)
- //1TaskGoingDown,2KeyService
- #define NUM_TASK_REFRESH 3
- //刷新頻率
- #define TIME_PER_SEC 200 //每次進(jìn)入中斷的頻率,200Hz
- #define TIME_CLOCK 11059200 //晶振頻率
- #define TIME_KEY_SERVICE_50HZ TIME_PER_SEC/50 //按鍵服務(wù)頻率,0.02s
- #define TIME_TASKGOINGDOWN_2HZ TIME_PER_SEC/2 //下落頻率,0.5s
- /******************************子函數(shù)聲明區(qū)***********************************************/
- void initial_myself(void);
- void initial_peripheral(void);
- void delay100ms(void);
- /******************************全局變量定義區(qū)***********************************************/
- unsigned char uc_state=1;//狀態(tài)標(biāo)示:1歡迎界面,2等待開(kāi)始界面,3下落界面,4死亡界面,5暫停界面
- 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)
- unsigned char ucBlockNow=0;//當(dāng)前方塊
- unsigned char ucBlockNext=0;//下一個(gè)方塊
- unsigned char ucFlagScreenChange=1;//界面變更標(biāo)志,界面更改時(shí)置1,激活task_activation
- unsigned char ucCoordinate[2];//方塊的旋轉(zhuǎn)點(diǎn)坐標(biāo),橫H,豎S
- unsigned char xdata ucxMap[10][20];//整張屏幕的標(biāo)記地圖,用來(lái)記錄未消除方塊位置,有方塊則為1
- unsigned char ucxBlockPosition[4][2];//方塊的4個(gè)小方塊坐標(biāo),[0][0],[0][1]為旋轉(zhuǎn)點(diǎn)坐標(biāo)H,S
- unsigned int uc_delay_task_cnt[NUM_TASK_REFRESH];//任務(wù)刷新延遲
- unsigned char uc_flag_taskrefresh[NUM_TASK_FLAG];//任務(wù)刷新標(biāo)志
- unsigned long int ucScore=0;//得分
- /******************************主函數(shù)開(kāi)始***********************************************/
- void main(void)
- {
- unsigned char i=0;
- initial_myself();
- delay100ms();
- initial_peripheral();
- while(1)
- {
- if(ucFlagScreenChange==1)//界面變更標(biāo)志為1時(shí),進(jìn)行任務(wù)激活,防止一直刷新界面
- {
- task_activation(uc_state);
- ucFlagScreenChange=0;
- }
- if(uc_delay_task_cnt[2]==0)//20HZ頻率刷新key_service
- {
- task_key_service();
- ET0=0;//在中斷中也有可能變化的變量在更改前時(shí)先關(guān)閉中斷
- uc_delay_task_cnt[2]=TIME_KEY_SERVICE_50HZ;//延遲重置
- ET0=1;
- }
- if(uc_flag_taskrefresh[5]&&uc_delay_task_cnt[1]==0)//需要時(shí),2HZ頻率刷新TaskGoingDown
- {
- if(!TaskGoingDown())//下落失敗
- {
- //將當(dāng)前方塊位置寫(xiě)入Map
- for(i=0;i<4;i++)
- {
- ucxMap[ ucxBlockPosition[i][0] ][ ucxBlockPosition[i][1] ]=1;
- }
- //調(diào)用消除方塊函數(shù)
- TaskClear();
- }
- ET0=0;//在中斷中也有可能變化的變量在更改前時(shí)先關(guān)閉中斷
- uc_delay_task_cnt[1]=TIME_TASKGOINGDOWN_2HZ;//延遲重置
- ET0=1;
- }
- }
- }
- //中斷函數(shù)
- void timer0(void) interrupt 1
- {
- unsigned char i;
- TR0=0;
- TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
- TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
- //task_delay[]減到0時(shí),相應(yīng)的函數(shù)準(zhǔn)備就緒
- for(i=0;i<NUM_TASK_REFRESH;i++)
- {
- if(uc_delay_task_cnt[i]!=0)//延遲不為0時(shí)才減
- {uc_delay_task_cnt[i]--;};
- }
- task_key_scan();//按鍵掃描函數(shù),放在中斷中,保證準(zhǔn)時(shí)掃描
- TR0=1;
- }
- //初始化區(qū)
- void initial_myself(void)//第一區(qū) 初始化單片機(jī)
- {
- unsigned char i;
- for(i=0;i<NUM_TASK_REFRESH;i++)uc_delay_task_cnt[i]=0;//初始化讓所有任務(wù)就緒
- TMOD=0X21; //定時(shí)器0為16位不自動(dòng)重裝,用來(lái)定時(shí);定時(shí)器1為8位自動(dòng)重裝,用來(lái)產(chǎn)生隨機(jī)數(shù)
- TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
- TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
- TH1=0;
- TL1=0;
- }
- void initial_peripheral(void) //第二區(qū) 初始化外圍
- {
- Lcd_Init();//初始化12864
- EA=1; //開(kāi)總中斷
- ET0=1; //允許定時(shí)器0中斷,定時(shí)器1無(wú)需開(kāi)啟中斷
- TR0=1; //啟動(dòng)定時(shí)器0
- TR1=1; //啟動(dòng)定時(shí)器1
- }
- void delay100ms(void) //@11.0592MHz
- {
- unsigned char i, j, k;
- ;
- ;
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
復(fù)制代碼
所有資料51hei提供下載:
俄羅斯方塊全部源碼.zip
(147.88 KB, 下載次數(shù): 73)
2018-4-26 17:36 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|