基于STMμCOSII貪吃蛇的設(shè)計_第1頁
基于STMμCOSII貪吃蛇的設(shè)計_第2頁
基于STMμCOSII貪吃蛇的設(shè)計_第3頁
基于STMμCOSII貪吃蛇的設(shè)計_第4頁
基于STMμCOSII貪吃蛇的設(shè)計_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、邯鄲學(xué)院課程設(shè)計題 目 基于STM32-C/OS-II貪吃蛇的設(shè)計學(xué) 生 20120441032028解斐 20120441032025朱利昭20120441032002徐雷指導(dǎo)教師 張志來 講師年 級 2012級專 業(yè) 電子信息工程二級學(xué)院 (系、部) 信息工程學(xué)院邯鄲學(xué)院信息工程學(xué)院(系、部)2015年7月基于STM32-C/OS-II貪吃蛇的設(shè)計摘要 進入新世紀(jì)的TFT液晶顯示屏的技術(shù)和產(chǎn)業(yè)都取得了長足的發(fā)展,作為重要的現(xiàn)代信息,發(fā)布媒體之一TFT液晶顯示屏在證券交易、金融、交通、體育、廣告等領(lǐng)域被廣泛的應(yīng)用。伴隨社會化信息的推進,TFT液晶屏技術(shù)也在不斷地推陳出新,應(yīng)用領(lǐng)域愈加廣泛。現(xiàn)

2、基于STM32的TFT液晶顯示可以更好的滿足各種需求,也更便于操作和實現(xiàn)?;赟TM32在TFT液晶屏幕上可顯示文本及圖形,包括漢字和時鐘顯示。 關(guān)鍵詞:TFT液晶顯示 STM32開發(fā)板 C/OS-II 貪吃蛇目 錄摘要1前言31 背景介紹31.1 選題背景31.2 MiniSTM32開發(fā)板介紹32 系統(tǒng)硬件設(shè)計42.1 開發(fā)板簡介42.2 LED 燈62.3 按鍵102.4 TFTLCD 模塊103 系統(tǒng)軟件設(shè)計143.1 LED驅(qū)動143.2 按鍵驅(qū)動143.3 TFT-LCD驅(qū)動163.4 貪吃蛇實現(xiàn)C語言代碼183.5 uC/OS-II軟件設(shè)計23結(jié)論27參考文獻28前言目前已有超過8

3、5的無線通信設(shè)備采用了ARM技術(shù),ARM以其高性能和低成本,在該領(lǐng)域的地位日益鞏固。ARM在此方面的應(yīng)用如:手提式計算機、移動電話、PDA等。  隨著寬帶技術(shù)的推廣,采用ARM技術(shù)的ADSL芯片正逐步獲得競爭優(yōu)勢。此外,ARM在語音及視頻處理上進行了優(yōu)化,并獲得廣泛支持。UC/OS-II由Micrium公司提供,是一個可移植、可固化的、可裁剪的、占先式多任務(wù)實時內(nèi)核,它適用于多種微處理器,微控制器和數(shù)字處理芯片(已經(jīng)移植到超過100種以上的微處理器應(yīng)用中)。同時,該系統(tǒng)源代碼開放、整潔、一致,注釋詳盡,適合系統(tǒng)開發(fā)。 UC/OS-II已經(jīng)通過聯(lián)邦航空局(FAA)商用航行器認(rèn)證,符合航

4、空無線電技術(shù)委員會(RTCA)DO-178B標(biāo)準(zhǔn)。   1 背景介紹1.1 選題背景隨著信息技術(shù)的飛速發(fā)展,形式多樣的數(shù)字化產(chǎn)品已經(jīng)開始成為繼PC機后的信息處理工具,在這種數(shù)字化潮流下,嵌入式系統(tǒng)已成為當(dāng)前研究和應(yīng)用的熱點之一,嵌入式手持設(shè)備的視圖多媒體應(yīng)用也越來越廣泛。由于嵌入式系統(tǒng)的應(yīng)用要求及成本因素決定了嵌入式系統(tǒng)在系統(tǒng)資源, 包括硬件資源和軟件資源方面都是非常精簡和高效的。1.2 MiniSTM32開發(fā)板介紹MiniSTM32 設(shè)計精良,結(jié)構(gòu)小巧!板子的設(shè)計充分考慮了成本與功能這兩個矛盾面,再結(jié)合實際使用的經(jīng)驗及 STM32 的特點,最終確定了這樣的設(shè)計。

5、STM32 的優(yōu)異性體現(xiàn)在如下幾個方面: 以 8 位機的價格,得到 32 位機,是 STM32 最大的優(yōu)勢。 STM32 擁有包括:FSMC、TIMER、SPI、IIC、USB、CAN、IIS、SDIO、ADC、DAC、RTC、DMA 等眾多外設(shè)及功能,具有極高的集成度。 STM32 僅 M3 內(nèi)核就擁有 F100、F101、F102、F103、F105、F107、F207、F217 等 8 個系列上百種型號,具有 QFN、LQFP、BGA 等封裝可供選擇。同時 STM32還推出了 STM32L 和 STM32W 等超低功耗和無線應(yīng)用型的 M3 芯片。 84 個中斷,16 級可編程優(yōu)先級,并且

6、所有的引腳都可以作為中斷輸入。STM32 各個外設(shè)都有自己的獨立時鐘開關(guān),可以通過關(guān)閉相應(yīng)外設(shè)的時鐘來降低功耗。STM32 的開發(fā)不需要昂貴的仿真器,只需要一個串口即可下載代碼,并且支持 SWD 和 JTAG 兩種調(diào)試口。SWD 調(diào)試可以為你的設(shè)計帶來跟多的方便,只需要 2 個 IO 口,即可實現(xiàn)仿真調(diào)試。2 系統(tǒng)硬件設(shè)計2.1 開發(fā)板簡介ALIENTEK MiniSTM32 開發(fā)板是一款迷你型的 STM32F103 開發(fā)板,小巧而不小氣,簡約而不簡單。該開發(fā)板自推出以來,深得廣大 STM32 學(xué)習(xí)者喜愛,總銷量超過 1.6W 套。目前最新版本為 V3.0,最新 MiniSTM32 開發(fā)板資源

7、圖如圖 所示:ALIENTEK MiniSTM32開發(fā)板板載資源如下: CPU:STM32F103RBT6,LQFP64,F(xiàn)LASH:128K,SRAM:20K; 1個標(biāo)準(zhǔn)的JTAG/SWD調(diào)試下載口 1個電源指示燈(藍(lán)色) 2個狀態(tài)指示燈(DS0:紅色,DS1:綠色) 1個紅外接收頭,配備一款小巧的紅外遙控器 1個IIC接口的EEPROM芯片,24C02,容量256字節(jié) 1個SPI FLASH芯片,W25X16,容量為2M字節(jié) 1個DS18B20/DS1820溫度傳感器預(yù)留接口 1個標(biāo)準(zhǔn)的2.4/2.8寸LCD接口,支持觸摸屏 1個OLED模塊接口 1個USB串口,可用于程序下載和代碼調(diào)試

8、1個USB SLAVE接口,用于USB通信 1個SD卡接口 1個PS/2接口,可外接鼠標(biāo)、鍵盤 1組5V電源供應(yīng)/接入口 1組3.3V電源供應(yīng)/接入口 1個啟動模式選擇配置接口 2個2.4G無線通信接口(24L01和JF24C) 1個RTC后備電池座,并帶電池 1個復(fù)位按鈕,可用于復(fù)位MCU和LCD 3個功能按鈕,其中WK_UP兼具喚醒功能 1個電源開關(guān),控制整個板的電源 3.3V與5V電源TVS保護,有效防止燒壞芯片。 獨創(chuàng)的一鍵下載功能 除晶振占用的IO口外,其余所有IO口全部引出,其中GPIOA和GPIOB按順序引出,整個板子尺寸為 8cm*10cm*2cm板上除晶振外的所有的 IO 口

9、全部引出,特別還有 GPIOA 和 GPIOB 的 IO 口是按順序引出的,可以極大的方便大家擴展及使用,另外板載獨特的一鍵下載功能,避免了頻繁設(shè)置 B0、B1 帶來的麻煩,直接在電腦上一鍵下載。 板載十多種外設(shè)及接口,可以充分挖掘 STM32 的潛質(zhì)。沉金 PCB+全新優(yōu)質(zhì)元器件+定制全銅鍍金排針/排座+電源 TVS 保護,堅若磐石。各個接口都有絲印標(biāo)注,使用起來一目了然;接口位置設(shè)計安排合理,方便順手。資源搭配合理,物盡其用。2.2 LED 燈 ALIENTEK MiniSTM32開發(fā)板板載了2個LED,DS0和DS1, STM32的IO口可以由軟件配置成8種模式:1、輸入浮空2、輸入上拉

10、3、輸入下拉4、模擬輸入5、開漏輸出6、推挽輸出7、推挽式復(fù)用功能8、開漏復(fù)用功能每個IO口可以自由編程,單IO口寄存器必須要按32位字被訪問。STM32的很多IO口都是5V兼容的,這些IO口在與5V電平的外設(shè)連接的時候很有優(yōu)勢,具體哪些IO口是5V兼容的,可以從該芯片的數(shù)據(jù)手冊管腳描述章節(jié)查到(I/O Level標(biāo)FT的就是5V電平兼容的)。STM32的每個IO端口都有7個寄存器來控制。他們分別是:配置模式的2個32位的端口配置寄存器CRL和CRH;2個32位的數(shù)據(jù)寄存器IDR和ODR;1個32位的置位/復(fù)位寄存器BSRR;一個16位的復(fù)位寄存器BRR;1個32位的鎖存寄存器LCKR;這里我

11、們僅介紹常用的幾個寄存器,我們常用的IO端口寄存器只有4個:CRL、CRH、IDR、ODR。CRL和CRH控制著每個IO口的模式及輸出速率。端口低配置寄存器CRL的描述,如下圖所示:該寄存器的復(fù)位值為0X4444 4444,從上圖可以看到,復(fù)位值其實就是配置端口為浮空輸入模式。從上圖還可以得出:STM32的CRL控制著每個IO端口(AG)的低8位的模式。每個IO端口的位占用CRL的4個位,高兩位為CNF,低兩位為MODE。這里我們可以記住幾個常用的配置,比如0X0表示模擬輸入模式(ADC用)、0X3表示推挽輸出模式(做輸出口用,50M速率)、0X8表示上/下拉輸入模式(做輸入口用)、0XB表示

12、復(fù)用輸出(使用IO口的第二功能,50M速率)。CRH的作用和CRL完全一樣,只是CRL控制的是低8位輸出口,而CRH控制的是高8位輸出口。IDR是一個端口輸入數(shù)據(jù)寄存器,只用了低16位。該寄存器為只讀寄存器,并且只能以16位的形式讀出。該寄存器各位的描述如下圖所示:要想知道某個IO口的狀態(tài),你只要讀這個寄存器,再看某個位的狀態(tài)就可以了。ODR是一個端口輸出數(shù)據(jù)寄存器,也只用了低16位。該寄存器為可讀寫,從該寄存器讀出來的數(shù)據(jù)可以用于判斷當(dāng)前IO口的輸出狀態(tài)。而向該寄存器寫數(shù)據(jù),則可以控制某個IO口的輸出電平。該寄存器的各位描述如下圖所示:ALIENTEK MiniSTM32開發(fā)板板載的LED硬

13、件連接:2.3 按鍵 ALIENTEK MiniSTM32 開發(fā)板總共有 3 個按鍵,其原理圖如下: KEY0 和 KEY1 用作普通按鍵輸入,分別連接在 PC5 和 PA15 上,其中 PA15 和 JTDI 共用了,所以,在使用 KEY0 和 KEY1 的時候,就不能使用 JTAG 來調(diào)試了,但是可以用 SWD 調(diào)試,這點在使用的時候要注意。KEY0 和 KEY1 還和 PS/2 的 DAT 和 CLK 線共用。 WK_UP 按鍵連接到 PA0(STM32 的 WKUP 引腳),它除了可以用作普通輸入按鍵外,還可以用作 STM32 的喚醒輸入。該按鍵是高電平觸發(fā)的。由于 PA0 還是 DS

14、18B20 的輸入引腳,而18B20 是有上拉電阻的,所以在使用 WK_UP 按鍵的時候,請一定要斷開 PA0 和 DS18B20 的跳線帽。2.4 TFTLCD 模塊 TFT-LCD即薄膜晶體管液晶顯示器。其英文全稱為:Thin Film Transistor-Liquid Crystal Display。TFT-LCD與無源TN-LCD、STN-LCD的簡單矩陣不同,它在液晶顯示屏的每一個象素上都設(shè)置有一個薄膜晶體管(TFT),可有效地克服非選通時的串?dāng)_,使顯示液晶屏的靜態(tài)特性與掃描線數(shù)無關(guān),因此大大提高了圖像質(zhì)量。TFT-LCD也被叫做真彩液晶顯示器。該模塊有如下特點:1,2.4/2.8

15、兩種大小的屏幕可選。2,320×240的分辨率。3,16位真彩顯示。4,自帶觸摸屏,可以用來作為控制輸入。5,通用的接口,除了ALIENTEK MiniSTM32開發(fā)板,該液晶模塊還可以使用在優(yōu)異特、STMSKY、紅牛等開發(fā)板上。ALIENTEK MiniSTM32開發(fā)板的該模塊采用的是顯尚光電的DST2001PH TFTLCD,DST2001PH的控制器為ILI9320,采用26萬色的TFTLCD屏,分辨率為320×240,采用16位的80并口。CS:TFTLCD片選信號。WR:向TFTLCD寫入數(shù)據(jù)。RD:從TFTLCD讀取數(shù)據(jù)。D15:0:16位雙向數(shù)據(jù)線。RST:硬

16、復(fù)位TFTLCD。RS:命令/數(shù)據(jù)標(biāo)志(0,讀寫命令;1,讀寫數(shù)據(jù))。80并口在上一節(jié)我們已經(jīng)有詳細(xì)的介紹了,這里我們就不在介紹,需要說明的是,TFTLCD模塊的RST信號線和OLED模塊一樣,也是直接接到STM32的復(fù)位腳上,并不由軟件控制,這樣可以省下來一個IO口。另外我們還需要一個背光控制線來控制TFTLCD的背光。所以,我們總共需要的IO口數(shù)目為21個。模塊的控制器為ILI9320(可能為其他型號,但是他們的設(shè)置很相似,除了初始化序列有些區(qū)別,其他大都是一摸一樣的,這里僅以9320為例介紹),該控制器自帶顯存,其顯存總大小為172820(240*320*18/8),即18位模式(26萬

17、色)下的顯存量。模塊的16位數(shù)據(jù)線與顯寸的對應(yīng)關(guān)系為565方式,如下圖所示:最低5位代表藍(lán)色,中間6位為綠色,最高5位為紅色。數(shù)值越大,表示該顏色越深。接下來,我們介紹一下ILI9320的幾個重要命令,因為ILI9320的命令很多,我們這里不可能一一介紹,有興趣的大家可以找到ILI9320的datasheet看看。里面對這些命令有詳細(xì)的介紹。這里我們要介紹的命令列表如下:這個命令,有兩個功能,如果對它寫,則最低位為OSC,用于開啟或關(guān)閉振蕩器。而如果對它讀操作,則返回的是控制器的型號。這個命令最大的功能就是通過讀它可以得到控制器的型號,而我們代碼在知道了控制器的型號之后,可以針對不同型號的控制

18、器,進行不同的初始化。因為93xx系列的初始化,其實都比較類似,我們完全可以用一個代碼兼容好幾個控制器。R3,入口模式命令。我們重點關(guān)注的是I/D0、I/D1、AM這3個位,因為這3個位控制了屏幕的顯示方向。AM:控制GRAM更新方向。當(dāng)AM=0的時候,地址以行方向更新。當(dāng)AM=1的時候,地址以列方向更新。I/D1:0:當(dāng)更新了一個數(shù)據(jù)之后,根據(jù)這兩個位的設(shè)置來控制地址計數(shù)器自動增加/減少1,其關(guān)系如下圖:通過這幾個位的設(shè)置,我們就可以控制屏幕的顯示方向了。R7,顯示控制命令。該命令CL位用來控制是8位彩色,還是26萬色。為0時26萬色,為1時八位色。D1、D0、BASEE這三個位用來控制顯示

19、開關(guān)與否的。當(dāng)全部設(shè)置為1的時候開啟顯示,全0是關(guān)閉。我們一般通過該命令的設(shè)置來開啟或關(guān)閉顯示器,以降低功耗。R32,R33,設(shè)置GRAM的行地址和列地址。R32用于設(shè)置列地址(X坐標(biāo),0239),R33用于設(shè)置行地址(Y坐標(biāo),0319)。當(dāng)我們要在某個指定點寫入一個顏色的時候,先通過這兩個命令設(shè)置到改點,然后寫入顏色值就可以了。R34,寫數(shù)據(jù)到GRAM命令,當(dāng)寫入了這個命令之后,地址計數(shù)器才會自動的增加和減少。該命令是我們要介紹的這一組命令里面唯一的單個操作的命令,只需要寫入該值就可以了,其他的都是要先寫入命令編號,然后寫入操作數(shù)。R80R83,行列GRAM地址位置設(shè)置。這幾個命令用于設(shè)定你

20、顯示區(qū)域的大小,我們整個屏的大小為240*320,但是有時候我們只需要在其中的一部分區(qū)域?qū)懭霐?shù)據(jù),如果用先寫坐標(biāo),后寫數(shù)據(jù)這樣的方式來實現(xiàn),則速度大打折扣。此時我們就可以通過這幾個命令,在其中開辟一個區(qū)域,然后不停的丟數(shù)據(jù),地址計數(shù)器就會根據(jù)R3的設(shè)置自動增加/減少,這樣就不需要頻繁的寫地址了,大大提高了刷新的速度。3 系統(tǒng)軟件設(shè)計3.1 LED驅(qū)動/初始化PA8和PD2為輸出口.并使能這兩個口的時鐘 /LED IO初始化void LED_Init(void)RCC->APB2ENR|=1<<2; /使能PORTA時鐘 RCC->APB2ENR|=1<<5;

21、 /使能PORTD時鐘GPIOA->CRH&=0XFFFFFFF0; GPIOA->CRH|=0X00000003;/PA8 推挽輸出 GPIOA->ODR|=1<<8; /PA8 輸出高 GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=0X00000300;/PD.2推挽輸出GPIOD->ODR|=1<<2; /PD.2輸出高 3.2 按鍵驅(qū)動/按鍵初始化函數(shù)/特別注意:在該函數(shù)之后,JTAG將無法使用(SWD也無法使用)/如果想JTAG仿真,可以屏蔽該函數(shù)。/PA0.13.15 設(shè)置成輸入vo

22、id KEY_Init(void)RCC->APB2ENR|=1<<2; /使能PORTA時鐘GPIOA->CRL&=0XFFFFFFF0;/PA0設(shè)置成輸入 GPIOA->CRL|=0X00000008; GPIOA->CRH&=0X0F0FFFFF;/PA13,15設(shè)置成輸入 GPIOA->CRH|=0X80800000; GPIOA->ODR|=1<<13; /PA13上拉,PA0默認(rèn)下拉GPIOA->ODR|=1<<15; /PA15上拉 /按鍵處理函數(shù)/返回按鍵值/0,沒有任何按鍵按下/1,

23、KEY0按下/2,KEY1按下/3,KEY2按下 WK_UP/注意此函數(shù)有響應(yīng)優(yōu)先級,KEY0>KEY1>KEY2!u8 KEY_Scan(void) static u8 key_up=1;/按鍵按松開標(biāo)志JTAG_Set(JTAG_SWD_DISABLE);if(key_up&&(KEY0=0|KEY1=0|KEY2=1)/delay_ms(10);/去抖動 key_up=0;if(KEY0=0)JTAG_Set(SWD_ENABLE);return 1;else if(KEY1=0)JTAG_Set(SWD_ENABLE);return 2;else if(KE

24、Y2=1)JTAG_Set(SWD_ENABLE);return 3;else if(KEY0=1&&KEY1=1&&KEY2=0)key_up=1; JTAG_Set(SWD_ENABLE);return 0;/ 無按鍵按下3.3 TFT-LCD驅(qū)動/畫筆顏色#define WHITE 0xFFFF#define BLACK 0x0000 #define BLUE 0x001F #define BRED 0XF81F#define GRED 0XFFE0#define GBLUE 0X07FF#define RED 0xF800#define MAGENTA

25、0xF81F#define GREEN 0x07E0#define CYAN 0x7FFF#define YELLOW 0xFFE0#define BROWN 0XBC40 /棕色#define BRRED 0XFC07 /棕紅色#define GRAY 0X8430 /灰色/GUI顏色#define DARKBLUE 0X01CF/深藍(lán)色#define LIGHTBLUE 0X7D7C/淺藍(lán)色 #define GRAYBLUE 0X5458 /灰藍(lán)色/以上三色為PANEL的顏色 #define LIGHTGREEN 0X841F /淺綠色/#define LIGHTGRAY 0XEF5B /

26、淺灰色(PANNEL)#define LGRAY 0XC618 /淺灰色(PANNEL),窗體背景色#define LGRAYBLUE 0XA651 /淺灰藍(lán)色(中間層顏色)#define LBBLUE 0X2B12 /淺棕藍(lán)色(選擇條目的反色) extern u16 BACK_COLOR, POINT_COLOR ; void LCD_Init(void);void LCD_DisplayOn(void);void LCD_DisplayOff(void);void LCD_Clear(u16 Color); void LCD_SetCursor(u16 Xpos, u16 Ypos);vo

27、id LCD_Scan_Dir(u8 dir);void LCD_DrawPoint(u16 x,u16 y);/畫點u16 LCD_ReadPoint(u16 x,u16 y); /讀點void Draw_Circle(u16 x0,u16 y0,u8 r);void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2); void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color);void LCD_S

28、howChar(u16 x,u16 y,u8 num,u8 size,u8 mode);/顯示一個字符void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size); /顯示一個數(shù)字void LCD_Show2Num(u16 x,u16 y,u16 num,u8 len,u8 size,u8 mode);/顯示2個數(shù)字void LCD_ShowString(u16 x,u16 y,const u8 *p); /顯示一個字符串,16字體u16 LCD_RD_DATA(void);/讀取LCD數(shù)據(jù) void LCD_WriteReg(u8 LCD_Reg,

29、 u16 LCD_RegValue);u16 LCD_ReadReg(u8 LCD_Reg);void LCD_WriteRAM_Prepare(void);void LCD_WriteRAM(u16 RGB_Code);u16 LCD_ReadRAM(void); u16 LCD_BGR2RGB(u16 c);3.4 貪吃蛇實現(xiàn)C語言代碼#include "snake.h"#include "lcd.h"#include "key.h"extern u8 key_value;u8 key_temp;extern int dir_x,

30、dir_y;#define SNAKE_MAX_LONG 10 /最大長度10struct u8 XSNAKE_MAX_LONG; u8 YSNAKE_MAX_LONG; u8 Long; u8 Life; u8 Score; u8 Level;Snake; /蛇結(jié)構(gòu)體struct u8 X;u8 Y;u8 Yes;Food; /食物結(jié)構(gòu)體/繪制小方塊,8*8void Turn_Off(u8 x,u8 y) LCD_Fill(x*8),(y*8),(x*8+8),(y*8+8),BLACK); /8*8小矩形void Turn_On(u8 x,u8 y) LCD_Fill(x*8),(y*8)

31、,(x*8+8),(y*8+8),RED); /8*8小矩形/初始化貪吃蛇void Snake_Init(void) u8 i; /*初始化蛇參數(shù)*/Snake.Long=2; /定義初始化蛇的長度Snake.Life=0; /初始化蛇還活著Snake.Score=0;Food.Yes=1;/放食物標(biāo)志for(i=0;i<Snake.Long;i+)/初始化蛇的位置Snake.Xi=i+14;Snake.Yi=7;for(i=0;i<Snake.Long;i+)/將蛇畫出來Turn_On(Snake.Xi,Snake.Yi);void Snake_Move(int dir_x,in

32、t dir_y) /移動蛇 u8 i;Turn_Off(Snake.X0,Snake.Y0); /向上for(i=0;i<Snake.Long-1;i+) /初始化蛇的位置 /向右 1 0Snake.Xi=Snake.Xi+1; /向左 01Snake.Yi=Snake.Yi+1; /向下 -1 0 /向上 0 -1Snake.XSnake.Long-1=Snake.XSnake.Long-2+dir_x; Snake.YSnake.Long-1=Snake.YSnake.Long-2+dir_y; /蛇頭向你要求的方向移動for(i=0;i<Snake.Long;i+) /將蛇畫

33、出來Turn_On(Snake.Xi,Snake.Yi);void Food_Place(u8 Food_x,u8 Food_y) /放食物 Food.X=Food_x; Food.Y=Food_y; Turn_On(Food.X,Food.Y);void Run_Snake(void) /游戲運行 u8 i; Snake_Move(dir_x,dir_y); /判斷是否吃到食物,若吃到長度加1,而且再放一個 if(Snake.XSnake.Long-1=Food.X)&&(Snake.YSnake.Long-1=Food.Y) Snake.Long+;Snake.XSnake

34、.Long-1=Food.X;Snake.YSnake.Long-1=Food.Y;Food.X=0;Food.Y=0;Snake.Score+=1;Food.Yes= 1; /吃完一個后,再放一個食物L(fēng)CD_ShowNum(50,300,(u32)Snake.Score,4,16);/顯示分?jǐn)?shù) if(Food.Yes=0) Food_Place(Food.X,Food.Y);/放食物 if(Food.Yes=1)/獲得隨機食物坐標(biāo) while(1)Food.X=rand()%28+1;Food.Y=rand()%28+1;for(i=0;i<Snake.Long;i+)/將蛇畫出來 i

35、f(Snake.XSnake.Long=Food.X)&&(Snake.YSnake.Long=Food.Y) break; /如果放的食物和蛇身重合則跳出來,不放食物 Food.Yes=0;break; for(i=0;i<Snake.Long;i+)/將蛇畫出來 if(Snake.Xi=Snake.XSnake.Long&&Snake.Yi=Snake.YSnake.Long) Game_Over(); /蛇頭碰到蛇身,游戲結(jié)束 if(Snake.XSnake.Long-1<=0)|(Snake.XSnake.Long-1>=30)|(Sn

36、ake.YSnake.Long-1<=0)|(Snake.YSnake.Long-1>=33) Game_Over(); /delay_ms(300);void Game_Start(void)/u8 i;POINT_COLOR=WHITE;/畫筆顏色BACK_COLOR=BLACK; /背景色 /*繪制游戲界面*/LCD_Fill(0,0,8,280,DARKBLUE);/Rectangle(8,8-1,85,120,0xaa);/繪制一個矩形框, 0-127LCD_Fill(232,0,240,280,DARKBLUE);/LCD_Fill(0,0,240,8,DARKBLUE

37、);/LCD_Fill(0,272,240,280,DARKBLUE);/ LCD_ShowString(20,300,"Score");/Show ScoreLCD_ShowString(150,300,"LEVEL");/Show LevelLCD_ShowNum(50,300,(u32)Snake.Score,4,16);/顯示分?jǐn)?shù)LCD_ShowNum(180,300,(u32)Snake.Level,4,16);void Game_Over(void)LCD_Clear(BLACK);LCD_ShowString(60,150,"GA

38、ME OVER! ");LCD_ShowString(25,170,"PRESS ENTER TO RESTART");LCD_ShowString(60,190,"SCORE:");LCD_ShowNum(100,190,(u32)Snake.Score,4,16);/顯示分?jǐn)?shù)while(1);/Game_Start(); /Snake_Init();3.5 uC/OS-II軟件設(shè)計uC/OS II(Micro Control Operation System Two)是一個可以基于ROM運行的、可裁減的、搶占式、實時多任務(wù)內(nèi)核,具有高度可移

39、植性,特別適合于微處理器和控制器,適合很多商業(yè)操作系統(tǒng)性能相當(dāng)?shù)膶崟r操作系統(tǒng)(RTOS)。為了提供最好的移植性能,uC/OS II最大程度上使用ANSI C語言進行開發(fā),并且已經(jīng)移植到近40多種處理器體系上,涵蓋了從8位到64位各種CPU(包括DSP)。 uC/OS II可以簡單的視為一個多任務(wù)調(diào)度器,在這個任務(wù)調(diào)度器之上完善并添加了和多任務(wù)操作系統(tǒng)相關(guān)的系統(tǒng)服務(wù),如信號量、郵箱等。其主要特點有公開源代碼,代碼結(jié)構(gòu)清晰、明了,注釋詳盡,組織有條理,可移植性好,可裁剪,可固化。內(nèi)核屬于搶占式,最多可以管理60個任務(wù)。從1992年開始,由于高度可靠性、移植性和安全性,uC/OS II已經(jīng)廣泛使用在

40、從照相機到航空電子產(chǎn)品的各種應(yīng)用中。C/OS-II可以大致分成核心、任務(wù)處理、時間處理、任務(wù)同步與通信,CPU的移植等5個部分。(1) 核心部分(OSCore.c) 是操作系統(tǒng)的處理核心,包括操作系統(tǒng)初始化、操作系統(tǒng)運行、中斷進出的前導(dǎo)、時鐘節(jié)拍、任務(wù)調(diào)度、事件處理等多部分。能夠維持系統(tǒng)基本工作的部分都在這里。(2) 任務(wù)處理部分(OSTask.c) 任務(wù)處理部分中的內(nèi)容都是與任務(wù)的操作密切相關(guān)的。包括任務(wù)的建立、刪除、掛起、恢復(fù)等等。因為C/OS-II是以任務(wù)為基本單位調(diào)度的,所以這部分內(nèi)容也相當(dāng)重要。(3) 時鐘部分(OSTime.c) C/OS-II中的最小時鐘單位是timetick(時

41、鐘節(jié)拍)。任務(wù)延時等操作是在這里完成的。(4) 任務(wù)同步和通信部分 為事件處理部分,包括信號量、郵箱、消息隊列、事件標(biāo)志等部分;主要用于任務(wù)間的互相聯(lián)系和對臨界資源的訪問。(5) 與CPU的接口部分 是指C/OS-II針對所使用的CPU的移植部分。由于C/OS-II是一個通用性的操作系統(tǒng),所以對于關(guān)鍵問題上的實現(xiàn),還是需要根據(jù)具體CPU的具體內(nèi)容和要求作相應(yīng)的移植。這部分內(nèi)容由于牽涉到SP等系統(tǒng)指針,所以通常用匯編語言編寫。主要包括中斷級任務(wù)切換的底層實現(xiàn)、任務(wù)級任務(wù)切換的底層實現(xiàn)、時鐘節(jié)拍的產(chǎn)生和處理、中斷的相關(guān)處理部分等內(nèi)容。uC/OS-II 采用的是可剝奪型實時多任務(wù)內(nèi)核??蓜儕Z型的實時

42、內(nèi)核在任何時候都運行就緒了的最高優(yōu)先級的任務(wù)。 uC/os-II的任務(wù)調(diào)度是完全基于任務(wù)優(yōu)先級的搶占式調(diào)度,也就是最高優(yōu)先級的任務(wù)一旦處于就緒狀態(tài),則立即搶占正在運行的低優(yōu)先級任務(wù)的處理器資源。為了簡化系統(tǒng)設(shè)計,uC/OS-II規(guī)定所有任務(wù)的優(yōu)先級不同,因而任務(wù)的優(yōu)先級也同時唯一標(biāo)志了該任務(wù)本身。uC/OS-II 中最多可以支持64 個任務(wù),分別對應(yīng)優(yōu)先級063,其中0 為最高優(yōu)先級。63為最低級,系統(tǒng)保留了4個最高優(yōu)先級的任務(wù)和4個最低優(yōu)先級的任務(wù),所有用戶可以使用的任務(wù)數(shù)有56個。 uC/OS-II提供了任務(wù)管理的各種函數(shù)調(diào)用,包括創(chuàng)建任務(wù),刪除任務(wù),改變?nèi)蝿?wù)的優(yōu)先級,任務(wù)掛起和恢復(fù)等。

43、系統(tǒng)初始化時會自動產(chǎn)生兩個任務(wù):一個是空閑任務(wù),它的優(yōu)先級最低,該任務(wù)僅給一個整型變量做累加運算;另一個是統(tǒng)計任務(wù),它的優(yōu)先級為次低,該任務(wù)負(fù)責(zé)統(tǒng)計當(dāng)前cpu的利用率。uC/OS-II的時間管理是通過定時中斷來實現(xiàn)的,該定時中斷一般為10毫秒或100毫秒發(fā)生一次,時間頻率取決于用戶對硬件系統(tǒng)的定時器編程來實現(xiàn)。中斷發(fā)生的時間間隔是固定不變的,該中斷也成為一個時鐘節(jié)拍。 uC/OS-II要求用戶在定時中斷的服務(wù)程序中,調(diào)用系統(tǒng)提供的與時鐘節(jié)拍相關(guān)的系統(tǒng)函數(shù),例如中斷級的任務(wù)切換函數(shù),系統(tǒng)時間函數(shù)。對一個多任務(wù)的操作系統(tǒng)來說,任務(wù)間的通信和同步是必不可少的。uC/OS-II中提供了4種同步對象,分

44、別是信號量,郵箱,消息隊列和事件。所有這些同步對象都有創(chuàng)建,等待,發(fā)送,查詢的接口用于實現(xiàn)進程間的通信和同步。uC/OS-II部分代碼:任務(wù)的初始化和開始任務(wù)的創(chuàng)建:OSInit(); /系統(tǒng)初始化OSTaskCreate( TaskStart,/task pointer(void *)0,/parameter(OS_STK *)&TASK_START_STKSTART_STK_SIZE-1,/task stack top pointerSTART_TASK_Prio );/task priorityOSStart(); 配置和任務(wù)創(chuàng)建函數(shù):/開始任務(wù)void TaskStart(vo

45、id * pdata)pdata = pdata; OS_ENTER_CRITICAL(); OSTaskCreate(TaskSnake, (void * )0, (OS_STK *)&TASK_SNAKE_STKSNAKE_STK_SIZE-1, SNAKE_TASK_Prio);OSTaskCreate(TaskKey, (void * )0, (OS_STK *)&TASK_KEY_STKKEY_STK_SIZE-1, KEY_TASK_Prio);OSTaskSuspend(START_TASK_Prio);/suspend but not deleteOS_EXIT

46、_CRITICAL();/任務(wù)1/貪吃蛇運動.void TaskSnake(void *pdata)while(1) /OSTimeDlyHMSM(0,0,0,1300);Run_Snake();/運行貪吃蛇程序OSTimeDlyHMSM(0,0,0,300);/任務(wù)2/按鍵檢測,判斷方向 void TaskKey(void *pdata) u8 key=0; while(1) key=KEY_Scan(); /獲取按鍵值 switch(key) /判斷蛇運動的方向 case 1: dir_x=1; dir_y=0; break; case 2: dir_x=0; dir_y=1; break

47、;case 3: dir_x=-1;dir_y=0; break;default: break; OSTimeDlyHMSM(0,0,0,20); /系統(tǒng)時鐘中斷服務(wù)函數(shù)void SysTick_Handler(void)OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */ OSIntNesting+; OS_EXIT_CRITICAL(); OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */ OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */系統(tǒng)時鐘配置,設(shè)計1ms產(chǎn)生一次中斷void SysTick_Configuration(void) SysTick->CTRL&=(1<<2)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論