俄羅斯方塊四合一游戲
電路原理圖如下:
PCB版本電路圖.jpg (66.57 KB, 下載次數: 62)
下載附件
俄羅斯方塊布線截圖
2018-10-19 21:32 上傳
俄羅斯方塊布線截圖.jpg (110.86 KB, 下載次數: 64)
下載附件
PCB版本電路圖
2018-10-19 21:32 上傳
3位0.56寸數碼管引腳圖.jpg (28.88 KB, 下載次數: 62)
下載附件
2018-10-19 21:34 上傳
1588點陣引腳圖1.jpg (48.43 KB, 下載次數: 66)
下載附件
2018-10-19 21:34 上傳
1588點陣引腳圖2.jpg (51.31 KB, 下載次數: 56)
下載附件
2018-10-19 21:35 上傳
單片機源程序如下:
- /*
- //功能:復古掌上俄羅斯方塊游戲機源代碼,包括游戲GUI,俄羅斯方塊、貪吃蛇、經典賽車游戲、射擊障礙物游戲
- v1.0:
- 2014-7-26 00:00:00 :完成有俄羅斯方塊游戲基本模型;
- 2014-7-28 02:12:03 :將原先臨時使用的延時鍵盤掃描改為外部中斷狀態位檢測鍵;
- 2014-7-28 20:40:37 :完成俄羅斯方塊分數計數及分數顯示功能;
- 2014-8-1 01:01:54 :將較早之前完成貪吃蛇游戲代碼合并植入;
- 2014-8-2 17:04:25 :整理之前的臨時源碼,使工程文件規范化;
- 2014-8-3 23:50:49 :構建游戲選擇畫面基本模型,完成畫面平移效果;
- 2014-8-5 00:50:04 :改進LED點陣底層驅動,用軟件PWM調節畫面亮度;
- 2014-8-7 00:53:35 :完成賽車游戲,用PWM分層掃描畫面,形成游戲畫面對比度;
- 2014-8-8 02:16:44 :完成賽車游戲選擇預覽畫面,并將三個游戲合并在一起;
- 2014-8-12 01:47:07 :將逐行掃描改為逐點掃描,使顯示亮度均勻;增加亮度調節功能;
- 2014-9-9 00:32:40 :修改及優化若干細節;
- v1.1:
- 2014-9-18 0:57:23 :重新布局電路,修改原先不合理的地方,為制作PCB板作準備;
- 2014-9-19 22:02:36 :加入游戲音效,并且可以通過軟件方式開關聲音;
- 2014-9-21 14:59:39 :增加三位mini數碼管,實時顯示游戲分數,數碼管共用點陣并行數據口;
- ~~~~~~~~~~~忘記備注
- 2014-10-20 21:30:15 :加入射擊游戲,將GUI模塊化,簡化流程
- */
- #include "config.h"
- volatile uint8 data keypad = K_NULL; //鍵盤狀態
- volatile uint8 data keycont = 0; //鍵盤檢測消抖定時器
- volatile uint16 data tms = 0; //1ms T0定時器
- bit key_state = 0; //按鍵狀態
- uint16 data speeds = 0; //游戲速度
- uint16 data scores = 0; //游戲計分
- bit Glife = 1; //游戲生命
- bit sound_ON = 1; //音效開關
- uint8 data duty = 80; //PWM,默認亮度
- uint8 data DispRAM[16]={0};
- uint8 code bitman[8]={1,2,4,8,16,32,64,128};//用于數字序號定位0~7bit位
- uint8 code num[10][5]= //陽碼
- {
- {0x7,0x5,0x5,0x5,0x7},
- {0x2,0x6,0x2,0x2,0x7},
- {0x7,0x1,0x7,0x4,0x7},
- {0x7,0x1,0x7,0x1,0x7},
- {0x5,0x5,0x7,0x1,0x1},
- {0x7,0x4,0x7,0x1,0x7},
- {0x7,0x4,0x7,0x5,0x7},
- {0x7,0x1,0x1,0x1,0x1},
- {0x7,0x5,0x7,0x5,0x7},
- {0x7,0x5,0x7,0x1,0x7}
- };
- /*********************PORT_INIT********************/
- void Port_Init()
- {
- P0M0 = 0Xff;
- P0M1 = 0X00;
- P1M0 = 0Xff;
- P1M1 = 0X00;
- P2M0 = 0Xff;
- P2M1 = 0X00;
- P3M0 = 0X00;
- P3M1 = 0X00;
- P4M0 = 0Xff;
- P4M1 = 0X00;
- P5M0 = 0Xff;
- P5M1 = 0X00;
- }
- void Init_Timer()
- {
- /******************定時器0中斷設置**********************/
- AUXR |= 0x80; //定時器0為1T模式
- TMOD = 0x00; //設置定時器為模式0(16位自動重裝載)
- TL0 = T1MS; //初始化計時值
- TH0 = T1MS >> 8;
- TR0 = 1; //定時器0開始計時
- ET0 = 1; //使能定時器0中斷
-
- /*****************外部中斷設置*************************/
- IT0 = 1; //設置INT0下降沿觸發
- EX0 = 1; //使能外部中斷INT0
- IT1 = 1; //設置INT1下降沿觸發
- EX1 = 1; //使能外部中斷INT1
- INT_CLKO |= 0x70; //使能INT2,INT3,INT4(EX4 = 1,EX3 = 1,EX2 = 1
-
- EA = 1;
- }
- void Array_CLR(uint8 *p)
- {
- uint8 i=0;
- while(i!=16)
- {
- p[i] = 0x00;
- i++;
- }
- }
- void ShowScore(uint score)
- {
- uint8 i;
- uint8 qx,bx,sx,gx;
- qx = score /1000;
- bx = score %1000 /100;
- sx = score %100/10;
- gx = score %10;
- Array_CLR(DispRAM);
- for(i=0;i<5;i++)
- DispRAM[8-i] = (num[sx][i]<<4) | (num[gx][i]);
-
- for(i=0;i<5;i++)
- DispRAM[14-i] = (num[qx][i]<<5) | (num[bx][i]<<1);
-
- // MatxDisp(DispRAM,duty);
- }
- void main()
- {
- Port_Init();
- Sound_Init();
- Init_Timer();
- Sound_Tone(1,14,5);//滴
-
- srand(TL0);
- delayms(100);
- Play_Music(sound_game_start);
- Flash_Screen_Clear();
- while(1)
- {
- tms = 0;
- keypad = K_NULL;//清除按鍵狀態
- switch (GUI_Main()) //進入用戶游戲選擇界面,返回選擇的游戲
- {
- case 1: Tetris_Game(); break;
- case 2: Snake_Game(); break;
- case 3: RAC_Game(); break;
- case 4: Shot_Game(); break;
- }
- Play_Music(sound_game_over);
- Flash_Screen_Clear();
- ShowScore(scores); //將分數載入顯存
- delayms(300);
-
- keypad = K_NULL;
- while(keypad != K_UP) //在沒按下OK鍵時保持分數顯示
- {
- MatxDisp(DispRAM,duty);
- SMG_Display(scores,duty);
- }
- }
- }
- /* Timer0 interrupt routine */
- void T0_Timer_1ms_int() interrupt 1 using 1
- {
- if(tms<0xfffe) tms++; //防止溢出
- if(key_state){ if(!--keycont) key_state=0;}
- if(PIN_TR2)//TR2如果打開,則開始播放音效
- {
- if(!sound_cnt_time--)
- {
- TR2_OFF;
- beep = 1;
- if(music_p[s_p][1])
- {
- Sound_Tone(sound_ON,music_p[s_p][0],music_p[s_p][1]);
- s_p++; //自動裝載下一個音符,實現音效與游戲“同時”運行
- }
- }
- }
- if(KEY_DOWN==0 & KEY_UP==0) IAP_CONTR=0x60;//軟件復位下載程序
- }
- void T2_Timer_Sound_freq() interrupt 12 //中斷入口
- {
- beep = ~beep; //蜂鳴器頻率震動
- }
- uint8 Get_Kvuale(uint8 key_delay)//鍵值消抖處理,參數為靈敏度調節
- {
- uint8 kvuale = K_NULL; //返回的初始值為空值
- if(keypad != K_NULL) //當鍵值不為NULL時,說明有按鍵按下
- {
- if(!key_state) //當按鍵狀態位state為0時說明是第一次觸發有效,為1時為重復觸發
- {
- key_state=1; //置1,防止重復觸發
- kvuale = keypad;//獲得讀取鍵值
- keycont = key_delay;//載入消抖時間
- }
- keypad = K_NULL; //清楚鍵值
- }
- return kvuale;
- }
- /*********外部中斷按鍵區**********/
- void exint0() interrupt 0 //INT0
- {
- keypad = 0;
- }
- void exint1() interrupt 2 //INT1
- {
- keypad = 1;
- }
- void exint2() interrupt 10 //INT2
- {
- keypad = 2;
- }
- void exint3() interrupt 11 //INT3
- {
- keypad = 3;
- }
- void exint4() interrupt 16 //INT4
- {
- keypad = 4;
- }
復制代碼
所有資料51hei提供下載:
程序.rar
(194.41 KB, 下載次數: 107)
2018-10-19 21:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|