一、實驗硬件1、概述 本次課程設(shè)計是在MSP430單片機(jī)液晶屏字符顯示功能的基礎(chǔ)上,編程設(shè)計游戲。程序的設(shè)計基于《F6638實驗指導(dǎo)手冊》中,“TFT-LCD 實驗--字符顯示”的程序點(diǎn)亮TFT-LCD屏幕,編寫游戲程序,與IO控制結(jié)合,實現(xiàn)游戲的可視化和游戲操作。由于Code Composer Studio v5.5.0難以對該程序樣例實現(xiàn)編譯,采用的開發(fā)工具為Code Composer Studio v6.0。
MSP430系列單片機(jī)是由美國TI公司生產(chǎn)的新一代16位單片機(jī),因以其集成密度高、運(yùn)算速度快、外設(shè)接口豐富等優(yōu)勢受到越來越多的產(chǎn)品開發(fā)人員的青睞,是當(dāng)前使用最多的單片機(jī)之一。在很多具體應(yīng)用中,甚至只利用一片MSP430單片機(jī),就可以完成一個系統(tǒng)的全部功能。下面給出實驗中使用的MSP430F66單片機(jī)的封裝圖和功能框圖。
1.001.jpg (42.3 KB, 下載次數(shù): 153)
下載附件
2017-7-30 03:36 上傳
圖1-MSP430F6638封裝圖
1.002.jpg (38.46 KB, 下載次數(shù): 119)
下載附件
2017-7-30 03:36 上傳
圖2-MSP430F6638功能框圖
2、應(yīng)用模塊A. LCD模塊本次編寫的程序所用的主要模塊為LCD模塊,在功能框圖中顯示為 LCD_B。硬件電路設(shè)計如下所示。其中 U21 (TPS75105DSKR)是 LCD 屏背光控制芯片,由 LCD_BL_EN 引腳控制使能端。
1.003.jpg (22.24 KB, 下載次數(shù): 126)
下載附件
2017-7-30 03:36 上傳
圖3-MSP430F6638LCD硬件設(shè)計電路
PIN NO.
FUNCTION DESCRIPTIONS SYMBOL(模塊引腳定義以及各個引腳的功能)
LCD的全稱是Liquid Crystal Display,即液晶顯示器,因功耗低而備受工程師青睞,大規(guī)模應(yīng)用于電子設(shè)備中。而MSP430單片機(jī)中的TFT-LCD則是指薄膜晶體管,Thin-Film Transistor。薄膜晶體管液晶顯示器(TFT-LCD)具有重量輕、平板化、低功耗、無輻射、顯示品質(zhì)優(yōu)良等特點(diǎn),其應(yīng)用領(lǐng)域正在逐步擴(kuò)大,已經(jīng)從音像制品、筆記本電腦等顯示器發(fā)展到臺式計算機(jī)、工程工作站(EWS)用監(jiān)視器。對液晶顯示器的要求也正在向高分辨率、高彩色化發(fā)展。
MSP430F6638所采用的TFT-LCD 液晶屏的工作參數(shù)如下:
X320 點(diǎn) TFT 透射式點(diǎn)陣液晶顯示模塊 |
|
|
|
ILI9328 LCD 驅(qū)動程序或同等能力 |
|
數(shù)據(jù)接口:80的系統(tǒng) 8/9/16/18bit 總線接口 |
|
|
B. TM1638在我們所制作的游戲中有一部分用到了矩陣鍵盤的一個按鍵,矩陣鍵盤隸屬于TM1638電路,TM1638是帶鍵盤掃描接口的LED(發(fā)光二極管顯示器)驅(qū)動控制專用電路,內(nèi)部集成有MCU 數(shù)字接口、數(shù)據(jù)鎖存器、LED 高壓驅(qū)動、鍵盤掃描等電路。其對于矩陣鍵盤的讀取如下圖所示:
1.004.jpg (29.01 KB, 下載次數(shù): 122)
下載附件
2017-7-30 03:36 上傳
圖4-TM1638鍵盤讀取電路
其中A-F分別對應(yīng)KS1-KS6。一旦有按鍵按下,TM1638中相關(guān)的寄存器的值就會改變(按鍵按下時相應(yīng)字節(jié)由0變1)。
2、實驗程序1、程序?qū)崿F(xiàn)效果在TFT-LCD屏上進(jìn)行飛機(jī)大戰(zhàn)小游戲。規(guī)則如下:
- 擊中敵機(jī)得一分,敵機(jī)觸及底線扣除一點(diǎn)生命值,生命值為零時游戲結(jié)束。
- 隨機(jī)出現(xiàn)紅黃藍(lán)三種獎勵,紅色獎勵增加攻擊范圍,藍(lán)色獎勵增加移動速度,黃色獎勵增加一點(diǎn)生命值。
- 隨得分增長游戲難度提升,逐步增加敵機(jī)出現(xiàn)頻率及移動速度,共15關(guān)。
- 按“1”鍵可施放大招,消滅屏幕上所有敵機(jī),冷卻30秒后可再次施放。
2、程序封裝模塊1、圖形產(chǎn)生與移動 基于示例程序“SPI_LCD_TFT”中所含頭文件,利用其中各函數(shù)進(jìn)行繪圖。在繪制各圖形時選取其上一點(diǎn)為相對參考點(diǎn),然后用相對于它的坐標(biāo)畫出整個圖形。需要移動圖形時通過參量“sp”控制其移動距離,移動參考點(diǎn),并在新的位置畫出圖形,同時將原來位置圖形用背景色描一遍以擦除。在移動我方戰(zhàn)機(jī)時,程序為先擦除左右兩邊原來圖形,再顯示即時位置圖形,這樣可以防止擦除行為影響到新圖形。
如繪制敵機(jī)的函數(shù)為:
void Drawenemy(x,y,c)
{
LCD_TFT_FillRectangle(x,y-4,x+2,y-1,c);
LCD_TFT_FillRectangle(x,y+1,x+2,y+4,c);
LCD_TFT_FillRectangle(x+2,y-5,x+6,y+5,c);
LCD_TFT_DrawLine(x+2,y-9,x+2,y+9,c);
LCD_TFT_DrawLine(x+2,y-9,x+6,y-5,c);
LCD_TFT_DrawLine(x+2,y+9,x+6,y+5,c);
LCD_TFT_DrawLine(x+6,y-3,x+9,y,c);
LCD_TFT_DrawLine(x+6,y+3,x+9,y,c);
}
2、我方戰(zhàn)機(jī)的控制 參考按鍵消抖示例程序“msp430f6638_Key_debounce”,在按鍵時將戰(zhàn)機(jī)參考點(diǎn)分別向左或向右移動sp個單元。
如向左移動主要語句為:
if(Is_sw1_pressed()==1) // is key 1 pressed
{ // yes
s=s-sp;
}
void movebird()
{
Drawbird(s-sp,BLACK);
LCD_TFT_DrawLine(205,s-sp,1,s-sp,BLACK);
Drawbird(s+sp,BLACK);
LCD_TFT_DrawLine(205,s+sp,1,s+sp,BLACK);
Drawbird(s,YELLOW);
}
3、敵機(jī)與獎勵的產(chǎn)生及移動 兩次利用隨機(jī)數(shù)函數(shù)rand()。對于某種顏色的敵機(jī),第一次產(chǎn)生一個0到1000隨機(jī)數(shù),將其與某數(shù)(sp0)比較以決定是否產(chǎn)生該顏色敵機(jī),改變sp0值即可改變敵機(jī)出現(xiàn)頻率;第二次產(chǎn)生一個14到305的隨機(jī)數(shù)以決定敵機(jī)出現(xiàn)的位置參考點(diǎn)y坐標(biāo)。獎勵的產(chǎn)生同樣如此。
敵機(jī)和獎勵的移動速度可由兩個參量改變,即時間間隔sp1及移動距離sp2。
如敵機(jī)向下移動的函數(shù)為:
- void moveenemy(i)
- {
- if(enemy[i]==1)
- {
- if(ttt[i] < sp1)
- {
- ttt[i]++;
- }
- else
- {
- t[i]=t[i]+sp2;
- Drawenemy(t[i]-sp2,r[i],BLACK);
- if(r[i]<500)
- {
- Drawenemy(t[i],r[i],enemycolor[i]);
- }
- ttt[i]=1;
- }
- }
- }
-
復(fù)制代碼
4、擊落敵機(jī)與獲得獎勵 通過比較敵機(jī)與我方戰(zhàn)機(jī)的相對位置來判斷是否擊落,擊落后將及時位置圖形描為背景色,并將各參數(shù)重置,由數(shù)組enemy[7]來標(biāo)志某顏色敵機(jī)是否存在于畫面,若不存在則允許產(chǎn)生。獎勵的獲得同上,其中加速效果通過改變sp達(dá)到,增加攻擊范圍效果通過addweapon()函數(shù)在畫面上呈現(xiàn),同時通過改變在判斷擊落時所用的參量range來達(dá)到改變攻擊范圍的效果。詳見程序附頁。
5、關(guān)卡升級 通過一系列參量數(shù)組以及判斷是否升級,然后通過增加sp0與sp2的值分別增加敵機(jī)出現(xiàn)頻率及敵機(jī)移動速度完成關(guān)卡升級。以下為關(guān)卡升級內(nèi)容的主要函數(shù),其中各個細(xì)節(jié)因關(guān)系到游戲難度,所以都是由我們多次測試所得到的。
- void levelup(i)
- {
- if(level[i]==0)
- {
- sp0=sp0+30;
- if(i==1||i==3||i==5||i==7||i==9||i==10||i==11||i==12||i==13||i==14)
- {
- sp2=sp2+3;
- buffspeed++;
- }
- if(i==12||i==13||i==14)
- {
- sp2=sp2+2;
- }
- if(i==3||i==7||i==9||i==12||i==13||i==14)
- {
- possibuff[2]=possibuff[2]+70;
- }
- level[i]=1;
- }
- }
-
復(fù)制代碼
6、施放大招 參考關(guān)于矩陣鍵盤的樣例程序“MatrixKeyboard_DigitalTube”,利用內(nèi)置函數(shù)判斷“1”鍵是否按下,爾后通過循環(huán)語句執(zhí)行函數(shù)kill(i)中部分指令來消滅所有敵機(jī),同時通過drawdazhao()函數(shù)在畫面上呈現(xiàn)。爾后借用簡單的循環(huán)語句完成大招冷卻時間倒計時。
詳見程序中dazhao()函數(shù)。
附頁(實驗程序代碼)