|
82a67009c93d70cf2e9a0b52fbdcd100bba12ba1.jpg (111.81 KB, 下載次數(shù): 82)
下載附件
2018-3-5 03:43 上傳
電路原理圖:
0.jpg (64.7 KB, 下載次數(shù): 93)
下載附件
2018-3-5 03:50 上傳
這個(gè)剛開始的原型只是一條蛇。。
所謂一百個(gè)程序員有一百條蛇,剛開始我只是想把我之前用C語言寫的貪吃蛇程序拿到單片機(jī),在8*8的點(diǎn)陣跑一下,但覺得有點(diǎn)簡(jiǎn)單,在STC12C5A60S2單片機(jī)下只用了不到程序10%覺得還是加點(diǎn)什么的,后來就加了俄羅斯方塊,賽車,打飛機(jī)。。索性做了個(gè)簡(jiǎn)易的GUI界面。
硬件結(jié)構(gòu)非常簡(jiǎn)單,用了一個(gè)逆天IAP15F2K61S2單片機(jī),直接用單片機(jī)管腳推挽模式驅(qū)動(dòng)點(diǎn)陣,限流電阻什么的都不管了,不用任何外圍IC,兩個(gè)8*8點(diǎn)陣和三位數(shù)碼管,共用一組數(shù)據(jù)口,幾乎用了單片機(jī)所以引腳;采用逐點(diǎn)掃描方式,并且用軟PWM調(diào)節(jié)亮度,媽媽再也不用擔(dān)心我單片機(jī)電流過載了而燒壞了~
可怕的背部飛線:
9a91de3d70cf3bc789606cb3d200baa1cc112aa1.jpg (137.25 KB, 下載次數(shù): 85)
下載附件
2018-3-5 03:47 上傳
較早版本是并口數(shù)據(jù)模式,走線比較痛苦,但程序比較好寫,
后面版本修改了驅(qū)動(dòng),引腳可以自由映射,走線起來就很舒服了。
實(shí)現(xiàn)同一屏,不同對(duì)比度:
34a567cf3bc79f3def81456fb9a1cd11738b29a1.jpg (110.46 KB, 下載次數(shù): 94)
下載附件
2018-3-5 03:47 上傳
8d572cc79f3df8dcc95d2ecece11728b461028a1.jpg (67.62 KB, 下載次數(shù): 97)
下載附件
2018-3-5 03:47 上傳
大概4~5天之后來了,這個(gè)快遞包裹體積很小,但重量異常的沉。。。
c65f883df8dcd100a3fc597e718b4710b8122fa1.jpg (59.42 KB, 下載次數(shù): 84)
下載附件
2018-3-5 03:47 上傳
焊上元件,燒上程序,還好能正常運(yùn)行,總算松了口氣。。。。
62a5efdcd100baa1d74ce6e44410b912c9fc2ea1.jpg (80.91 KB, 下載次數(shù): 95)
下載附件
2018-3-5 03:47 上傳
看著心好累,焊得我蛋疼。。。
0544c600baa1cd1169d6d37fba12c8fcc2ce2da1.jpg (62.29 KB, 下載次數(shù): 86)
下載附件
2018-3-5 03:47 上傳
2c98ada1cd11728b5b4d2d7dcbfcc3cec2fd2ca1.jpg (57.2 KB, 下載次數(shù): 94)
下載附件
2018-3-5 03:47 上傳
/******************************************************************************************************/
目前有四款游戲程序空間大概用了40%左右,后續(xù)有時(shí)間精力更新更多的游戲進(jìn)來。。
以下是工程文件,如果你有單片機(jī)基礎(chǔ),那就自己也DIY一個(gè)吧,回味下童年。
/****************************************工程文件下載區(qū)*******************************************/
視頻:
單片機(jī)源程序如下:
- /*
- //作者:鄭梓濱 Jaupin@126.com
- //功能:復(fù)古掌上俄羅斯方塊游戲機(jī)源代碼,包括游戲GUI,俄羅斯方塊、貪吃蛇、經(jīng)典賽車游戲、射擊障礙物游戲
- v1.0:
- 2014-7-26 00:00:00 :完成有俄羅斯方塊游戲基本模型;
- 2014-7-28 02:12:03 :將原先臨時(shí)使用的延時(shí)鍵盤掃描改為外部中斷狀態(tài)位檢測(cè)鍵;
- 2014-7-28 20:40:37 :完成俄羅斯方塊分?jǐn)?shù)計(jì)數(shù)及分?jǐn)?shù)顯示功能;
- 2014-8-1 01:01:54 :將較早之前完成貪吃蛇游戲代碼合并植入;
- 2014-8-2 17:04:25 :整理之前的臨時(shí)源碼,使工程文件規(guī)范化;
- 2014-8-3 23:50:49 :構(gòu)建游戲選擇畫面基本模型,完成畫面平移效果;
- 2014-8-5 00:50:04 :改進(jìn)LED點(diǎn)陣底層驅(qū)動(dòng),用軟件PWM調(diào)節(jié)畫面亮度;
- 2014-8-7 00:53:35 :完成賽車游戲,用PWM分層掃描畫面,形成游戲畫面對(duì)比度;
- 2014-8-8 02:16:44 :完成賽車游戲選擇預(yù)覽畫面,并將三個(gè)游戲合并在一起;
- 2014-8-12 01:47:07 :將逐行掃描改為逐點(diǎn)掃描,使顯示亮度均勻;增加亮度調(diào)節(jié)功能;
- 2014-9-9 00:32:40 :修改及優(yōu)化若干細(xì)節(jié);
- v1.1:
- 2014-9-18 0:57:23 :重新布局電路,修改原先不合理的地方,為制作PCB板作準(zhǔn)備;
- 2014-9-19 22:02:36 :加入游戲音效,并且可以通過軟件方式開關(guān)聲音;
- 2014-9-21 14:59:39 :增加三位mini數(shù)碼管,實(shí)時(shí)顯示游戲分?jǐn)?shù),數(shù)碼管共用點(diǎn)陣并行數(shù)據(jù)口;
- ~~~~~~~~~~~忘記備注
- 2014-10-20 21:30:15 :加入射擊游戲,將GUI模塊化,簡(jiǎn)化流程
- */
- #include "config.h"
- volatile uint8 data keypad = K_NULL; //鍵盤狀態(tài)
- volatile uint8 data keycont = 0; //鍵盤檢測(cè)消抖定時(shí)器
- volatile uint16 data tms = 0; //1ms T0定時(shí)器
- bit key_state = 0; //按鍵狀態(tài)
- uint16 data speeds = 0; //游戲速度
- uint16 data scores = 0; //游戲計(jì)分
- bit Glife = 1; //游戲生命
- bit sound_ON = 1; //音效開關(guān)
- uint8 data duty = 80; //PWM,默認(rèn)亮度
- uint8 data DispRAM[16]={0};
- uint8 code bitman[8]={1,2,4,8,16,32,64,128};//用于數(shù)字序號(hào)定位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()
- {
- /******************定時(shí)器0中斷設(shè)置**********************/
- AUXR |= 0x80; //定時(shí)器0為1T模式
- TMOD = 0x00; //設(shè)置定時(shí)器為模式0(16位自動(dòng)重裝載)
- TL0 = T1MS; //初始化計(jì)時(shí)值
- TH0 = T1MS >> 8;
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0 = 1; //使能定時(shí)器0中斷
-
- /*****************外部中斷設(shè)置*************************/
- IT0 = 1; //設(shè)置INT0下降沿觸發(fā)
- EX0 = 1; //使能外部中斷INT0
- IT1 = 1; //設(shè)置INT1下降沿觸發(fā)
- 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;//清除按鍵狀態(tài)
- switch (GUI_Main()) //進(jìn)入用戶游戲選擇界面,返回選擇的游戲
- {
- 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); //將分?jǐn)?shù)載入顯存
- delayms(300);
-
- keypad = K_NULL;
- while(keypad != K_UP) //在沒按下OK鍵時(shí)保持分?jǐn)?shù)顯示
- {
- 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++; //自動(dòng)裝載下一個(gè)音符,實(shí)現(xiàn)音效與游戲“同時(shí)”運(yùn)行
- }
- }
- }
- if(KEY_DOWN==0 & KEY_UP==0) IAP_CONTR=0x60;//軟件復(fù)位下載程序
- }
- void T2_Timer_Sound_freq() interrupt 12 //中斷入口
- {
- beep = ~beep; //蜂鳴器頻率震動(dòng)
- }
- uint8 Get_Kvuale(uint8 key_delay)//鍵值消抖處理,參數(shù)為靈敏度調(diào)節(jié)
- {
- uint8 kvuale = K_NULL; //返回的初始值為空值
- if(keypad != K_NULL) //當(dāng)鍵值不為NULL時(shí),說明有按鍵按下
- {
- if(!key_state) //當(dāng)按鍵狀態(tài)位state為0時(shí)說明是第一次觸發(fā)有效,為1時(shí)為重復(fù)觸發(fā)
- {
- key_state=1; //置1,防止重復(fù)觸發(fā)
- kvuale = keypad;//獲得讀取鍵值
- keycont = key_delay;//載入消抖時(shí)間
- }
- keypad = K_NULL; //清楚鍵值
- }
- return kvuale;
- }
- /*********外部中斷按鍵區(qū)**********/
- 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
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼 原理圖及源代碼:
GAMEBOX_CODE_Keil5_v1.1.zip
(291.3 KB, 下載次數(shù): 145)
2018-3-5 03:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
環(huán)境:Keil4/keil5
PCB工程文件:
復(fù)古掌上游戲機(jī)工程文件.zip
(2.39 MB, 下載次數(shù): 86)
2018-3-5 03:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
繪制軟件:Altium Designer Winter 09
(說明:PCB工程文件中的布線是源碼中的默認(rèn)配置,使用直插封裝DIY制作需要修改config.h文件定義引腳。)
|
|