




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、學(xué)院_ 信息與電氣工程學(xué)院_專業(yè):軟件工程 班級:軟工1301、1302 本專 學(xué)號姓名 密封線 學(xué)生須將文字寫在此線以下魯東大學(xué)信息與電氣工程學(xué)院2015 2016 學(xué)年第-2-學(xué)期 嵌入式操作系統(tǒng) 課程設(shè)計(jì)報(bào)告課程號: 220152240 任課教師 賈世祥 成績 課程設(shè)計(jì)題目:基于C/OS II的嵌入式應(yīng)用程序開發(fā) 在UP-NETARM2410-S嵌入式開發(fā)平臺上實(shí)現(xiàn)一個類似于貪吃蛇的游戲程序,要求具有LCD顯示,能夠通過觸摸屏或鍵盤交互。課程設(shè)計(jì)及設(shè)計(jì)報(bào)告要求:(對論文題目、內(nèi)容、行文、字?jǐn)?shù)等作出判分規(guī)定。)1. 對于用到的C/OS函數(shù)的功能給出解釋;2. 給出詳細(xì)的任務(wù)設(shè)計(jì),包括每個任
2、務(wù)的功能、優(yōu)先級已經(jīng)任務(wù)間的通信等;3. 對關(guān)鍵代碼給出詳細(xì)的注釋;4. 設(shè)計(jì)報(bào)告格式參考學(xué)院學(xué)士畢業(yè)論文要求,要有題目、摘要、關(guān)鍵字、正文、參考文獻(xiàn)。5. 正文每一部分必須有章節(jié)編號,涉及到的圖表字跡清晰,圖使用visio或word繪制,公式使用公式編輯器編輯。6. 字?jǐn)?shù)不少于4000字。語言流暢,與參考文獻(xiàn)的重復(fù)率不得超過30%。7. 設(shè)計(jì)報(bào)告使用B4紙打印,正文的圖表可黑白打印。教師評語: 教師簽字: 年 月 日并編寫實(shí)現(xiàn)能在LCD顯示該游戲,且能通過鍵盤控制游戲,并最終通過硬件平臺調(diào)試并成功顯示、運(yùn)行。關(guān)鍵詞:引言 在后PC時(shí)代,嵌入式的發(fā)展逐漸取代PC成為時(shí)代主流,無論從生活領(lǐng)域、工
3、業(yè)控制領(lǐng)域、軍事領(lǐng)域、航空航天領(lǐng)域都有很好的發(fā)展前景。在硬件技術(shù)、軟件技術(shù)以及網(wǎng)絡(luò)信息技術(shù)日益成熟的今天,嵌入式突出了強(qiáng)大的優(yōu)勢?,F(xiàn)在嵌入式實(shí)時(shí)系統(tǒng)已經(jīng)在通信網(wǎng)絡(luò)、自動控制、信息家電、國防等領(lǐng)域得到了越來越廣泛的應(yīng)用,其中嵌入式實(shí)時(shí)操作系統(tǒng)是整個嵌入式實(shí)時(shí)系統(tǒng)的核心。而在嵌入式系統(tǒng)設(shè)計(jì)中選用嵌入式實(shí)時(shí)操作系統(tǒng)有很多好處,尤其對于源代碼開放的嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-II而言,其擁有高度的可移植性、可裁剪性,出色的實(shí)時(shí)性、穩(wěn)定性。同樣,基于ARM體系結(jié)構(gòu)的32位微處理器也在嵌入式領(lǐng)域獲得了廣泛的應(yīng)用。一、C/OS-II介紹1.uC/OS-II簡介uC/OS-II是一種基于優(yōu)先級的可搶先的硬實(shí)
4、時(shí)內(nèi)核。自從92年發(fā)布以來,在世界各地都獲得了廣泛的應(yīng)用,它是一種專門為嵌入式設(shè)備設(shè)計(jì)的內(nèi)核,目前已經(jīng)被移植到40多種不同結(jié)構(gòu)的CPU上,運(yùn)行在從8位到64位的各種系統(tǒng)之上。尤其值得一提的是,該系統(tǒng)自從2.51版本之后,就通過了美國FAA認(rèn)證,可以運(yùn)行在諸如航天器等對安全要求極為苛刻的系統(tǒng)之上。鑒于uC/OS-II可以免費(fèi)獲得代碼,對于嵌入式RTOS而言,選擇uC/OS無疑是最經(jīng)濟(jì)的選擇。2.uC/OS-II應(yīng)用程序基本結(jié)構(gòu)應(yīng)用uC/OS-II,自然要為它開發(fā)應(yīng)用程序,下面論述基于uC/OS-II的應(yīng)用程序的基本結(jié)構(gòu)以及注意事項(xiàng)。每一個uC/OS-II應(yīng)用至少要有一個任務(wù)。而每一個任務(wù)必須被寫
5、成無限循環(huán)的形式。以下是推薦的結(jié)構(gòu):Void task ( void* pdata ) INT8U err; InitTimer(); / 可選 For( ; ) / 你的應(yīng)用程序代碼 var script = document.createElement('script'); script.src = ' document.body.appendChild(script); OSTimeDly(1); / 可選 以上就是基本結(jié)構(gòu)。因?yàn)橄到y(tǒng)會為每一個任務(wù)保留一個堆??臻g,由系統(tǒng)在任務(wù)切換的時(shí)候換恢復(fù)上下文,并執(zhí)行一條reti指令返回。如果允許任務(wù)執(zhí)行到最后一個花括號(那
6、一般都意味著一條ret指令)的話,很可能會破壞系統(tǒng)堆棧空間從而使應(yīng)用程序的執(zhí)行不確定。所以,每一個任務(wù)必須被寫成無限循環(huán)的形式。自己的任務(wù)是會放棄CPU使用權(quán)的,而不管是系統(tǒng)強(qiáng)制(通過ISR)還是主動放棄(通過調(diào)用OS API)。上面程序中的InitTimer()函數(shù),這個函數(shù)應(yīng)該由系統(tǒng)提供,程序員有義務(wù)在優(yōu)先級最高的任務(wù)內(nèi)調(diào)用它而且不能在for循環(huán)內(nèi)調(diào)用。注意,這個函數(shù)是和所使用的CPU相關(guān)的,每種系統(tǒng)都有自己的Timer初始化程序。在uC/OS-II的幫助手冊內(nèi),作者特地強(qiáng)調(diào)絕對不能在OSInit()或者OSStart()內(nèi)調(diào)用Timer初始化程序,那會破壞系統(tǒng)的可移植性同時(shí)帶來性能上的損
7、失。所以,一個折中的辦法就是象上面這樣,在優(yōu)先級最高的程序內(nèi)調(diào)用,這樣可以保證當(dāng)OSStart()調(diào)用系統(tǒng)內(nèi)部函數(shù)OSStartHighRdy()開始多任務(wù)后,首先執(zhí)行的就是Timer初始化程序?;蛘邔iT開一個優(yōu)先級最高的任務(wù),只做一件事情,那就是執(zhí)行Timer初始化,之后通過調(diào)用OSTaskSuspend()將自己掛起來,永遠(yuǎn)不再執(zhí)行。不過這樣會浪費(fèi)一個TCB空間。對于那些RAM吃緊的系統(tǒng)來說,還是不用為好。3. 特點(diǎn)C/OS-II是一個可裁剪、源碼開放、結(jié)構(gòu)小巧、搶占式的實(shí)時(shí)多任務(wù)內(nèi)核,主要面向中小型嵌入式系統(tǒng)具有執(zhí)行效率高、占用空間小、可移植性強(qiáng)、實(shí)時(shí)性能優(yōu)良和可擴(kuò)展性強(qiáng)等特點(diǎn)。內(nèi)核在任
8、何時(shí)候都是運(yùn)行就緒狀態(tài)下最高優(yōu)先級的任務(wù)。C/OS-II結(jié)構(gòu)小巧,最小內(nèi)核可編譯至2K即使包含全部功能如信號量、消息郵箱、消息隊(duì)列及相關(guān)函數(shù)等編譯后的內(nèi)核也僅有610KB。擴(kuò)展性能良好如果需要可自行加入文件系統(tǒng)等。二、LCD(Liquid Crystal Display)原理 液晶得名于其物理特性:它的分子晶體,以液態(tài)存在而非固態(tài)。這些晶體分子的液體特 性使得它具有兩種非常有用的特點(diǎn):1、如果讓電流通過液晶層,這些分子將會以電流的流 向方向進(jìn)行排列,如果沒有電流,它們將會彼此平行排列。2、如果提供了帶有細(xì)小溝槽的 外層,將液晶倒入后,液晶分子會順著槽排列,并且內(nèi)層與外層以同樣的方式進(jìn)行排列。
9、液晶的第三個特性是很神奇的:液晶層能使光線發(fā)生扭轉(zhuǎn)。液晶層表現(xiàn)的有些類似偏光 器,這就意味著它能夠過濾除了那些從特殊方向射入之外的所有光線。此外,如果液晶層發(fā) 生了扭轉(zhuǎn),光線將會隨之扭轉(zhuǎn),以不同的方向從另外一個面中射出。 液晶的這些特點(diǎn)使得它可以被用來當(dāng)作一種開關(guān)即可以阻礙光線,也可以允許光線 通過。液晶單元的底層是由細(xì)小的脊構(gòu)成的,這些脊的作用是讓分子呈平行排列。上表面也是如此,在這兩側(cè)之間的分子平行排列,不過當(dāng)上下兩個表面之間呈一定的角度時(shí),液晶隨 是如此,在這兩側(cè)之間的分子平行排列,不過當(dāng)上下兩個表面之間呈一定的角度時(shí),液晶隨 著兩個不同方向的表面進(jìn)行排列,就會發(fā)生扭曲。結(jié)果便是這個扭曲
10、的螺旋層使通過的光線 也發(fā)生扭曲。如果電流通過液晶,所有的分子將會按照電流的方向進(jìn)行排列,這樣就會消除 光線的扭轉(zhuǎn)。如果將一個偏振濾光器放置在液晶層的上表面,扭轉(zhuǎn)的光線通過(如圖 A),而 沒有發(fā)生扭轉(zhuǎn)的光線(如圖 B)將被阻礙。因此可以通過電流的通斷改變 LCD 中的液晶排列, 使光線在加電時(shí)射出,而不加電時(shí)被阻斷。也有某些設(shè)計(jì)為了省電的需要,有電流時(shí),光線 不能通過,沒有電流時(shí),光線通過。 LCD 顯示器的基本原理就是通過給不同的液晶單元供電,控制其光線的通過與否,從而 達(dá)到顯示的目的。因此,LCD 的驅(qū)動控制歸于對每個液晶單元的通斷電的控制,每個液晶單 元都對應(yīng)著一個電極,對其通電,便可
11、使光線通過(也有剛好相反的,即不通電時(shí)光線通過, 通電時(shí)光線不通過)。 2電致發(fā)光 LCD 的發(fā)光原理是通過控制加電與否來使光線通過或擋住,從而顯示圖形。光源的提供 方式有兩種:透射式和反射式。筆記本電腦的 LCD 顯示屏即為透射式,屏后面有一個光源, 因此外界環(huán)境可以不需要光源。而一般微控制器上使用的LCD為反射式,需要外界提供光源, 靠反射光來工作。電致發(fā)光(EL)是液晶屏提供光源的一種方式。電致發(fā)光的特點(diǎn)是低功耗, 與二極管發(fā)光比較而言體積小。 電致發(fā)光(EL)是將電能直接轉(zhuǎn)換為光能的一種發(fā)光現(xiàn)象。電致發(fā)光片是利用此原理經(jīng) 過加工制作而成的一種發(fā)光薄片,如圖 7-2 所示。其特點(diǎn)是:超薄
12、、高亮度、高效率、低功 耗、低熱量、可彎曲、抗沖擊、長壽命、多種顏色選擇等。因此,電致發(fā)光片被廣泛應(yīng)用于 各種領(lǐng)域。 3LCD 的驅(qū)動控制 市面上出售的 LCD 有兩種類型: 一種是帶有驅(qū)動電路的 LCD 顯示模塊,這種 LCD 可以方便地與各種低檔單片機(jī)進(jìn)行接口,偏振濾光器 沒有扭轉(zhuǎn)的光線 扭轉(zhuǎn)的光線如 8051 系列單片機(jī),但是由于硬件驅(qū)動電路的存在,體積比較大。這種模式常常使用總線 方式來驅(qū)動。 另一種是 LCD 顯示屏,沒有驅(qū)動電路,需要與驅(qū)動電路配合使用。特點(diǎn)是體積小,但卻 需要另外的驅(qū)動芯片。也可以使用帶有 LCD 驅(qū)動能力的高檔 MCU 驅(qū)動,如 ARM 系列的 S3C2410X
13、。 (1) 總線驅(qū)動方式 一般帶有驅(qū)動模塊的 LCD 顯示屏使用這種驅(qū)動方式,由于 LCD 已經(jīng)帶有驅(qū)動硬件電路, 因此模塊給出的是總線接口,便于與單片機(jī)的總線進(jìn)行接口。驅(qū)動模塊具有八位數(shù)據(jù)總線, 外加一些電源接口和控制信號。而且自帶顯示緩存,只需要將要顯示的內(nèi)容送到顯示緩存中 就可以實(shí)現(xiàn)內(nèi)容的顯示。由于只有八條數(shù)據(jù)線,因此常常通過引腳信號來實(shí)現(xiàn)地址與數(shù)據(jù)線 復(fù)用,以達(dá)到把相應(yīng)數(shù)據(jù)送到相應(yīng)顯示緩存的目的。 (2) 控制器掃描方式 S3C2410X 中具有內(nèi)置的 LCD 控制器,它具有將顯示緩存(在系統(tǒng)存儲器中)中的 LCD 圖象數(shù)據(jù)傳輸?shù)酵獠?LCD 驅(qū)動電路的邏輯功能。 S3C2410X 中
14、內(nèi)置的 LCD 控制器可支持灰度 LCD 和彩色 LCD。在灰度 LCD 上,使用 基于時(shí)間的抖動算法(time-based dithering algorithm)和 FRC (Frame Rate Control)方法,可 以支持單色、4 級灰度和 16 級灰度模式的灰度 LCD。 三、UP-NETARM 2410-S介紹UP-NETARM部件組成 2410-S嵌入式開發(fā)平臺散件,每套計(jì)開發(fā)平臺箱子1個,UP-NETARM 2410-S嵌入式開發(fā)平臺主板1塊,UP-CUP 2410-S 核心板 1塊,原裝 夏普8寸640*480 LQ080V3DG01工控液晶屏+gk80觸摸屏1塊,組裝完
15、成后可通電,通電后液晶屏可點(diǎn)亮(但無任何內(nèi)容),發(fā)光指示管也都點(diǎn)亮。UP-NETARM 2410-S 開發(fā)平臺硬件架構(gòu)框圖1、 UP-NETARM 2410-S部分電路介紹1 2410-S 電源電壓為5V,經(jīng)LM1085-3.3V 和AS1117-1.8V 分別得到3.3V 和1.8V 的工作電壓。開發(fā)板上的芯片多數(shù)使用了3.3V 電壓,而1.8V 是供給S3C2410 內(nèi)核使用的。5V電壓供給音頻功放芯片、LCD、電機(jī)、硬盤、CAN 總線等電路使用。2.硬件復(fù)位電路由IMP811T 構(gòu)成,實(shí)現(xiàn)對電源電壓的監(jiān)控和手動復(fù)位操作。2410-S主板復(fù)位電路設(shè)置專用邏輯:IMP811T 的復(fù)位電平可以
16、使CPU JTAG(nTRST)和板級系統(tǒng)(nRESET)全部復(fù)位;來自仿真器的ICE_nSRST 信號只能使板級復(fù)位;來自仿真器的ICE_nTRST 可以使JTAG(nTRST)復(fù)位,通過跳線選擇是否使板級nRESET 復(fù)位。nRESET反相后得到RESET 信號。3 從CPU 的LCD 控制器出來的信號線包括24 根數(shù)據(jù)線和若干根控制線。對于256色LCD 只需要其中低8 位數(shù)據(jù)線即可。這些信號線是經(jīng)過74HC245 隔離后接到LCD 模塊的,接256 色屏?xí)r也由245 芯片完成電平轉(zhuǎn)換。8 位LCD 模塊除了需要控制信號和數(shù)據(jù)信號外,還需要一個22V 左右的工作電壓和上千伏的背光電壓。前
17、者由MAX629 升壓后得到,后者由一個逆變器模塊提供。另外LCD 信號線驅(qū)動芯片74HC245 的電源是可選的,當(dāng)使用5V 電平的256 色彩屏?xí)r該芯片電源使用5V,使用3.3V 的16 位真彩屏選擇3.3V。(2410-S可以安裝5的偽彩屏和8的真彩屏)。4 觸摸屏由FM7843 完成電壓轉(zhuǎn)換,如果有觸摸動作也會產(chǎn)生中斷,F(xiàn)M7843 占用EINT5。CPU 通過SPI 總線讀取電壓轉(zhuǎn)換結(jié)果,從而計(jì)算出坐標(biāo)位置。對FM7843 的片選信號用GPG12 口線控制。8. 觸摸屏部分增加了第2 單元(用處理器內(nèi)部ADC 構(gòu)成電路),GPG12 口線用跳線選擇作為ADS7843 的片選或者第2 單
18、元的XMON。GPG13/GPG14/GPG15 三個IO 線用于第2 單元,但同時(shí)也引到擴(kuò)展槽;在使用第2 單元時(shí),EXPORT 上該3 個引腳不能使用;否則可以作為IO 口,并不影響觸摸屏部分電路。AIN5/AIN7 用跳JP503/JP504 選擇,可用于第2 單元,或作為AD 輸入。當(dāng)使用第2 單元時(shí),EXPORT 上的AIN5/7 不能使用。觸摸屏插座為雙排彎針,選擇ADS7843(第1 單元)或第2 單元時(shí)插入相應(yīng)的插針即可。四、相關(guān)函數(shù)調(diào)用1、鍵盤相關(guān)函數(shù) onKey定義:void onKey(unsigned int nkey, int fnkey)功能:讀取鍵盤按鍵掃描碼,如
19、果沒有按鍵,則返回-1參數(shù)說明: ndev,設(shè)備號2、畫圖相關(guān)函數(shù)initOSDC定義:void initOSDC()功能:初始化系統(tǒng)的繪圖設(shè)備上下文(DC),為DC 的動態(tài)分配開辟內(nèi)存空間MoveTo定義:void MoveTo(PDC pdc, int x, int y)功能:把繪圖點(diǎn)移動到指定的坐標(biāo)參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x,y:移動畫筆到繪圖點(diǎn)的屏幕坐標(biāo)LineTo定義:void LineTo(PDC pdc, int x, int y)功能:在屏幕上畫線。從當(dāng)前畫筆的位置畫直線到指定的坐標(biāo)位置,并使畫筆停留在當(dāng)前指定的位置參數(shù)說明:pdc:指向繪圖設(shè)備上下文
20、(DC)的指針x,y:直線繪圖目的點(diǎn)的屏幕坐標(biāo)DrawRectFrame定義:void DrawRectFrame(PDC pdc, int left,int top ,int right, int bottom)功能:在屏幕上繪制指定大小的矩形方框。參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針left:繪制矩形的左邊框位置right:繪制矩形的右邊框位置top:繪制矩形的上邊框位置bottom:繪制矩形的下邊框位置DrawRectFrame2定義:void DrawRectFrame2(PDC pdc, structRECT *rect)功能:在屏幕上繪制指定大小的矩形方框。參數(shù)說明:
21、pdc:指向繪圖設(shè)備上下文(DC)的指針rect:繪制矩形的位置及大小FillRect定義:void FillRect(PDC pdc, int left,int top ,int right, int bottom,U32 DrawMode , COLORREFcolor)功能:在屏幕上填充指定大小的矩形。參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針left:繪制矩形的左邊框位置right:繪制矩形的右邊框位置top:繪制矩形的上邊框位置bottom:繪制矩形的下邊框位置color:填充的顏色值,高8 位為空,接下來的24 位分別對應(yīng)RGB 顏色的8 位碼。ClearScreen定義:
22、void ClearScreen()功能:清除整個屏幕的繪圖緩沖區(qū),即:清空LCDBuffer2SetPenWidth定義:U8 SetPenWidth(PDC pdc, U8 width)功能:設(shè)置畫筆的寬度,并返回以前的畫筆寬度參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針width:畫筆的寬度,默認(rèn)值是1,即一個像素點(diǎn)寬SetPenMode定義:void SetPenMode(PDC pdc, U32 mode)功能:設(shè)置畫筆畫圖的模式參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針DrawRectFrame定義:void DrawRectFrame(PDC pdc, struct
23、RECT rect, COLORREF color1,COLORREF color2)功能:繪制指定大小和風(fēng)格的 2D 邊框的矩形參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針rect:繪制矩形的位置及大小color1:左和上的邊框顏色,高8 位為空,接下來的24 位分別對應(yīng)RGB 顏色的8 位碼。color2:右和下的邊框顏色,高8 位為空,接下來的24 位分別對應(yīng)RGB 顏色的8 位碼。SetPenColor定義:SetPenColor(PDC pdc, U32 color)功能:設(shè)定畫筆的顏色,返回當(dāng)前繪圖設(shè)備上下文(DC)畫筆的顏色參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針
24、color:畫筆的顏色,高8 位為空,接下來的24 位分別對應(yīng)RGB 顏色的8 位碼。GetPenColor定義:GetPenColor(PDC pdc)功能:返回當(dāng)前繪圖設(shè)備上下文(DC)畫筆的顏色參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針GetBmpSize定義:void GetBmpSize(char filename, int* Width, int* Height)功能:取得指定位圖文件位圖的大小參數(shù)說明:filename:位圖文件的文件名Width:位圖的寬Height:位圖的高ShowBmp定義:void ShowBmp(PDC pdc, char filename, i
25、nt x, int y)功能:顯示指定的位圖(Bitmap)文件,到指定的坐標(biāo)參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針filename:顯示的位圖(Bitmap)文件名x,y:顯示位圖的左上角坐標(biāo)五、具體程序設(shè)計(jì)1.消失的方塊游戲介紹 游戲設(shè)計(jì)了12個方塊,方塊的顏色交替變化,當(dāng)移動的長方形碰到正方形方塊時(shí),正方形方塊就會消失。當(dāng)長方形碰到墻壁時(shí),游戲就結(jié)束。消失的方塊游戲主要設(shè)計(jì)過程:首先設(shè)定正方形方塊的位置和方塊的顏色:FillRect(pdc,550,30,610,90,0,greencolor);FillRect(pdc,550,90,610,150,0,redcolor);
26、FillRect(pdc,550,150,610,210,0,greencolor);FillRect(pdc,550,210,610,270,0,redcolor);FillRect(pdc,550,270,610,330,0,greencolor);FillRect(pdc,550,330,610,390,0,redcolor);FillRect(pdc,490,30,550,90,0,redcolor);FillRect(pdc,490,90,550,150,0,greencolor);FillRect(pdc,490,150,550,210,0,redcolor);FillRect(p
27、dc,490,210,550,270,0,greencolor);FillRect(pdc,490,270,550,330,0,redcolor);FillRect(pdc,490,330,550,390,0,greencolor);然后編寫長方形移動的代碼,完成游戲的設(shè)計(jì)。實(shí)驗(yàn)結(jié)果圖:2.主要程序代碼int main(void)ARMTargetInit(); / do target (uHAL based ARM system) initialisation /OSInit(); / needed by uC/OS-II /OSInitUart();initOSFile();#if USE
28、_MINIGUI=0initOSMessage();initOSList();initOSDC();initOSCtrl();LoadFont();#endifsrand(unsigned)time(NULL);loadsystemParam();/ create the tasks in uC/OS and assign increasing / priorities to them so that Task3 at the end of / the pipeline has the highest priority. /LCD_printf("Create task on uCO
29、S-II.n");OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_StackSTACKSIZE-1, Main_Task_Prio);OSTaskCreate(Snake_Task, (void *)0, (OS_STK *)&Snake_StackSTACKSIZE-1, Snake_Task_Prio);OSAddTask_Init(1);LCD_printf("Starting uCOS-II.n");LCD_printf("Entering graph mode.n"
30、);LCD_ChangeMode(DspGraMode);OSStart(); / start the OS /return 0;/main/長方形的移動:控制長方形變換方向void Add_Corner(int direct)int i=0;if(corner_count<10)for(i=corner_count;i>0;i-)snakecorneri.x=snakecorneri-1.x;snakecorneri.y=snakecorneri-1.y;snakecorner0.x=snakehead.x;snakecorner0.y=snakehead.y;for(i=cor
31、ner_count;i>0;i-)corner_directi=corner_directi-1;corner_direct0=direct;corner_count+;/重新開始游戲void restartgame()int i;flag=0;ClearScreen();LCD_Refresh();gameover=0;gamepass=0;oldtail.x=1;oldtail.y=16;/長方形的初始位置snakehead.x=2;snakehead.y=16;snaketail.x=1;snaketail.y=16;cur_direct=6;cur_tail_direct=6;c
32、orner_count=0;void onKey(unsigned int nkey, int fnkey)/PDC pdc;/創(chuàng)建繪圖設(shè)備上下文結(jié)構(gòu)U16 ch10;char *str, skey10;if(nkey&KEY_DOWN)=0)return;pdc=CreateDC();/創(chuàng)建繪圖設(shè)備上下文fswitch(nkey&0xff)case 'N':str="NumLock"break;case 'r':str="Enter"break;/2、4、6、8鍵控制長方形的變換方向case '8
33、':cur_direct=8;Add_Corner(cur_direct);break;case '2':cur_direct=2;Add_Corner(cur_direct);break;case '4':cur_direct=4;Add_Corner(cur_direct);break;case '6':cur_direct=6;Add_Corner(cur_direct);break;/-控制游戲重新開始case '-':restartgame();break;default:skey0=nkey;skey1=0;s
34、tr=skey;void mycircle(PDC pdc,int x,int y,int r)void Main_Task(void *Id) /Main_Test_TaskPOSMSG pMsg=0;/創(chuàng)建消息結(jié)構(gòu)int gonext=0;int i;ClearScreen();/清屏pdc=CreateDC();/創(chuàng)建繪圖設(shè)備上下文fShowBmp(pdc,"/sys/ucos/fj/ludong.bmp",0,0);LCD_Refresh();/消息循環(huán)while(!gonext)pMsg=WaitMessage(0); /等待消息switch(pMsg->M
35、essage)ClearScreen();ShowBmp(pdc,"/sys/ucos/fj/shuoming2.bmp",0,0);LCD_Refresh();gonext=1; break;DeleteMessage(pMsg);/刪除消息,釋放資源gonext=0;/消息循環(huán)while(!gonext)pMsg=WaitMessage(0); /等待消息switch(pMsg->Message)/onKey(pMsg->WParam,pMsg->LParam);switch(pMsg->WParam&0xff) case 'r&
36、#39;: ClearScreen(); gonext=1; break; break;DeleteMessage(pMsg);/刪除消息,釋放資源gamestart=1;/消息循環(huán)for(;)pMsg=WaitMessage(0); /等待消息switch(pMsg->Message)onKey(pMsg->WParam,pMsg->LParam);break;DeleteMessage(pMsg);/刪除消息,釋放資源OSTimeDly(300);/長方形碰到方塊時(shí)讓方塊顏色變?yōu)榘咨玽oid check_bar()if( (cur_direct=8)|(cur_direc
37、t=2 ) )if(49<=snakehead.x&&snakehead.x<55)if(3<=snakehead.y&&snakehead.y<9)FillRect(pdc,490,30,550,90,0,whitecolor);if(9<=snakehead.y&&snakehead.y<15)FillRect(pdc,490,90,550,150,0,whitecolor);if(15<=snakehead.y&&snakehead.y<21)FillRect(pdc,490,
38、150,550,210,0,whitecolor);if(21<=snakehead.y&&snakehead.y<27)FillRect(pdc,490,210,550,270,0,whitecolor);if(27<=snakehead.y&&snakehead.y<33)FillRect(pdc,490,270,550,330,0,whitecolor);if(33<=snakehead.y&&snakehead.y<39)FillRect(pdc,490,330,550,390,0,whitecolor
39、);else if(55<=snakehead.x&&snakehead.x<61)if(3<=snakehead.y&&snakehead.y<9)FillRect(pdc,550,30,610,90,0,whitecolor);if(9<=snakehead.y&&snakehead.y<15)FillRect(pdc,550,90,610,150,0,whitecolor);if(15<=snakehead.y&&snakehead.y<21)FillRect(pdc,550,
40、150,610,210,0,whitecolor);if(21<=snakehead.y&&snakehead.y<27)FillRect(pdc,550,210,610,270,0,whitecolor);if(27<=snakehead.y&&snakehead.y<33)FillRect(pdc,550,270,610,330,0,whitecolor);if(33<=snakehead.y&&snakehead.y<39)FillRect(pdc,550,330,610,390,0,whitecolor
41、);if(cur_direct=6)|(cur_direct=4)if(49<=snakehead.x&&snakehead.x<55)if(3<=snakehead.y&&snakehead.y<9)FillRect(pdc,490,30,550,90,0,whitecolor);if(9<=snakehead.y&&snakehead.y<15)FillRect(pdc,490,90,550,150,0,whitecolor);if(15<=snakehead.y&&snakehead
42、.y<21)FillRect(pdc,490,150,550,210,0,whitecolor);if(21<=snakehead.y&&snakehead.y<27)FillRect(pdc,490,210,550,270,0,whitecolor);if(27<=snakehead.y&&snakehead.y<33)FillRect(pdc,490,270,550,330,0,whitecolor);if(33<=snakehead.y&&snakehead.y<39)FillRect(pdc,49
43、0,330,550,390,0,whitecolor);else if(55<=snakehead.x&&snakehead.x<61)if(3<=snakehead.y&&snakehead.y<9)FillRect(pdc,550,30,610,90,0,whitecolor);if(9<=snakehead.y&&snakehead.y<15)FillRect(pdc,550,90,610,150,0,whitecolor);if(15<=snakehead.y&&snakehead
44、.y<21)FillRect(pdc,550,150,610,210,0,whitecolor);if(21<=snakehead.y&&snakehead.y<27)FillRect(pdc,550,210,610,270,0,whitecolor);if(27<=snakehead.y&&snakehead.y<33)FillRect(pdc,550,270,610,330,0,whitecolor);if(33<=snakehead.y&&snakehead.y<39)FillRect(pdc,55
45、0,330,610,390,0,whitecolor);/長方形是否碰到邊框void check_border()if(cur_direct=8)if(snakehead.y<1)gameover = 1;if(cur_direct=2)if(snakehead.y>39)gameover = 1;if(cur_direct=4)if(snakehead.x<1)gameover = 1;if(cur_direct=6)if(snakehead.x>59)gameover = 1;void Snake_Task(void *Id) /Snake_Taskint i;PD
46、C pdc;pdc=CreateDC();oldtail.x=1; oldtail.y=16;snakehead.x=2;snakehead.y=16;snaketail.x=1;snaketail.y=16;oldcolor = GetPenColor(pdc);SetPenColor(pdc,redcolor);SetPenWidth(pdc,10);for(i=0;i<5;i+)snakecorneri.x=-1;snakecorneri.y=-1;for(;)if(gamestart)if(!gameover)if(!gamepass)SetPenColor(pdc,redcol
47、or);DrawRectFrame(pdc,20,20,620,420);if(flag=0) /繪制初始的12個矩形,顏色分別填充為綠色和紅色 FillRect(pdc,550,30,610,90,0,greencolor);FillRect(pdc,550,90,610,150,0,redcolor);FillRect(pdc,550,150,610,210,0,greencolor);FillRect(pdc,550,210,610,270,0,redcolor);FillRect(pdc,550,270,610,330,0,greencolor);FillRect(pdc,550,33
48、0,610,390,0,redcolor);FillRect(pdc,490,30,550,90,0,redcolor);FillRect(pdc,490,90,550,150,0,greencolor);FillRect(pdc,490,150,550,210,0,redcolor);FillRect(pdc,490,210,550,270,0,greencolor);FillRect(pdc,490,270,550,330,0,redcolor);FillRect(pdc,490,330,550,390,0,greencolor);flag=1;check_bar();/改變蛇的位置if(
49、cur_direct=8)snakehead.y-=1;/位置一變化則檢查是否碰到邊框check_border();else if(cur_direct=2)snakehead.y+=1;check_border();else if(cur_direct=4)snakehead.x-=1;check_border();else if(cur_direct=6)snakehead.x+=1;check_border();if(!snake_add)if(cur_tail_direct=8)oldtail.y=snaketail.y;oldtail.x=snaketail.x;snaketail.
50、y-=1;if(corner_count>0)&&(snaketail.y=snakecornercorner_count-1.y)cur_tail_direct=corner_directcorner_count-1;corner_count-;else if(cur_tail_direct=2)oldtail.y=snaketail.y;oldtail.x=snaketail.x;snaketail.y+=1;if(corner_count>0)&&(snaketail.y=snakecornercorner_count-1.y)cur_tail_direct=corner_directcorner_count-1;corner_co
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣西2025年02月廣西欽州市12328熱線招考4名工作人員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 遠(yuǎn)程辦公平臺贊助方案深度解讀
- 山東2024年12月山東省地質(zhì)礦產(chǎn)勘查開發(fā)局所屬事業(yè)單位公開招考33名工作人員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 杭州某外國語學(xué)校專項(xiàng)方案設(shè)計(jì)中高職組賽項(xiàng)Ⅳ課件
- 石材供應(yīng)材料合同范本
- 四川2024年12月四川省雅江縣縣鄉(xiāng)機(jī)關(guān)度公開考調(diào)15名公務(wù)員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 6.1《學(xué)無止境》教案- -2024-2025學(xué)年統(tǒng)編版道德與法治九年級下冊
- 云南2025年01月云南省巧家縣人力資源和社會保障局2025年公開零星選調(diào)工作人員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 佳木斯市湯原縣2024-2025學(xué)年小升初數(shù)學(xué)綜合練習(xí)卷含解析
- 山東省菏澤市定陶縣2025年三年級數(shù)學(xué)第二學(xué)期期末考試模擬試題含解析
- 英語課堂教學(xué)技能訓(xùn)練(英語師范專業(yè))全套教學(xué)課件
- 2023年第九屆中國國際互聯(lián)網(wǎng)+大學(xué)生創(chuàng)新創(chuàng)業(yè)大賽解讀
- 直播電商可行性分析
- 建筑工程施工安全管理網(wǎng)絡(luò)圖
- 人教版四年級數(shù)學(xué)下冊教材分析精講課件
- 《龍族設(shè)定全解析》
- 產(chǎn)品手繪設(shè)計(jì)表現(xiàn)技法PPT完整全套教學(xué)課件
- GA/T 1988-2022移動警務(wù)即時(shí)通信系統(tǒng)功能及互聯(lián)互通技術(shù)要求
- 農(nóng)業(yè)政策學(xué)PPT完整全套教學(xué)課件
- 國家電網(wǎng)招聘之其他工學(xué)類復(fù)習(xí)資料大全
- 天山天池景區(qū)介紹-天山天池景點(diǎn)PPT(經(jīng)典版)
評論
0/150
提交評論