此次ARM7最小系統的課程設計是基于LPC2124以及LCD-CSTN20GG0906N7CUN6和按鍵電路。采用ISIS 7 Professional軟件自行搭建電路。本系統的特點是性能高、成本低并且耗能小等特點。
2. 課程設計目的此次課程設計的主要目的是讓我們提高代碼的熟練度,以及發揮自主創新,將平時上課學到的理論知識與實驗知識相結合。讓我們對arm7芯片以及ISIS 7 Professional仿真模擬器更為了解。
設計原理:貪吃蛇游戲是一款經典的游戲,既簡單又耐玩。通過控制蛇頭方向吃蛋,使得蛇變長,從而獲取積分。用游戲把子上下左右控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,而且蛇的身子會越吃越長,身子越長玩的難度就越大,不能碰墻,不能咬到自己的身體,更不能咬自己的尾巴,等到了一定的分數,就能過關,然后繼續玩下一關。
5.1.步驟1:在Proteus仿真軟件上設計電路圖

由于采用的是LCD-CSTN20GG0906N7CUN6,首先根據其數據手冊對該LCD進行繪畫,先寫入命令對其進行寫操作WR_CMD(0xBC);WR_DATA(0); WR_DATA(00); WR_DATA(00); 然后寫入命令WR_CMD(0x75);意為寫入x軸,后接x軸的具體數據以及x軸的最大值。緊接著寫入WR_CMD(0x15);意為寫入y軸,后接y軸的具體數據以及y軸的最大值。
void snake_display(int x,int y)
{
int i,j;
WR_CMD(0xBC); WR_DATA(0); WR_DATA(00); WR_DATA(00);
WR_CMD(0x75);
WR_DATA(x); WR_DATA(63);
WR_CMD(0x15);
WR_DATA(y); WR_DATA(95);
WR_CMD(0x5c);
for(j=0;j<1;j++) {
for(i=0;i<1;i++){
WR_DATA(0xf8);//0xff
WR_DATA(0x00); }}
}
5.2.1步驟1.1:蛇的產生首先創建一個蛇的結構體Point,該結構體內存儲了蛇的x、y坐標,以及蛇的長度和蛇的方向,然后通過rand函數產生隨機數存在Snake的x、y中,即蛇的初始位置是隨機的,然后再通過snake_init()函數中對蛇進行初始化,然后通過循環在snake_display(int x,int y)函數中把蛇畫出來。
首先創建一個食物的結構體point,在該結構體的基礎上定義一個數組food_map,通過這個結構體對地圖進行修改。該結構體內存儲了食物的x、y坐標,以及食物的長度,然后通過rand函數產生隨機數保存在food_map中,即食物的出現位置是隨機的,然后再通過food_init()函數中對食物進行初始化,然后通過循環在food_display(int x,int y)函數中把食物畫出來(食物的畫法與步驟一中蛇的畫法是一樣的,只不過食物的顏色是黃色,蛇的顏色是紅色,便于確認)。
當蛇吃了一定數量的食物時,通過調用食物產生函數,重新產生新的食物,以保證食物的存在性。
若相應方向的按鍵被按下,則蛇就會往相應的方向移動。首先要把蛇之前走過的痕跡擦掉(擦掉的函數如同畫蛇,把顏色數據改為背景色即可),然后將蛇從最后個節點向前一個節點移動,這是蛇的最核心算法。最后通過switch case判斷哪一個按鍵被按下,然后對蛇頭的方向,即Snake.direction進行修改。蛇的移動函數放在中斷中,每次發生中斷都會重新畫蛇(蛇的移動即把原來的蛇尾巴擦掉,然后根據新的坐標重新畫蛇)。當按鍵沒有被按下時,蛇會按照上一次按下按鍵的方向去移動(初始化時默認向右)。
5.4.1. 步驟1.1:按鍵的掃描
通過IOxPIN來確定按鍵是否按下,由于按鍵接在P1.20-P1.23,因此是I01PIN。通過讀取各個按鍵的狀態封裝在snake_state函數里。如果上鍵按下,Snake.directio則相應為上(Snake.direction是蛇的結構體Point里的成員用于確定蛇的方向)。其余方向的設置同上。
void snake_state()
{
if(!(IO1PIN&key_w))Snake.direction=1;//上
else if(!(IO1PIN&key_s))Snake.direction= -1;//下
else if(!(IO1PIN&key_a))Snake.direction= 2;//左
else if(!(IO1PIN&key_d))Snake.direction= -2;//右
}
5.5.步驟5:蛇節的增長
如果蛇吃到了食物,此時的蛇應該變長,即Snake.num++,在蛇尾的部分添加一個點即可,新的一節先放在看不見的位置,下次循環就取前一節的位置。先把這條蛇擦掉,然后重新畫蛇。
if(flag==1)
{
Snake.num++;
flag=0;
}
5.5.1. 步驟1.1:判斷蛇是否吃到食物
如果蛇頭的x、y坐標與food_map中的任一x、y坐標均相等,則說明蛇已經吃了食物,此時要對食物進行擦除(食物的擦除與食物的繪畫是一樣的,只需要把顏色改為跟背景色一樣即可)。
5.5.2. 步驟1.2:速度的增長
當蛇吃到一定數量的食物時,游戲的等級會增加,此時蛇的速度就會變快,通過改變定時器的定時時長可以實現,即改變T0TR,首先設定一個speed變量值,當游戲中的LEVEL++時,speed的值減小,此時定時器的定時時長會縮短,會,從而導致蛇的移動掃描變快,因而實現了蛇的速度的變化。
void speed_change()
{
T0PR = speed;
}
5.6.步驟6:游戲是否結束
如果蛇跑出了LCD所能表示的范圍,即蛇頭小于0或者大于63,蛇尾小于0或者大于95,則視為死亡,游戲結束,顯示結束圖片。如果需要繼續游戲則按下重新開始按鈕。
如果蛇頭撞上了身體的任意環節(通過循環來一節節地進行判斷),則視為死亡,游戲結束,顯示結束圖片。如果需要繼續游戲則按下重新開始按鈕。
反之,游戲繼續。
如果最終的等級大于9級,則游戲勝利,顯示勝利圖片。如果需要繼續游戲則按下重新開始按鈕。
5.7.步驟7:LCDHDG12864L-6的顯示
該LCD用來顯示游戲的名稱、制作人、等級以及分數。根據該LCD的數據手冊首先寫入的是y的值,然后寫入x的值,來確定所寫的字的位置,先寫字的上半部分,然后重新寫入y的值,x的值不變,再寫字的下半部分。
每次蛇吃到食物時,分數就會增加。分數的字模放在一個數組里,通過下標調用顯示。當蛇吃到了一定數量的食物之后,等級就會隨之增加,等級的字模也是放在一個數據里,通過下標調用顯示。
void print_level()
{
int j;
WR_CMD1(0xb0+4);
WR_CMD1(0x10);
WR_CMD1(0x00+51);
for(j=0;j<8;j++)
{
WR_DATA1(number[LEVEL][0][j]);
}
WR_CMD1(0xb0+5);
WR_CMD1(0x10);
WR_CMD1(0x00+51);
for(j=0;j<8;j++)
{
WR_DATA1(number[LEVEL][1][j]);
}
}
5.8.步驟8:重新開始與暫停按鍵
設置兩個按鍵用于重新開始游戲以及暫停游戲。
重新開始游戲時,先把顯示蛇的LCD的屏幕清屏。把成績與等級初始化為0,然后對游戲的所有參數重新進行初始化。
暫停按鈕的實現十分簡單,只需要把蛇的移動方向設為空即可。此時,蛇不會再移動。若要繼續游戲,則按任意方向鍵繼續。
void button()
{
if(!(IO1PIN&restart))
{
LCD_clear();
die=0;
LEVEL=0;
NUMBER=0;
flag=0;
eat=0;
speed=1000;
Snake.direction=NULL;
food_map_init();
create_food=0;
score_init();
print_score();
print_level();
snake_init();
food_map_init();
}
if(!(IO1PIN&stop))
{
Snake.direction=NULL;
}
}
6. 設計結果及分析設計結果:蛇的出現位置與食物的出現位置都是隨機的。當按下相對應的按鍵時,蛇會往那個方向走,當蛇吃到食物時,分數會增加。當蛇吃到一定數量的食物時,等級和速度也會隨之增加,當食物少于一定數量時,會出現新的食物。當等級達到9時,游戲結束,玩家勝出,播放勝利圖片。如果蛇吃到自身,或者撞到墻,則游戲結束,玩家失敗,播放失敗圖片。
設計分析:這個程序的關鍵是表示蛇的圖形以及蛇的移動。用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊。如果不按任何鍵,蛇自行在當前方向上前移,當游戲者按了有效的方向鍵后,蛇頭朝著指定的方向移動,一步移動一節身體,所以當按了有效的方向鍵后,先確定蛇頭的位置,然后蛇身體隨著蛇頭移動,圖形的實現是從蛇頭的新位置開始畫出蛇,這時原來蛇的位置和新蛇的位置差一個單位,所以看起來蛇會多一節身體,所以將蛇的最后一節用背景色覆蓋。食物的出現和消失也是畫矩形塊和覆蓋矩形塊。

經過奮戰我的課程設計終于完成了。在沒有做課程設計以前覺得課程設計只是對嵌入式最小系統這門課程所學知識的單純總結,但是通過這次做課程設計發現自己的看法有點太片面。課程設計不僅是對前面所學知識的一種檢驗,而且也是對自己能力的一種提高。通過這次課程設計使我明白了自己原來知識還比較欠缺。自己要學習的東西還太多,以前老是覺得自己什么東西都會,什么東西都懂,有點眼高手低。通過這次課程設計,我才明白學習是一個長期積累的過程,在以后的工作、生活中都應該不斷的學習,提高自己的知識和綜合素質。
8. 問題及心得體會通過這次的課程設計讓我學到了許多編程知識,提高運用C語言解決實際問題的能力,鞏固了C語言的語法規則、掌握和理解,還提高了自學以及查閱資料的能力。我發現只有理論知識是不夠的,僅僅運用課上所學無法編實際問題,實際執行過程與預想不一致,經常會出現bug。還因為在仿真軟件中用錯了一個LCD顯示器,導致程序卡在那里好幾天,當時用的是12864-6,一直卡在蛇的顯示,非常考驗我的邏輯與耐心。后來一怒之下換了一個實驗中講過的LCD顯示器。必須把所學的理論知識和自身的實踐相結合,在編程中我學到了許多編程知識,還學會了如何去看器件的數據手冊,在實際編程中,我遇到許多困難,例如:蛇的頭部與食物的檢測問題,蛇的移動與顯示問題,蛇的轉向問題,食物的隨機生成問題等等,我通過在網上搜集資料與自己的分析。最后,終于完成了這個游戲。
9. 對本設計過程及方法、手段的改進建議在食物的設計的方面,可以放上帶道具的食物,使蛇吃完后具有保護,穿墻等特種功能,而且難度逐漸變難。還有設計一些障礙物,當蛇撞到障礙物時死亡。
全部資料51hei下載地址:
Snake.zip
(281.7 KB, 下載次數: 122)
| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |