所用器件:STC89C516,矩陣鍵盤,LCD1602,16*16點陣,74HC595,無源蜂鳴器,晶振為11.0592MHZ
使用說明:
開機(復位)進入啟動界面,1602顯示Welcome。500ms后進入菜單界面,1602顯示SnakesSubsonic(貪吃蛇)。此時S1按鍵為上翻,S3按鍵為下翻,S2按鍵為確認。共有三種游戲選擇,按順序為SnakesSubsonic、FallingDiamonds(類似於鋼琴塊)、ElectronicOrgan(電子琴)。上翻下翻可循環選項。
進入貪吃蛇界面后,點陣顯示初始化界面,同時1602顯示Press any key to continue..
按下任意按鍵開始游戲。S2按鍵為上,S10按鍵為下,S5按鍵為左,S7按鍵為右,S6按鍵為暫停,S16按鍵為退出。開始游戲后,1602顯示分數,點陣顯示游戲界面。按下暫停后游戲界面保持,同時1602顯示Press any key to continue..等待按鍵繼續游戲。游戲規則和普通貪吃蛇一樣,吃到自己或者撞牆就會結束游戲,此時點陣熄滅,1602保持最后的分數,按任意鍵結束游戲,返回菜單界面。按下退出和自然結束的結果一樣。
進入鋼琴塊界面后,點陣下落方塊,1602顯示分數。S1-S4對應下落的四列,S6為暫停,S16為退出。暫停和退出的現象和貪吃蛇相同。游戲規則為在鋼琴塊快下落到底部時按鍵有效,且越接近底部得分越高,過早按鍵會結束游戲。按鍵順序即消除順序必須要與下落順序一致,否則結束游戲。按下S1-S4時,對應的一列最下方會短暫點亮,增加游戲體驗,同時消除對應方塊。游戲結束和貪吃蛇一樣。
進入電子琴界面后,1602顯示Let it be,含義為演奏你想要的音樂。S1按鍵按下后自動播放一段音樂,點陣顯示循環動態圖。S2-S4對應低音So、La、Si。S5-S11對應中音Do、Re、Mi、Fa、So、La、Si。S12-S15對應高音Do、Re、Mi、Fa。一共可演奏14個音。S16為退出,直接返回菜單。按下S1后,長按任意鍵可手動退出播放,或者等播放結束自動退出播放,退出播放后返回演奏模式。演奏時,按下按鍵即可發聲,長按長響,短按短響。根據不同音調的頻率設置定時器進而控制蜂鳴器,所以音准很好,可以無瑕疵演奏簡單音樂。因圖片無法體現該部分,故補貼圖,詳細情況請見源碼。
功能實現:
菜單功能通過外層死循環顯示選項並通過內層死循環等待按鍵。通過變量保存選項。按鍵按下后切換選項或者調用游戲控制函數。核心代碼如下:
1 while (1) 2 { 3 MenusLcd1602(function); 4 while (1) 5 { 6 keyvalue = KeyScan_Up(); 7 if (keyvalue > 0 && keyvalue < 4) 8 { 9 if (keyvalue == 1) //上翻 10 { 11 if (function == 0) 12 function = 2; 13 else 14 --function; 15 } 16 else if (keyvalue == 3) //下翻 17 { 18 if (function == 2) 19 function = 0; 20 else 21 ++function; 22 } 23 else //確認 24 { 25 switch (function) 26 { 27 case 0 : Snakes_Subsonic(); break; 28 case 1 : Falling_Diamonds(); break; 29 case 2 : Electronic_Organ(); break; 30 } 31 } 32 break; 33 } 34 } 35 }
不同游戲的實現不同,在此不贅述。值得一提的是,有些C語言版本的貪吃蛇會使用鏈表保存蛇身,使用遞歸產生食物,但在51中無法這樣。malloc函數可能會在ram中產生內存碎片,產生不正常的結果。在51中基本不會使用遞歸,需要使用循環代替。鋼琴塊中,本來使用隨機下落的方法,但是這樣的體驗很差,沒有自己寫下落方塊的體驗感好。電子琴的實現比較簡單,其中點陣動態圖其實是12幀圖片的循環播放,而且那12幀圖片是我花了整整一下午描點描出來的...
反思總結:
這次作品的基本功能都已經實現,並采取分文件編寫,一個模塊一個文件,一個游戲一個文件。提高了我對於單片機的控制能力,以及代碼的架構能力。整個作品完成后,我也深深感到所學的不足。比如有許多地方涉及到多任務管理,而我采取的方法是大循環內一次調用不同任務。雖然這種偽多任務基本可以滿足需求,但是對於游戲體驗來說還是存在影響。並且如果任務繼續增加,那么這種偽多任務的方法肯定就會產生問題。所以下一步改進可能會使用RTX51這種實時系統的框架實現作品。
源碼鏈接:https://pan.baidu.com/s/19O0d92iTBRRgMoPU3UIYMw 密碼:eu9m