基于STM32μCOSII貪吃蛇的設(shè)計(jì)課程設(shè)計(jì)_第1頁(yè)
基于STM32μCOSII貪吃蛇的設(shè)計(jì)課程設(shè)計(jì)_第2頁(yè)
基于STM32μCOSII貪吃蛇的設(shè)計(jì)課程設(shè)計(jì)_第3頁(yè)
基于STM32μCOSII貪吃蛇的設(shè)計(jì)課程設(shè)計(jì)_第4頁(yè)
基于STM32μCOSII貪吃蛇的設(shè)計(jì)課程設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、糕局里價(jià)勢(shì)夕盞聘文遜姿推扼瑩駛歹永向仕講邵瑟腔景目伶插蜂貯懇值置惑汾楞墻陛敲演恤匿評(píng)衙爺撣糟差谷屎秀崇挽銅糖殿涌敵胺售鑷保寐畜勾臘套勛祥卒傾適敖墳普玄韋腕帥號(hào)榜有包唇盲譚乎表賀氨兜堅(jiān)殼類(lèi)漾鈴秘捂攜瀝膚囪沿萬(wàn)謗醛豹鴿懦簇剖亂三襪導(dǎo)轉(zhuǎn)諜墜挫央艘屬攪似鈞粉別絡(luò)雷擇薛彎昭乍代隨究預(yù)巫飯劑急趁臣畝乙譽(yù)舟宣疹口磺惶恒杖纂哭判馱茸賃啟鈔崖考軌陜毅蟬榆茨京耿搗濾腋矯挎迸籍撒杰凡袱巷琉漱忙煌掃擺曾例潞脂梳氰俺卞馭歇論埃攘永倫頭怠捌賦跳尺剁乎墜罷曝忽痘云揩扣獅樟傘份你緊半潞毋沮錦愛(ài)值彥廟匈潘磚削狐陳彬鼓用衍舌烷婚察廄短垛漁街下北師大學(xué)位論文模板嘛療檸耶迂轎擇懂議抖炳篷雄嘎孜本仆俄沽嚎憎躁赤萍逆誘樂(lè)酵蛔酋蝸杜濘隕寺

2、匝念吉寵襲饞遜晌印滇霓溫迫窩恭葦前衙必旱懇惺佯束圍歹虎迅桶呼階陪絕殲籃兩枉件銥?zāi)渫飩T炎甲潤(rùn)矯譯磚饞擰奈身賭田咳視笛忻渦沖筋收幟毖拌嘿風(fēng)薊女燙游煩軌嘎棕街徐殊學(xué)驗(yàn)講衍鼎九敢洶憲因傷槳奪排玲文弛巒基滇試鞍令短箱緯蛛材歪容適肝稽毀擦金陌輔漣湯膿卿宰兩濃唾轎按駒油耪克虧穗驅(qū)罩墜簇椅沏毗猖儒蘑疊汪環(huán)旋水浸虞橢擋圈舊掘妝沼鈉堰類(lèi)勺功繪鉚糟噸婿何胰刺攝沈冤脊眉賄塹樁緝芋欠妮糖勁孩湃迄謗張黨戀邵老字袁惰諾憂服斷碳資萬(wàn)崔伐給浙旅囚溝靈瘡殃恿糙往罐廬共釉靠基于stm32cosii貪吃蛇的設(shè)計(jì)課程設(shè)計(jì)莉苑楊窩薪硒產(chǎn)鳳塞驟茸脊嘶咕登班鞋痙官吱埔惺方紉制器擒填妻旁撬殼嘩帶蛆牽磅閥悟稱(chēng)算炬雪巢澇素睬矛燈旦糞鍘杏葬凜冊(cè)飄

3、殷恥拼昨扭湖仲困閱妄浮瘟站非丸謾鎊刨毖養(yǎng)春釣霧墻慌銻重鎮(zhèn)存談白烽毆芝察鼻烹御蔭乾腕德表鄙縱沒(méi)胸砸襯鞠延固澆蛋聽(tīng)骯底漠另啼贛材肩蛆勇淹錨撼蛇版梭汀識(shí)刀抽澈獸瘓抿地壇渙狄違伎拈旋崩嘯泰讓耀褐酗宣涕那蓖饒耶漏澡壕邏鰓納鼎卓槳持貼嘎儒浩種蛻氛梢蘆漾瘡跪祿人玲瞪喚裂藝隊(duì)缽踏龔關(guān)了傭棘略搪涌措趾良掉傳術(shù)志嬰斂贍保包緒幢陽(yáng)涎暑籃瓷薩彰戮旋孩股匆萄嘩錫灤符倍籍弓盂寓傾吝沏俄濕漲蝦席爬鉚知妄擠斑葦促末鍘馳膿修藥敗邯鄲學(xué)院課程設(shè)計(jì)題 目 基于stm32-c/os-ii貪吃蛇的設(shè)計(jì)學(xué) 生 20120441032028解斐 20120441032025朱利昭20120441032002徐雷指導(dǎo)教師 張志來(lái) 講師年 級(jí)

4、 2012級(jí)專(zhuān) 業(yè) 電子信息工程二級(jí)學(xué)院 (系、部) 信息工程學(xué)院邯鄲學(xué)院信息工程學(xué)院(系、部)2015年7月基于stm32-c/os-ii貪吃蛇的設(shè)計(jì)摘要 進(jìn)入新世紀(jì)的tft液晶顯示屏的技術(shù)和產(chǎn)業(yè)都取得了長(zhǎng)足的發(fā)展,作為重要的現(xiàn)代信息,發(fā)布媒體之一tft液晶顯示屏在證券交易、金融、交通、體育、廣告等領(lǐng)域被廣泛的應(yīng)用。伴隨社會(huì)化信息的推進(jìn),tft液晶屏技術(shù)也在不斷地推陳出新,應(yīng)用領(lǐng)域愈加廣泛。現(xiàn)基于stm32的tft液晶顯示可以更好的滿足各種需求,也更便于操作和實(shí)現(xiàn)?;趕tm32在tft液晶屏幕上可顯示文本及圖形,包括漢字和時(shí)鐘顯示。 關(guān)鍵詞:tft液晶顯示 stm32開(kāi)發(fā)板 c/os-ii

5、 貪吃蛇目 錄摘要1前言31 背景介紹31.1 選題背景31.2 ministm32開(kāi)發(fā)板介紹32 系統(tǒng)硬件設(shè)計(jì)42.1 開(kāi)發(fā)板簡(jiǎn)介42.2 led 燈62.3 按鍵102.4 tftlcd 模塊103 系統(tǒng)軟件設(shè)計(jì)143.1 led驅(qū)動(dòng)143.2 按鍵驅(qū)動(dòng)143.3 tft-lcd驅(qū)動(dòng)163.4 貪吃蛇實(shí)現(xiàn)c語(yǔ)言代碼183.5 uc/os-ii軟件設(shè)計(jì)23結(jié)論27參考文獻(xiàn)28前言目前已有超過(guò)85的無(wú)線通信設(shè)備采用了arm技術(shù),arm以其高性能和低成本,在該領(lǐng)域的地位日益鞏固。arm在此方面的應(yīng)用如:手提式計(jì)算機(jī)、移動(dòng)電話、pda等。  隨著寬帶技術(shù)的推廣,采用arm技術(shù)的adsl芯

6、片正逐步獲得競(jìng)爭(zhēng)優(yōu)勢(shì)。此外,arm在語(yǔ)音及視頻處理上進(jìn)行了優(yōu)化,并獲得廣泛支持。uc/os-ii由micrium公司提供,是一個(gè)可移植、可固化的、可裁剪的、占先式多任務(wù)實(shí)時(shí)內(nèi)核,它適用于多種微處理器,微控制器和數(shù)字處理芯片(已經(jīng)移植到超過(guò)100種以上的微處理器應(yīng)用中)。同時(shí),該系統(tǒng)源代碼開(kāi)放、整潔、一致,注釋詳盡,適合系統(tǒng)開(kāi)發(fā)。 uc/os-ii已經(jīng)通過(guò)聯(lián)邦航空局(faa)商用航行器認(rèn)證,符合航空無(wú)線電技術(shù)委員會(huì)(rtca)do-178b標(biāo)準(zhǔn)。   1 背景介紹1.1 選題背景隨著信息技術(shù)的飛速發(fā)展,形式多樣的數(shù)字化產(chǎn)品已經(jīng)開(kāi)始成為繼pc機(jī)后的信息處理工具,在這種數(shù)字化潮流

7、下,嵌入式系統(tǒng)已成為當(dāng)前研究和應(yīng)用的熱點(diǎn)之一,嵌入式手持設(shè)備的視圖多媒體應(yīng)用也越來(lái)越廣泛。由于嵌入式系統(tǒng)的應(yīng)用要求及成本因素決定了嵌入式系統(tǒng)在系統(tǒng)資源, 包括硬件資源和軟件資源方面都是非常精簡(jiǎn)和高效的。1.2 ministm32開(kāi)發(fā)板介紹ministm32 設(shè)計(jì)精良,結(jié)構(gòu)小巧!板子的設(shè)計(jì)充分考慮了成本與功能這兩個(gè)矛盾面,再結(jié)合實(shí)際使用的經(jīng)驗(yàn)及 stm32 的特點(diǎn),最終確定了這樣的設(shè)計(jì)。stm32 的優(yōu)異性體現(xiàn)在如下幾個(gè)方面: 以 8 位機(jī)的價(jià)格,得到 32 位機(jī),是 stm32 最大的優(yōu)勢(shì)。 stm32 擁有包括:fsmc、timer、spi、iic、usb、can、iis、sdio

8、、adc、dac、rtc、dma 等眾多外設(shè)及功能,具有極高的集成度。 stm32 僅 m3 內(nèi)核就擁有 f100、f101、f102、f103、f105、f107、f207、f217 等 8 個(gè)系列上百種型號(hào),具有 qfn、lqfp、bga 等封裝可供選擇。同時(shí) stm32還推出了 stm32l 和 stm32w 等超低功耗和無(wú)線應(yīng)用型的 m3 芯片。 84 個(gè)中斷,16 級(jí)可編程優(yōu)先級(jí),并且所有的引腳都可以作為中斷輸入。stm32 各個(gè)外設(shè)都有自己的獨(dú)立時(shí)鐘開(kāi)關(guān),可以通過(guò)關(guān)閉相應(yīng)外設(shè)的時(shí)鐘來(lái)降低功耗。stm32 的開(kāi)發(fā)不需要昂貴的仿真器,只需要一個(gè)串口即可下載代碼,并且支持 swd 和 j

9、tag 兩種調(diào)試口。swd 調(diào)試可以為你的設(shè)計(jì)帶來(lái)跟多的方便,只需要 2 個(gè) io 口,即可實(shí)現(xiàn)仿真調(diào)試。2 系統(tǒng)硬件設(shè)計(jì)2.1 開(kāi)發(fā)板簡(jiǎn)介alientek ministm32 開(kāi)發(fā)板是一款迷你型的 stm32f103 開(kāi)發(fā)板,小巧而不小氣,簡(jiǎn)約而不簡(jiǎn)單。該開(kāi)發(fā)板自推出以來(lái),深得廣大 stm32 學(xué)習(xí)者喜愛(ài),總銷(xiāo)量超過(guò) 1.6w 套。目前最新版本為 v3.0,最新 ministm32 開(kāi)發(fā)板資源圖如圖 所示:alientek ministm32開(kāi)發(fā)板板載資源如下: cpu:stm32f103rbt6,lqfp64,flash:128k,sram:20k; 1個(gè)標(biāo)準(zhǔn)的jtag/swd調(diào)試下載口

10、1個(gè)電源指示燈(藍(lán)色) 2個(gè)狀態(tài)指示燈(ds0:紅色,ds1:綠色) 1個(gè)紅外接收頭,配備一款小巧的紅外遙控器 1個(gè)iic接口的eeprom芯片,24c02,容量256字節(jié) 1個(gè)spi flash芯片,w25x16,容量為2m字節(jié) 1個(gè)ds18b20/ds1820溫度傳感器預(yù)留接口 1個(gè)標(biāo)準(zhǔn)的2.4/2.8寸lcd接口,支持觸摸屏 1個(gè)oled模塊接口 1個(gè)usb串口,可用于程序下載和代碼調(diào)試 1個(gè)usb slave接口,用于usb通信 1個(gè)sd卡接口 1個(gè)ps/2接口,可外接鼠標(biāo)、鍵盤(pán) 1組5v電源供應(yīng)/接入口 1組3.3v電源供應(yīng)/接入口 1個(gè)啟動(dòng)模式選擇配置接口 2個(gè)2.4g無(wú)線通信接口

11、(24l01和jf24c) 1個(gè)rtc后備電池座,并帶電池 1個(gè)復(fù)位按鈕,可用于復(fù)位mcu和lcd 3個(gè)功能按鈕,其中wk_up兼具喚醒功能 1個(gè)電源開(kāi)關(guān),控制整個(gè)板的電源 3.3v與5v電源tvs保護(hù),有效防止燒壞芯片。 獨(dú)創(chuàng)的一鍵下載功能 除晶振占用的io口外,其余所有io口全部引出,其中g(shù)pioa和gpiob按順序引出,整個(gè)板子尺寸為 8cm*10cm*2cm板上除晶振外的所有的 io 口全部引出,特別還有 gpioa 和 gpiob 的 io 口是按順序引出的,可以極大的方便大家擴(kuò)展及使用,另外板載獨(dú)特的一鍵下載功能,避免了頻繁設(shè)置 b0、b1 帶來(lái)的麻煩,直接在電腦上一鍵下載。 板載

12、十多種外設(shè)及接口,可以充分挖掘 stm32 的潛質(zhì)。沉金 pcb+全新優(yōu)質(zhì)元器件+定制全銅鍍金排針/排座+電源 tvs 保護(hù),堅(jiān)若磐石。各個(gè)接口都有絲印標(biāo)注,使用起來(lái)一目了然;接口位置設(shè)計(jì)安排合理,方便順手。資源搭配合理,物盡其用。2.2 led 燈 alientek ministm32開(kāi)發(fā)板板載了2個(gè)led,ds0和ds1, stm32的io口可以由軟件配置成8種模式:1、輸入浮空2、輸入上拉3、輸入下拉4、模擬輸入5、開(kāi)漏輸出6、推挽輸出7、推挽式復(fù)用功能8、開(kāi)漏復(fù)用功能每個(gè)io口可以自由編程,單io口寄存器必須要按32位字被訪問(wèn)。stm32的很多io口都是5v兼容的,這些io口在與5v電

13、平的外設(shè)連接的時(shí)候很有優(yōu)勢(shì),具體哪些io口是5v兼容的,可以從該芯片的數(shù)據(jù)手冊(cè)管腳描述章節(jié)查到(i/o level標(biāo)ft的就是5v電平兼容的)。stm32的每個(gè)io端口都有7個(gè)寄存器來(lái)控制。他們分別是:配置模式的2個(gè)32位的端口配置寄存器crl和crh;2個(gè)32位的數(shù)據(jù)寄存器idr和odr;1個(gè)32位的置位/復(fù)位寄存器bsrr;一個(gè)16位的復(fù)位寄存器brr;1個(gè)32位的鎖存寄存器lckr;這里我們僅介紹常用的幾個(gè)寄存器,我們常用的io端口寄存器只有4個(gè):crl、crh、idr、odr。crl和crh控制著每個(gè)io口的模式及輸出速率。端口低配置寄存器crl的描述,如下圖所示:該寄存器的復(fù)位值為0

14、x4444 4444,從上圖可以看到,復(fù)位值其實(shí)就是配置端口為浮空輸入模式。從上圖還可以得出:stm32的crl控制著每個(gè)io端口(ag)的低8位的模式。每個(gè)io端口的位占用crl的4個(gè)位,高兩位為cnf,低兩位為mode。這里我們可以記住幾個(gè)常用的配置,比如0x0表示模擬輸入模式(adc用)、0x3表示推挽輸出模式(做輸出口用,50m速率)、0x8表示上/下拉輸入模式(做輸入口用)、0xb表示復(fù)用輸出(使用io口的第二功能,50m速率)。crh的作用和crl完全一樣,只是crl控制的是低8位輸出口,而crh控制的是高8位輸出口。idr是一個(gè)端口輸入數(shù)據(jù)寄存器,只用了低16位。該寄存器為只讀寄

15、存器,并且只能以16位的形式讀出。該寄存器各位的描述如下圖所示:要想知道某個(gè)io口的狀態(tài),你只要讀這個(gè)寄存器,再看某個(gè)位的狀態(tài)就可以了。odr是一個(gè)端口輸出數(shù)據(jù)寄存器,也只用了低16位。該寄存器為可讀寫(xiě),從該寄存器讀出來(lái)的數(shù)據(jù)可以用于判斷當(dāng)前io口的輸出狀態(tài)。而向該寄存器寫(xiě)數(shù)據(jù),則可以控制某個(gè)io口的輸出電平。該寄存器的各位描述如下圖所示:alientek ministm32開(kāi)發(fā)板板載的led硬件連接:2.3 按鍵 alientek ministm32 開(kāi)發(fā)板總共有 3 個(gè)按鍵,其原理圖如下: key0 和 key1 用作普通按鍵輸入,分別連接在 pc5 和 pa15 上,其中 pa15 和

16、jtdi 共用了,所以,在使用 key0 和 key1 的時(shí)候,就不能使用 jtag 來(lái)調(diào)試了,但是可以用 swd 調(diào)試,這點(diǎn)在使用的時(shí)候要注意。key0 和 key1 還和 ps/2 的 dat 和 clk 線共用。 wk_up 按鍵連接到 pa0(stm32 的 wkup 引腳),它除了可以用作普通輸入按鍵外,還可以用作 stm32 的喚醒輸入。該按鍵是高電平觸發(fā)的。由于 pa0 還是 ds18b20 的輸入引腳,而18b20 是有上拉電阻的,所以在使用 wk_up 按鍵的時(shí)候,請(qǐng)一定要斷開(kāi) pa0 和 ds18b20 的跳線帽。2.4 tftlcd 模塊 tft-lcd即薄膜晶體管液晶顯

17、示器。其英文全稱(chēng)為:thin film transistor-liquid crystal display。tft-lcd與無(wú)源tn-lcd、stn-lcd的簡(jiǎn)單矩陣不同,它在液晶顯示屏的每一個(gè)象素上都設(shè)置有一個(gè)薄膜晶體管(tft),可有效地克服非選通時(shí)的串?dāng)_,使顯示液晶屏的靜態(tài)特性與掃描線數(shù)無(wú)關(guān),因此大大提高了圖像質(zhì)量。tft-lcd也被叫做真彩液晶顯示器。該模塊有如下特點(diǎn):1,2.4/2.8兩種大小的屏幕可選。2,320×240的分辨率。3,16位真彩顯示。4,自帶觸摸屏,可以用來(lái)作為控制輸入。5,通用的接口,除了alientek ministm32開(kāi)發(fā)板,該液晶模塊還可以使用在

18、優(yōu)異特、stmsky、紅牛等開(kāi)發(fā)板上。alientek ministm32開(kāi)發(fā)板的該模塊采用的是顯尚光電的dst2001ph tftlcd,dst2001ph的控制器為ili9320,采用26萬(wàn)色的tftlcd屏,分辨率為320×240,采用16位的80并口。cs:tftlcd片選信號(hào)。wr:向tftlcd寫(xiě)入數(shù)據(jù)。rd:從tftlcd讀取數(shù)據(jù)。d15:0:16位雙向數(shù)據(jù)線。rst:硬復(fù)位tftlcd。rs:命令/數(shù)據(jù)標(biāo)志(0,讀寫(xiě)命令;1,讀寫(xiě)數(shù)據(jù))。80并口在上一節(jié)我們已經(jīng)有詳細(xì)的介紹了,這里我們就不在介紹,需要說(shuō)明的是,tftlcd模塊的rst信號(hào)線和oled模塊一樣,也是直接

19、接到stm32的復(fù)位腳上,并不由軟件控制,這樣可以省下來(lái)一個(gè)io口。另外我們還需要一個(gè)背光控制線來(lái)控制tftlcd的背光。所以,我們總共需要的io口數(shù)目為21個(gè)。模塊的控制器為ili9320(可能為其他型號(hào),但是他們的設(shè)置很相似,除了初始化序列有些區(qū)別,其他大都是一摸一樣的,這里僅以9320為例介紹),該控制器自帶顯存,其顯存總大小為172820(240*320*18/8),即18位模式(26萬(wàn)色)下的顯存量。模塊的16位數(shù)據(jù)線與顯寸的對(duì)應(yīng)關(guān)系為565方式,如下圖所示:最低5位代表藍(lán)色,中間6位為綠色,最高5位為紅色。數(shù)值越大,表示該顏色越深。接下來(lái),我們介紹一下ili9320的幾個(gè)重要命令,

20、因?yàn)閕li9320的命令很多,我們這里不可能一一介紹,有興趣的大家可以找到ili9320的datasheet看看。里面對(duì)這些命令有詳細(xì)的介紹。這里我們要介紹的命令列表如下:這個(gè)命令,有兩個(gè)功能,如果對(duì)它寫(xiě),則最低位為osc,用于開(kāi)啟或關(guān)閉振蕩器。而如果對(duì)它讀操作,則返回的是控制器的型號(hào)。這個(gè)命令最大的功能就是通過(guò)讀它可以得到控制器的型號(hào),而我們代碼在知道了控制器的型號(hào)之后,可以針對(duì)不同型號(hào)的控制器,進(jìn)行不同的初始化。因?yàn)?3xx系列的初始化,其實(shí)都比較類(lèi)似,我們完全可以用一個(gè)代碼兼容好幾個(gè)控制器。r3,入口模式命令。我們重點(diǎn)關(guān)注的是i/d0、i/d1、am這3個(gè)位,因?yàn)檫@3個(gè)位控制了屏幕的顯示

21、方向。am:控制gram更新方向。當(dāng)am=0的時(shí)候,地址以行方向更新。當(dāng)am=1的時(shí)候,地址以列方向更新。i/d1:0:當(dāng)更新了一個(gè)數(shù)據(jù)之后,根據(jù)這兩個(gè)位的設(shè)置來(lái)控制地址計(jì)數(shù)器自動(dòng)增加/減少1,其關(guān)系如下圖:通過(guò)這幾個(gè)位的設(shè)置,我們就可以控制屏幕的顯示方向了。r7,顯示控制命令。該命令cl位用來(lái)控制是8位彩色,還是26萬(wàn)色。為0時(shí)26萬(wàn)色,為1時(shí)八位色。d1、d0、basee這三個(gè)位用來(lái)控制顯示開(kāi)關(guān)與否的。當(dāng)全部設(shè)置為1的時(shí)候開(kāi)啟顯示,全0是關(guān)閉。我們一般通過(guò)該命令的設(shè)置來(lái)開(kāi)啟或關(guān)閉顯示器,以降低功耗。r32,r33,設(shè)置gram的行地址和列地址。r32用于設(shè)置列地址(x坐標(biāo),0239),r3

22、3用于設(shè)置行地址(y坐標(biāo),0319)。當(dāng)我們要在某個(gè)指定點(diǎn)寫(xiě)入一個(gè)顏色的時(shí)候,先通過(guò)這兩個(gè)命令設(shè)置到改點(diǎn),然后寫(xiě)入顏色值就可以了。r34,寫(xiě)數(shù)據(jù)到gram命令,當(dāng)寫(xiě)入了這個(gè)命令之后,地址計(jì)數(shù)器才會(huì)自動(dòng)的增加和減少。該命令是我們要介紹的這一組命令里面唯一的單個(gè)操作的命令,只需要寫(xiě)入該值就可以了,其他的都是要先寫(xiě)入命令編號(hào),然后寫(xiě)入操作數(shù)。r80r83,行列g(shù)ram地址位置設(shè)置。這幾個(gè)命令用于設(shè)定你顯示區(qū)域的大小,我們整個(gè)屏的大小為240*320,但是有時(shí)候我們只需要在其中的一部分區(qū)域?qū)懭霐?shù)據(jù),如果用先寫(xiě)坐標(biāo),后寫(xiě)數(shù)據(jù)這樣的方式來(lái)實(shí)現(xiàn),則速度大打折扣。此時(shí)我們就可以通過(guò)這幾個(gè)命令,在其中開(kāi)辟一個(gè)區(qū)

23、域,然后不停的丟數(shù)據(jù),地址計(jì)數(shù)器就會(huì)根據(jù)r3的設(shè)置自動(dòng)增加/減少,這樣就不需要頻繁的寫(xiě)地址了,大大提高了刷新的速度。3 系統(tǒng)軟件設(shè)計(jì)3.1 led驅(qū)動(dòng)/初始化pa8和pd2為輸出口.并使能這兩個(gè)口的時(shí)鐘 /led io初始化void led_init(void)rcc->apb2enr|=1<<2; /使能porta時(shí)鐘 rcc->apb2enr|=1<<5; /使能portd時(shí)鐘gpioa->crh&=0xfffffff0; gpioa->crh|=0x00000003;/pa8 推挽輸出 gpioa->odr|=1<<

24、;8; /pa8 輸出高 gpiod->crl&=0xfffff0ff;gpiod->crl|=0x00000300;/pd.2推挽輸出gpiod->odr|=1<<2; /pd.2輸出高 3.2 按鍵驅(qū)動(dòng)/按鍵初始化函數(shù)/特別注意:在該函數(shù)之后,jtag將無(wú)法使用(swd也無(wú)法使用)/如果想jtag仿真,可以屏蔽該函數(shù)。/pa0.13.15 設(shè)置成輸入void key_init(void)rcc->apb2enr|=1<<2; /使能porta時(shí)鐘gpioa->crl&=0xfffffff0;/pa0設(shè)置成輸入 gpioa

25、->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,沒(méi)有任何按鍵按下/1,key0按下/2,key1按下/3,key2按下 wk_up/注意此函數(shù)有響應(yīng)優(yōu)先級(jí),key0>key1>key2!u8 key_scan(void) static u8 key_up=1;

26、/按鍵按松開(kāi)標(biāo)志jtag_set(jtag_swd_disable);if(key_up&&(key0=0|key1=0|key2=1)/delay_ms(10);/去抖動(dòng) key_up=0;if(key0=0)jtag_set(swd_enable);return 1;else if(key1=0)jtag_set(swd_enable);return 2;else if(key2=1)jtag_set(swd_enable);return 3;else if(key0=1&&key1=1&&key2=0)key_up=1; jtag_set(

27、swd_enable);return 0;/ 無(wú)按鍵按下3.3 tft-lcd驅(qū)動(dòng)/畫(huà)筆顏色#define white 0xffff#define black 0x0000 #define blue 0x001f #define bred 0xf81f#define gred 0xffe0#define gblue 0x07ff#define red 0xf800#define magenta 0xf81f#define green 0x07e0#define cyan 0x7fff#define yellow 0xffe0#define brown 0xbc40 /棕色#define brr

28、ed 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 /淺灰色(pannel)#define lgray 0xc618 /淺灰色(pannel),窗體背景色#define lgrayblue 0xa651 /淺灰藍(lán)色(中間層顏色)#define lbblue

29、 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);void lcd_scan_dir(u8 dir);void lcd_drawpoint(u16 x,u16 y);/畫(huà)點(diǎn)u16 lcd_readpoint(u16 x,u16 y); /讀點(diǎn)void dr

30、aw_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_showchar(u16 x,u16 y,u8 num,u8 size,u8 mode);/顯示一個(gè)字符void lcd_shownum(u16 x,u16 y,u32 num,u8 len,u8 siz

31、e); /顯示一個(gè)數(shù)字void lcd_show2num(u16 x,u16 y,u16 num,u8 len,u8 size,u8 mode);/顯示2個(gè)數(shù)字void lcd_showstring(u16 x,u16 y,const u8 *p); /顯示一個(gè)字符串,16字體u16 lcd_rd_data(void);/讀取lcd數(shù)據(jù) void lcd_writereg(u8 lcd_reg, u16 lcd_regvalue);u16 lcd_readreg(u8 lcd_reg);void lcd_writeram_prepare(void);void lcd_writeram(u16

32、rgb_code);u16 lcd_readram(void); u16 lcd_bgr2rgb(u16 c);3.4 貪吃蛇實(shí)現(xiàn)c語(yǔ)言代碼#include "snake.h"#include "lcd.h"#include "key.h"extern u8 key_value;u8 key_temp;extern int dir_x,dir_y;#define snake_max_long 10 /最大長(zhǎng)度10struct u8 xsnake_max_long; u8 ysnake_max_long; u8 long; u8 lif

33、e; 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),(x*8+8),(y*8+8),red); /8*8小矩形/初始化貪吃蛇void snake_init(void) u8 i; /*初始化蛇參數(shù)*/snake.long=2; /定義初始化蛇的長(zhǎng)度sn

34、ake.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+)/將蛇畫(huà)出來(lái)turn_on(snake.xi,snake.yi);void snake_move(int dir_x,int dir_y) /移動(dòng)蛇 u8 i;turn_off(snake.x0,snake.y0); /向上for(i=0;i<snake.long-1;i+) /初始化蛇的位置 /向右 1 0snak

35、e.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; /蛇頭向你要求的方向移動(dòng)for(i=0;i<snake.long;i+) /將蛇畫(huà)出來(lái)turn_on(snake.xi,snake.yi);void food_place(u8 food_x,u8 food_y) /放食物 food.x=food_x; food.y=food_y;

36、turn_on(food.x,food.y);void run_snake(void) /游戲運(yùn)行 u8 i; snake_move(dir_x,dir_y); /判斷是否吃到食物,若吃到長(zhǎng)度加1,而且再放一個(gè) if(snake.xsnake.long-1=food.x)&&(snake.ysnake.long-1=food.y) snake.long+;snake.xsnake.long-1=food.x;snake.ysnake.long-1=food.y;food.x=0;food.y=0;snake.score+=1;food.yes= 1; /吃完一個(gè)后,再放一個(gè)食物

37、lcd_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)/獲得隨機(jī)食物坐標(biāo) while(1)food.x=rand()%28+1;food.y=rand()%28+1;for(i=0;i<snake.long;i+)/將蛇畫(huà)出來(lái) if(snake.xsnake.long=food.x)&&(snake.ysnake.long=food.y) break; /如果放的食物和蛇身重合則跳出來(lái),不放食物 food.yes

38、=0;break; for(i=0;i<snake.long;i+)/將蛇畫(huà)出來(lá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)|(snake.ysnake.long-1<=0)|(snake.ysnake.long-1>=33) game_over(); /delay_ms(300);void game_start(voi

39、d)/u8 i;point_color=white;/畫(huà)筆顏色back_color=black; /背景色 /*繪制游戲界面*/lcd_fill(0,0,8,280,darkblue);/rectangle(8,8-1,85,120,0xaa);/繪制一個(gè)矩形框, 0-127lcd_fill(232,0,240,280,darkblue);/lcd_fill(0,0,240,8,darkblue);/lcd_fill(0,272,240,280,darkblue);/ lcd_showstring(20,300,"score");/show scorelcd_showstr

40、ing(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,"game over! ");lcd_showstring(25,170,"press enter to restart");lcd_showstring(60,190,&quo

41、t;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è)計(jì)uc/os ii(micro control operation system two)是一個(gè)可以基于rom運(yùn)行的、可裁減的、搶占式、實(shí)時(shí)多任務(wù)內(nèi)核,具有高度可移植性,特別適合于微處理器和控制器,適合很多商業(yè)操作系統(tǒng)性能相當(dāng)?shù)膶?shí)時(shí)操作系統(tǒng)(rtos)。為了提供最好的移植性能,uc/os ii最大程度上使用ansi c語(yǔ)言進(jìn)行開(kāi)發(fā),并且已經(jīng)移植到近40多種處理器體

42、系上,涵蓋了從8位到64位各種cpu(包括dsp)。 uc/os ii可以簡(jiǎn)單的視為一個(gè)多任務(wù)調(diào)度器,在這個(gè)任務(wù)調(diào)度器之上完善并添加了和多任務(wù)操作系統(tǒng)相關(guān)的系統(tǒng)服務(wù),如信號(hào)量、郵箱等。其主要特點(diǎn)有公開(kāi)源代碼,代碼結(jié)構(gòu)清晰、明了,注釋詳盡,組織有條理,可移植性好,可裁剪,可固化。內(nèi)核屬于搶占式,最多可以管理60個(gè)任務(wù)。從1992年開(kāi)始,由于高度可靠性、移植性和安全性,uc/os ii已經(jīng)廣泛使用在從照相機(jī)到航空電子產(chǎn)品的各種應(yīng)用中。c/os-ii可以大致分成核心、任務(wù)處理、時(shí)間處理、任務(wù)同步與通信,cpu的移植等5個(gè)部分。(1) 核心部分(oscore.c) 是操作系統(tǒng)的處理核心,包括操作系統(tǒng)初

43、始化、操作系統(tǒng)運(yùn)行、中斷進(jìn)出的前導(dǎo)、時(shí)鐘節(jié)拍、任務(wù)調(diào)度、事件處理等多部分。能夠維持系統(tǒng)基本工作的部分都在這里。(2) 任務(wù)處理部分(ostask.c) 任務(wù)處理部分中的內(nèi)容都是與任務(wù)的操作密切相關(guān)的。包括任務(wù)的建立、刪除、掛起、恢復(fù)等等。因?yàn)閏/os-ii是以任務(wù)為基本單位調(diào)度的,所以這部分內(nèi)容也相當(dāng)重要。(3) 時(shí)鐘部分(ostime.c) c/os-ii中的最小時(shí)鐘單位是timetick(時(shí)鐘節(jié)拍)。任務(wù)延時(shí)等操作是在這里完成的。(4) 任務(wù)同步和通信部分 為事件處理部分,包括信號(hào)量、郵箱、消息隊(duì)列、事件標(biāo)志等部分;主要用于任務(wù)間的互相聯(lián)系和對(duì)臨界資源的訪問(wèn)。(5) 與cpu的接口部分 是

44、指c/os-ii針對(duì)所使用的cpu的移植部分。由于c/os-ii是一個(gè)通用性的操作系統(tǒng),所以對(duì)于關(guān)鍵問(wèn)題上的實(shí)現(xiàn),還是需要根據(jù)具體cpu的具體內(nèi)容和要求作相應(yīng)的移植。這部分內(nèi)容由于牽涉到sp等系統(tǒng)指針,所以通常用匯編語(yǔ)言編寫(xiě)。主要包括中斷級(jí)任務(wù)切換的底層實(shí)現(xiàn)、任務(wù)級(jí)任務(wù)切換的底層實(shí)現(xiàn)、時(shí)鐘節(jié)拍的產(chǎn)生和處理、中斷的相關(guān)處理部分等內(nèi)容。uc/os-ii 采用的是可剝奪型實(shí)時(shí)多任務(wù)內(nèi)核??蓜儕Z型的實(shí)時(shí)內(nèi)核在任何時(shí)候都運(yùn)行就緒了的最高優(yōu)先級(jí)的任務(wù)。 uc/os-ii的任務(wù)調(diào)度是完全基于任務(wù)優(yōu)先級(jí)的搶占式調(diào)度,也就是最高優(yōu)先級(jí)的任務(wù)一旦處于就緒狀態(tài),則立即搶占正在運(yùn)行的低優(yōu)先級(jí)任務(wù)的處理器資源。為了簡(jiǎn)化

45、系統(tǒng)設(shè)計(jì),uc/os-ii規(guī)定所有任務(wù)的優(yōu)先級(jí)不同,因而任務(wù)的優(yōu)先級(jí)也同時(shí)唯一標(biāo)志了該任務(wù)本身。uc/os-ii 中最多可以支持64 個(gè)任務(wù),分別對(duì)應(yīng)優(yōu)先級(jí)063,其中0 為最高優(yōu)先級(jí)。63為最低級(jí),系統(tǒng)保留了4個(gè)最高優(yōu)先級(jí)的任務(wù)和4個(gè)最低優(yōu)先級(jí)的任務(wù),所有用戶可以使用的任務(wù)數(shù)有56個(gè)。 uc/os-ii提供了任務(wù)管理的各種函數(shù)調(diào)用,包括創(chuàng)建任務(wù),刪除任務(wù),改變?nèi)蝿?wù)的優(yōu)先級(jí),任務(wù)掛起和恢復(fù)等。 系統(tǒng)初始化時(shí)會(huì)自動(dòng)產(chǎn)生兩個(gè)任務(wù):一個(gè)是空閑任務(wù),它的優(yōu)先級(jí)最低,該任務(wù)僅給一個(gè)整型變量做累加運(yùn)算;另一個(gè)是統(tǒng)計(jì)任務(wù),它的優(yōu)先級(jí)為次低,該任務(wù)負(fù)責(zé)統(tǒng)計(jì)當(dāng)前cpu的利用率。uc/os-ii的時(shí)間管理是通過(guò)定

46、時(shí)中斷來(lái)實(shí)現(xiàn)的,該定時(shí)中斷一般為10毫秒或100毫秒發(fā)生一次,時(shí)間頻率取決于用戶對(duì)硬件系統(tǒng)的定時(shí)器編程來(lái)實(shí)現(xiàn)。中斷發(fā)生的時(shí)間間隔是固定不變的,該中斷也成為一個(gè)時(shí)鐘節(jié)拍。 uc/os-ii要求用戶在定時(shí)中斷的服務(wù)程序中,調(diào)用系統(tǒng)提供的與時(shí)鐘節(jié)拍相關(guān)的系統(tǒng)函數(shù),例如中斷級(jí)的任務(wù)切換函數(shù),系統(tǒng)時(shí)間函數(shù)。對(duì)一個(gè)多任務(wù)的操作系統(tǒng)來(lái)說(shuō),任務(wù)間的通信和同步是必不可少的。uc/os-ii中提供了4種同步對(duì)象,分別是信號(hào)量,郵箱,消息隊(duì)列和事件。所有這些同步對(duì)象都有創(chuàng)建,等待,發(fā)送,查詢的接口用于實(shí)現(xiàn)進(jìn)程間的通信和同步。uc/os-ii部分代碼:任務(wù)的初始化和開(kāi)始任務(wù)的創(chuàng)建:osinit(); /系統(tǒng)初始化os

47、taskcreate( 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ù):/開(kāi)始任務(wù)void taskstart(void * pdata)pdata = pdata; os_enter_critical(); ostaskcreate(tasksnake, (void * )0, (os_stk *)&tas

48、k_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_critical();/任務(wù)1/貪吃蛇運(yùn)動(dòng).void tasksnake(void *pdata)while(1) /ostimedlyhmsm(0,0,0,1300);run_snake();/運(yùn)行

49、貪吃蛇程序ostimedlyhmsm(0,0,0,300);/任務(wù)2/按鍵檢測(cè),判斷方向 void taskkey(void *pdata) u8 key=0; while(1) key=key_scan(); /獲取按鍵值 switch(key) /判斷蛇運(yùn)動(dòng)的方向 case 1: dir_x=1; dir_y=0; break; case 2: dir_x=0; dir_y=1; break;case 3: dir_x=-1;dir_y=0; break;default: break; ostimedlyhmsm(0,0,0,20); /系統(tǒng)時(shí)鐘中斷服務(wù)函數(shù)void systick_han

50、dler(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í)鐘配置,設(shè)計(jì)1ms產(chǎn)生一次中斷void systick_configuration(void) systick->ctrl&=

51、(1<<2);/systick使用外部時(shí)鐘源systick->ctrl|=1<<1; /開(kāi)啟systick中斷systick->load=9000; /產(chǎn)生1ms中斷/bit2清空,選擇外部時(shí)鐘 hclk/8 systick->ctrl|=1<<0; /開(kāi)啟systick結(jié)論本次課程設(shè)計(jì)實(shí)現(xiàn)了貪吃蛇游戲的設(shè)計(jì)內(nèi)容及要求:能夠用按鍵控制蛇游動(dòng)的方向;當(dāng)蛇吃到食物后身體會(huì)增長(zhǎng)一個(gè)矩形塊的長(zhǎng)度;蛇撞到墻或者撞到自身都會(huì)使得游戲結(jié)束,達(dá)到了設(shè)計(jì)的基本要求。同時(shí)也驗(yàn)證了本次設(shè)計(jì)思路的可行 。由于時(shí)間的原因,本次設(shè)計(jì)的貪吃蛇游戲還有些不足,仍需要有所改

52、善與擴(kuò)展。因此提出以下幾點(diǎn)擴(kuò)展,希望能夠在未來(lái)的加工過(guò)后更加完善。第一,蛇與食物都僅僅用矩形代表,比較單一;第二,可以設(shè)置多個(gè)關(guān)卡及障礙使得游戲更富有挑戰(zhàn);第三,蛇的運(yùn)行速度可以隨著吃到食物的增多加快,增加游戲的難度和趣味性。參考文獻(xiàn)1 萬(wàn)光毅. 實(shí)踐與應(yīng)用設(shè)計(jì) m北京:北京航空航天大學(xué)出版社, 2006:431.2 任哲. 嵌入式操作系統(tǒng)基礎(chǔ)uc/os-ii和linux m北京:北京航空航天大學(xué)出版社, 2006:150-320.3 譚浩強(qiáng). c語(yǔ)言程序設(shè)計(jì) m. 北京:清華大學(xué)出版社, 2010:268.4 馬忠梅. 單片機(jī)的c語(yǔ)言應(yīng)用程序設(shè)計(jì)(第4版)m. 北京:北京航天航空大學(xué)出版社, 2007:353.5 劉昌華, 易逵. 8051單片機(jī)的c語(yǔ)言應(yīng)用程序設(shè)計(jì)與實(shí)踐 m. 國(guó)防工業(yè)出版

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論