版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 畢業(yè)設(shè)計(論文)</b></p><p> 課 題 名 稱 基于單片機的推箱子游戲設(shè)計 </p><p> 學(xué) 生 姓 名 </p><p> 學(xué) 號 054082
2、7080 </p><p> 系、年級專業(yè) 信息工程系﹑05級電子信息工程專業(yè) </p><p> 指 導(dǎo) 教 師 </p><p> 職 稱 講 師
3、 </p><p> 2009年 5 月 24日</p><p><b> 摘 要</b></p><p> 本論文主要介紹了基于單片機的推箱子游戲的規(guī)則、硬件結(jié)構(gòu)、軟件代碼的編寫及工作原理、基于T6963C內(nèi)核的液晶模塊PG160128A的詳細介紹以及指令集。模擬出Windows系統(tǒng)下的推箱子游戲,具有任意關(guān)數(shù)選擇、
4、難度依次加大、游戲步數(shù)記錄、游戲時間記錄、按鍵發(fā)聲、系統(tǒng)低功耗、可實現(xiàn)在線調(diào)試等特點。本系統(tǒng)是以單片機為其控制核心,以有源晶振構(gòu)成的電路作為時鐘信號,通過方向鍵的選擇向單片機控制系統(tǒng)發(fā)出人物移動控制命令,控制系統(tǒng)接收命令后做出一系列必要的判斷后,控制人物及箱子的移動。本設(shè)計已通過了實驗仿真,運行穩(wěn)定,基本上沒有規(guī)則方面的錯誤。</p><p> 論文主要分為兩大塊:一塊為游戲的硬件電路組成部分,一塊為軟件程序設(shè)
5、計部分。在硬件電路里主要包括有源晶振部分、方向控制部分及液晶顯示部分等與單片機的接線設(shè)計;軟件編程方面主要是子程序和主程序的編寫,包括:初始化代碼、液晶驅(qū)動代碼、方向按鍵代碼、過關(guān)判斷代碼、步數(shù)記錄代碼、時間記錄代碼、按鍵發(fā)聲代碼、關(guān)數(shù)選擇代碼及表格數(shù)據(jù)代碼等等。所有這些在文中都有詳細說明。</p><p> 關(guān)鍵詞:單片機;推箱子;PG160128A; T6963C內(nèi)核;指令集</p><
6、p><b> Abstract</b></p><p> This paper introduces the single-chip based on the rules of the game Sokoban, the structure of hardware, software code writing and working principle, based on the
7、core T6963C LCD module PG160128A, as well as details of the instruction set. Simulate the system under Windows Sokoban game, an arbitrary number of related options, in turn increase the difficulty of the game a few step-
8、by-step record time of the game record, sound button, low-power system can achieve on-line debugging and so on. The s</p><p> Key words:</p><p> MCU; Sokoban; PG160128A; T6963C core; instructi
9、on set</p><p><b> 目錄</b></p><p> 摘要.............................................................................................................</p><p> Abstract.....
10、.............................................................................................</p><p> 1 前言....................................................................................................
11、...</p><p> 1.1 課題的來源.....................................................................................................</p><p> 1.2 課題研究的意義..................................................
12、............................................</p><p> 1.3 課題國內(nèi)研究現(xiàn)狀.........................................................................................</p><p> 1.4 課題研究的目的和主要內(nèi)容.............
13、..............................................................</p><p> 2 推箱子游戲方案論證...........................................................................</p><p> 2.1 游戲能否在單片機上實現(xiàn)...........
14、..............................................................</p><p> 2.2 單片機、液晶屏的選擇......................................................................................</p><p> 3 推箱子游戲的硬件部分
15、設(shè)計..................................................................</p><p> 3.1 PG160128A液晶屏介紹....................................................................................</p><p> 3.2
16、T6963C及其指令集介紹...................................................................................</p><p> 3.3 晶振、復(fù)位電路..........................................................................................
17、.......</p><p> 3.4 液晶顯示屏與單片機接口電路.........................................................................</p><p> 3.5 控鍵、喇叭與單片機接口電路............................................................
18、...............</p><p> 4 推箱子游戲的軟件部分設(shè)計...............................................................</p><p> 4.1 游戲流程圖.........................................................................
19、............................</p><p> 4.2 液晶屏驅(qū)動代碼設(shè)計................................................................................</p><p> 4.3 初始化代碼設(shè)計..........................................
20、................................................</p><p> 4.4 游戲時間代碼設(shè)計..................................................................................</p><p> 4.5 游戲選關(guān)代碼設(shè)計....................
21、...............................................................</p><p> 4.6 步數(shù)、關(guān)數(shù)更新代碼設(shè)計..................................................................................</p><p> 4.7 游戲過關(guān)代碼設(shè)計..
22、.................................................................................</p><p> 4.8 圖形顯示子程序.........................................................................................</p><
23、p> 4.9 中斷代碼設(shè)計.................................................................................................</p><p> 4.10 方向控制代碼設(shè)計......................................................................
24、.................</p><p> 5 推箱子游戲的系統(tǒng)仿真..................................................................</p><p> 5.1 Keil2編譯環(huán)境介紹................................................................
25、...................</p><p> 5.2 Proteus在線仿真平臺介紹............................................................</p><p> 5.3 建立工程項目..................................................................
26、.........................</p><p> 5.4 Proteus中原理圖的繪制及文件的加載....................................................</p><p> 5.5 開機及游戲界面顯示............................................................
27、............................</p><p> 5.7 仿真結(jié)果分析及解決方法................................................................................</p><p> 6 總結(jié)...............................................
28、...............................................</p><p> 參考文獻............................................................................................</p><p> 致謝.............................
29、.......................................................................</p><p> 附件………………………………………………………………….</p><p><b> 1 前言</b></p><p><b> 1.1 課題的來源</b>&
30、lt;/p><p> 如今,游戲機風(fēng)行的程度,是第一臺電子游戲機的研制者諾蘭?布什納爾先生始料不及的。在全世界最大的城市,直至最小的村莊,從紐約最輝煌的游樂場,到高加索最小的鄉(xiāng)鎮(zhèn)兒童娛樂點,在千家萬戶,正在進行著千千萬萬這樣的“戰(zhàn)斗”,伴隨著無數(shù)成功與失敗,興奮與懊喪。游戲機帶來了一個全球性的瘋狂癥,其他任何娛樂與之相比都望塵莫及。然而,究竟是什么原因使游戲機如此風(fēng)行呢? 在回顧了游戲機發(fā)展簡史之后,我們不難悟出,
31、技術(shù)進步在游戲機發(fā)展過程中起到了極大的促進作用。</p><p> 但是,技術(shù)進步絕不是游戲機風(fēng)行的唯一因素。隨著終端設(shè)備開發(fā)能力的加強,作為娛樂終端的游戲機也得到了很大程度的發(fā)展。這也加速了游戲機在全球風(fēng)行程度,所以對于游戲機的研究和設(shè)計具有很重要的意義,這也是本課題研究的來源。</p><p> 1.2 課題研究的意義</p><p> 用單片機來設(shè)計一個
32、游戲,不同于現(xiàn)在的大型網(wǎng)絡(luò)游戲和手機游戲,也不同于其他的小型的單片機控制程序,它對游戲編寫者對單片機架構(gòu)、指令系統(tǒng)、工作模式、數(shù)據(jù)在內(nèi)存分配以及傳遞的把握都提出了更高的要求,特別是在游戲運行當(dāng)中對外部按鍵的處理,各子程序的調(diào)用流程,先后順序等代碼的復(fù)雜程度也都是單片機的一般程序不能比的??梢赃@樣說,能完整的編出游戲,并可以穩(wěn)定運行,會讓我們對游戲有一個更深刻的認識;對游戲編寫的難度有一個更切身的理解;對自己的編程能力及邏輯思維能力有一個
33、很大的提高;再一次看到了C語言的適用性、易移植性、高效性,相信對C語言的學(xué)習(xí)也不無幫助。</p><p> 1.3 課題國內(nèi)研究現(xiàn)狀</p><p> 目前國內(nèi)游戲公司已達到了200多家,市場上運營的游戲亦達250多款,但與歐美、韓國等國家的游戲發(fā)展程度還有一定差距。我國有廣闊的游戲市場,寬闊的發(fā)展空間,無限的繼續(xù)挑戰(zhàn)和劇增的玩家隊伍。隨著網(wǎng)絡(luò)的興起,巨大的市場需求量使中國在短短幾年,
34、已經(jīng)從無到有,從陌生到熟知,從掌握到運用。游戲必將成為網(wǎng)絡(luò)競爭中的主角,他的商業(yè)利益和商業(yè)價值無法估量。中國,人口眾多的國家,隨著人們生活水平的提高,溫飽已經(jīng)不是最終目的,我們尋求的是更加多姿多彩的生活,那么我們怎么能錯過游戲這一最佳休閑娛樂項目呢?所以我國游戲發(fā)展前景一片大好,更應(yīng)加大游戲開發(fā)力度?。?!</p><p> 1.4 課題研究的目的和主要內(nèi)容</p><p> 本文針對推
35、箱子游戲機的設(shè)計,首先介紹了選題的要求,之后詳細敘述了軟件和硬件的設(shè)計過程。</p><p> 在時鐘脈沖的作用下,各個按鍵都能按照事先設(shè)定好的規(guī)則進行游戲控制。確定鍵能使界面從初始化顯示切換到游戲界面顯示,上下左右鍵控制箱子的移動方向,如果可以移動則移動方塊同時跟蹤人物的位置及刷新動態(tài)數(shù)組的內(nèi)容。在游戲的同時程序會隨時記錄玩家所走的游戲步數(shù)、游戲時間,直至本關(guān)通過,在進入下一關(guān)的同時更新地圖并刷新游戲步數(shù)和時
36、間。選關(guān)鍵用于選擇游戲關(guān)數(shù),在游戲過程中這個鍵任何時候都有效,當(dāng)按下選關(guān)鍵后,游戲地圖返回第一關(guān),再次按下時游戲進入二關(guān),這樣每按下一次鍵游戲關(guān)數(shù)加一,如果游戲到了第最后一關(guān)將自動返回第一關(guān)。</p><p> 硬件部分是由中央處理器(AT89C51單片機),控制部分(獨立式按鍵系統(tǒng)),顯示部分(PG160128A液晶顯示模塊)組成的;軟件部分的主要內(nèi)容是通過對游戲程序進行編寫和調(diào)試以實現(xiàn)推箱子游戲的功能。通過
37、硬件和軟件調(diào)試,并針對問題分析修改后,游戲機系統(tǒng)可以穩(wěn)定運行。游戲機系統(tǒng)中各個部分之間通過數(shù)據(jù)的傳送最終完成了整個游戲運行、顯示和進行按鍵的功能。</p><p> 最后論文對設(shè)計進行了總結(jié),對設(shè)計中可以進一步改善的地方提出了建議。</p><p> 2 推箱子游戲方案論證</p><p> 現(xiàn)如今,游戲風(fēng)靡全球,各種游戲?qū)映霾桓F,大到網(wǎng)絡(luò)型的復(fù)雜游戲,小到手
38、機游戲、單機游戲、智力游戲等簡單游戲。但是這種簡單也是相對于網(wǎng)絡(luò)游戲等大型游戲而言的,小游戲本身的代碼還是相當(dāng)繁雜,它要執(zhí)行一系列指令才能正確的完成一個簡單的操作,才能按照玩家的意志工作。所以我們現(xiàn)在見到的游戲多是在基于電腦這種高速執(zhí)行指令的平臺上運行的,脫離了它就什么事都做不了了。那么推箱子這種小游戲能否在單片機上編出來呢?答案是肯定的,現(xiàn)從以下幾個方面加以論證。</p><p> 2.1 游戲能否在單片機上
39、實現(xiàn)</p><p> 首先,我們編寫的這個游戲是一個小型游戲,實現(xiàn)的功能比較簡單,不像大型游戲那樣功能復(fù)雜,它只要控制人物將所有箱子推到正確的位置即可,難度隨著箱子的增多而加大,對于實現(xiàn)這樣一個功能,程序不是太復(fù)雜,用一塊單片機足以達到目的。其次,它的控件也比較少只有4個方向鍵和2個輔助的功能鍵,這些控鍵在Proteus中用彈跳式按鍵代替即可。第三,游戲地圖相對比較小、畫面簡單,只有箱子、人物和正確位置箱子等
40、幾個圖形,這些在一塊稍大的液晶屏上就足以顯示,用不著電腦顯示屏。第四,就編程語言方面來說,編寫這樣一個簡單的小游戲不需要什么高級的語言,C語言或匯編語言就足以完成,C語言是一種通用型的語言,編程靈活、可讀性強、移植性好;匯編語言是一種直接面向硬件的基礎(chǔ)語言,最接近機器語言,執(zhí)行速度快(本游戲采用C語言編寫)。由以上幾點可知:單片機上運行推箱子游戲在硬件和軟件兩個方面都是可行的。</p><p> 2.2 單片機
41、、液晶屏的選擇</p><p> 2.1 單片機的選擇</p><p> 單片機的種類有很多:通用型單片機按位數(shù)分有4位機,8位機,16位機和32位機等等。按廠家分種類就更多,我國目前最常用的單片機有如下幾家:Intel 公司的(MCS51系列,MCS96系列);Atmel公司的(AT89系列,MCS51內(nèi)核);Microchip公司的(PIC系列);Motorola公司的(68HCX
42、X系列);Zilog公司的(Z86系列);Philips公司的(87,80系列,MCS51內(nèi)核);Siemens公司的(SAB80系列,MCS51內(nèi)核);NEC公司的(78系列),每種單片機的都有不同,包括:I/O口個數(shù)、定時/計數(shù)器個數(shù)、數(shù)據(jù)/程序存取區(qū)大小、中斷源個數(shù)、有無看門狗中斷、有無A/D轉(zhuǎn)化等等。</p><p> 基于本游戲只用到了不到20個I/O口;2個定時器斷。所以選擇了Atmel公司的AT8
43、9C51單片機。其參數(shù)如下:</p><p> 1、基于8051的全靜態(tài)CMOS工藝控制器;</p><p> 2、3級流水線指令執(zhí)行架構(gòu);</p><p><b> 3、32個I/O口</b></p><p> 4、2個定時/計數(shù)器</p><p><b> 5、6個中斷源&
44、lt;/b></p><p> 6、4K的閃存程序存儲器</p><p> 7、128字節(jié)的片內(nèi)數(shù)據(jù)存取器</p><p> 由以上參數(shù)可知AT89C51單片機完全滿足游戲設(shè)計要求。</p><p> 2.2 液晶屏的選擇</p><p> 液晶屏的種類也有很多,我們經(jīng)常用到的液晶屏包括:AMPIRE1
45、28*64;LGM12641BS1R;LM016L;LM020L;LM017L等等。</p><p> 前兩種為不帶字庫的漢字、圖形點陣液晶屏,共64行,128列,能顯示4行8列32個16*16點陣漢字或4行16列64個16*8點陣字符或者最大128*64點陣圖形。也有帶字庫的12864,功能一樣。</p><p> 后幾種則是帶字庫的字符點陣,不能顯示圖形。LM016L為能顯示2行1
46、6列32個字符的液晶屏;LM020L為能顯示1行16列16個字符的液晶屏;LM017L為能顯示2行32列16個字符的液晶屏。</p><p> 由以上介紹可知:后3種液晶不能顯示圖形,所以最先排除,因為游戲中地圖都是以圖形的形式掃描進去的;前2種液晶雖然可以顯示圖形,但屏幕較小顯示不完所有游戲界面的內(nèi)容,光就地圖顯示就需要128*144點陣的屏幕,而這兩種都是128*64的液晶屏,所以必須找一種更大的液晶顯示屏
47、。</p><p> 最后找到PG160128A液晶屏。很明顯,這塊液晶屏是160*128點陣的屏幕,除了滿足地圖顯示外還可以顯示其他記錄信息,如關(guān)數(shù)顯示、時間顯示、步數(shù)顯示等等,完全滿足設(shè)計要求。這塊液晶和以上的很不一樣,它基于T6963C內(nèi)核,引腳更多,功能更復(fù)雜,指令集也更多(這些相關(guān)內(nèi)容將在下一章具體介紹)。</p><p> 3 推箱子游戲的硬件部分設(shè)計</p>
48、<p> 本部分內(nèi)容包括介紹PG160128A及其引腳功能;介紹T6963C指令集;晶振電路、復(fù)位電路的硬件設(shè)計;控件及按鍵發(fā)聲電路設(shè)計,最后給出游戲仿真的整體硬件電路圖,接下來是具體的說明。</p><p> 3.1 PG160128A液晶屏介紹</p><p> PG160128A為一個128行160列的點陣液晶屏,他能顯示各種字符、圖形、漢字,基于T6963C內(nèi)核控
49、制,自帶字符庫,同時用戶也可以自己建立漢字、圖形庫,其在Proteus中的元器件圖形如下: </p><p> 圖1 PG160128 A</p><p> 各引腳的功能描敘如下表: </p><p> 表一 PG160128引腳功能表</p><p> 3.2 T6963C及其指令集介
50、紹</p><p> 3.2.1 T6963C</p><p> T6963C是一個LCD控制器,可設(shè)計為用于液晶顯示器控制驅(qū)動芯片和數(shù)據(jù)顯示的存取器。該控制器有一個8位并行數(shù)據(jù)總線,控制線的讀取或?qū)懭胪ㄟ^微控制器接口實現(xiàn),可以直接連接到TMPZ80微處理器中。它有一個128字節(jié)的字符發(fā)生器也可以控制外部顯示RAM中的數(shù)據(jù),達64K字節(jié)。配置的文字,圖形和外部字符發(fā)生器RAM數(shù)據(jù)能很容
51、易控制其顯示在窗口中,可以自由移動、分配內(nèi)存范圍。該器件支持非常廣泛的字符格式,液晶顯示器允許通過編程設(shè)置選擇不同的組合。它可以用于文字,圖形和結(jié)合文本模式及其他各種屬性的功能。</p><p> 3.2.2 T6963C指令集</p><p> T6963C共分為十大類,26條指令,詳細信息如下表:</p><p> 表二 T6963C指令集</p&g
52、t;<p> 3.3 晶振、復(fù)位電路</p><p> 3.3.1 晶振電路</p><p> 單片機的晶振電路如圖2所示,其中XTAL1和XTAL2分別為片內(nèi)振蕩電路的輸入輸出端。一般電容取20~47uF,本系統(tǒng)晶體的振蕩頻率為24MHz。晶振電路產(chǎn)生的振蕩脈沖經(jīng)過內(nèi)部觸發(fā)器進行二分頻后,成為單片機的時鐘脈沖信號,為單片機提供一個基本時鐘信號。</p>
53、<p><b> 圖2 晶振電路</b></p><p> 3.3.2 復(fù)位電路</p><p> 復(fù)位操作是單片機的基本操作,單片機在進入運行前和在運行過程中程序出錯或操作失誤使系統(tǒng)不能正常運行時,需要進行復(fù)位操作,復(fù)位操作后,程序?qū)?000H開始重新執(zhí)行。</p><p> 復(fù)位信號從單片機的RST引腳輸入,復(fù)位操作有上
54、電自動復(fù)位、按鍵電平復(fù)位和外部脈沖復(fù)位三種方式,本電路采用了按鍵電平復(fù)位,電路圖如圖3.。</p><p><b> 圖3 復(fù)位電路</b></p><p> 3.4 液晶顯示屏與單片機接口電路</p><p> 液晶顯示屏共有18個引腳,其中VDD、RST兩腳接電源,VSS、FS1、CE三腳接地,CON、FG兩腳懸空,D0~D7分別與單
55、片機P2.0~P2.7相連接,WR與P1.7腳相連,RD與P1.6腳相連,C/D與P1.5腳相連,電路圖見圖4.</p><p> 3.5 控鍵、喇叭與單片機接口電路</p><p> 本游戲共有6個控件,分別是:四個方向鍵,用于控制箱子的移動方向;一個確定鍵,用于刷新初始化界面進入游戲界面;一個選關(guān)鍵,用于選關(guān)。一個喇叭,用于按鍵發(fā)聲,以提示按鍵是否有效,電路圖見圖4.</p&
56、gt;<p> 控件、喇叭與單片機的接線是:上移鍵接P1.0;左移鍵接P1.1;右移鍵接P1.2;下移鍵接P1.3;確定鍵接P1.4;選關(guān)鍵接P1.5;喇叭經(jīng)過分壓式偏置共射放大電路將信號放大再與單片機P3.1口相連,如圖4:</p><p> 圖4 揚聲器放大電路</p><p> 至此,游戲的硬件電路結(jié)構(gòu)及連線全部介紹完成,仿真電路圖如圖5所示,整個電路圖以網(wǎng)絡(luò)標號
57、的形式給出,避免連線過多顯得電路擁擠。</p><p> 圖5 推箱子游戲硬件電路圖</p><p> 4 推箱子游戲的軟件部分設(shè)計</p><p> 本部分主要介紹游戲的軟件部分設(shè)計,包括游戲流程圖;液晶屏驅(qū)動代碼設(shè)計;初始化代碼設(shè)計游戲時間代碼設(shè)計;游戲關(guān)數(shù)代碼設(shè)計;游戲步數(shù)代碼設(shè)計;過關(guān)代碼設(shè)計;方向控制代碼設(shè)計;按鍵發(fā)聲代碼設(shè)計;數(shù)據(jù)表格設(shè)計等幾個方面
58、,現(xiàn)就對這幾個方面做具體分析。</p><p><b> 4.1 游戲流程圖</b></p><p> 4.1.1 液晶驅(qū)動程序調(diào)用規(guī)則流程圖</p><p> 本游戲用到了液晶PG160128A,勢必用到驅(qū)動代碼,包括讀狀態(tài)函數(shù);寫指令函數(shù);讀數(shù)據(jù)函數(shù);寫數(shù)據(jù)函數(shù);自動讀寫函數(shù);畫圓、打點函數(shù);設(shè)指針函數(shù);顯示漢字、字符函數(shù)等等,現(xiàn)以流
59、程圖的形式給出其互相調(diào)用規(guī)則(A函數(shù)指向B函數(shù),表示B調(diào)用了A)。</p><p> 4.1.2 方向函數(shù)所調(diào)用的函數(shù)流程圖</p><p> 在游戲中設(shè)置了四個方向鍵,用以控制箱子的移動情況,在這四個函數(shù)里又都調(diào)用了其他子函數(shù),現(xiàn)以流程圖的形式給出調(diào)用到的子函數(shù)及數(shù)組。</p><p> 4.1.3 主函數(shù)流程圖</p><p>
60、在主函數(shù)的運行過程中,程序會隨著確定鍵的按下進入主循環(huán)而不斷地掃描鍵盤,判斷是否有鍵按下,再調(diào)用相關(guān)函數(shù)做相應(yīng)的處理,同時兩個定時器中斷有條件開啟,在中斷到來時響應(yīng)中斷,執(zhí)行相關(guān)的中斷操作,流程圖如下:</p><p> 4.2 液晶屏驅(qū)動代碼設(shè)計</p><p> 4.2.1 讀狀態(tài)程序</p><p> unsigned char Read_State()
61、//返回液晶顯示屏的當(dāng)前狀態(tài)</p><p> {unsigned char a;</p><p> P2=0xff;//讀狀態(tài)之前先將數(shù)據(jù)線拉高</p><p> _CD=1;// 為指令、狀態(tài)操作條件</p><p> _RD=0;//讀操作條件</p><p> _RD=1;//為下次讀做準備</
62、p><p> a=Pin;//將狀態(tài)保存</p><p> return a;}</p><p> 4.2.2 是否可讀寫程序</p><p> void Enable()</p><p> {while(1) //bit0指令寫狀態(tài)位,bit1數(shù)據(jù)讀/寫狀態(tài)位,為1時候空閑</p><p&g
63、t; if((Read_State()&3)==3)break;}//如果狀態(tài)的低2為1則可讀寫</p><p> 4.2.3 是否可自動讀寫程序</p><p> void Aut_Write()</p><p> {while(1) //bit3數(shù)據(jù)自動寫狀態(tài)位,為1時候空閑</p><p> if((Read_Stat
64、e()&8)==8)break;} //如果狀態(tài)的第4為1則可自動讀寫</p><p> 4.2.4寫單參數(shù)程序</p><p> //Data1為傳入的參數(shù),Com為傳入的指令;寫入順序為先數(shù)據(jù)后寫指令。</p><p> void Write_Data1(unsigned char Data1,unsigned char Com)</p>
65、;<p> {Enable();//判斷是否可讀寫</p><p> _CD=0;//為數(shù)據(jù)操作條件</p><p> Pin=Data1;//將數(shù)據(jù)送數(shù)據(jù)線</p><p> _WR=0;//寫操作</p><p> _WR=1;//為下次寫做裝備</p><p><b> Ena
66、ble();</b></p><p> _CD=1; // 為指令、狀態(tài)操作條件</p><p> Pin=Com; //將指令送數(shù)據(jù)線</p><p><b> _WR=0;</b></p><p><b> _WR=1;}</b></p><p>
67、4.2.5寫雙參數(shù)程序</p><p> // Data1/Data2為傳入的參數(shù),Com為傳入的指令,先Data1后Data2,最后寫指令。</p><p> void Write_Data2(unsigned char Data1,unsigned char Data2,unsigned char Com)</p><p> {Enable();//判斷是
68、否可讀寫</p><p> _CD=0; //為數(shù)據(jù)操作條件</p><p> Pin=Data1; //將數(shù)據(jù)1送數(shù)據(jù)線</p><p> _WR=0; //寫操作</p><p> _WR=1; //為下次寫做裝備</p><p><b> Enable();</b></p&g
69、t;<p><b> _CD=0;</b></p><p> Pin=Data2; //將數(shù)據(jù)2送數(shù)據(jù)線</p><p><b> _WR=0;</b></p><p><b> _WR=1;</b></p><p><b> Enable()
70、;</b></p><p><b> _CD=1;</b></p><p> Pin=Com; //將指令送數(shù)據(jù)線</p><p><b> _WR=0;</b></p><p><b> _WR=1;}</b></p><p>
71、4.2.6寫指令程序</p><p> void Write_Com(unsigned char Com)</p><p> {Enable();//判斷是否可讀寫</p><p> _CD=1; // 為指令、狀態(tài)操作條件</p><p> Pin=Com; //將指令送數(shù)據(jù)線</p><p> _WR=0
72、;//寫操作</p><p> _WR=1;}//為下次寫做裝備</p><p> 4.2.7寫8字節(jié)數(shù)據(jù)程序</p><p> // Addr表示數(shù)據(jù)首地址,Way表示寫的方式</p><p> void Write_8_Data(unsigned char Addr,unsigned char Way)</p>&l
73、t;p> {Aut_Write();//判斷是否能自動寫</p><p> Write_Com(AUT_WR);//自動寫開始</p><p> Write_Data1(Addr,Way);</p><p> Write_Com(AUT_WO);}//自動寫結(jié)束</p><p> 4.2.8設(shè)置數(shù)據(jù)顯示在屏幕上的坐標程序<
74、;/p><p> // (以字節(jié)為單位),x表示顯示的行(0~15),y表示顯示的列(0~19)</p><p> void Set_xy(unsigned char x,unsigned char y)</p><p> {unsigned int a;a=x*20+y;</p><p> Write_Data2(a&0xff,
75、a>>8,ADR_POS);}</p><p> 4.2.9設(shè)置數(shù)據(jù)存儲起始地址</p><p> void Set_Addr(unsigned char Addr1,unsigned char Addr2)</p><p> {Write_Data2(Addr1,Addr2,ADR_POS);}</p><p> 4.2
76、.10 CGRAM偏置地址設(shè)置函數(shù)</p><p> void Set_CGRAM()</p><p> {Write_Data2(1,0,CGR_POS);}</p><p> 4.2.11液晶初始化函數(shù)</p><p> //(文本區(qū)首地址D1,文本區(qū)首地址D2, 文本區(qū)寬度, 圖形區(qū)首地址D1, </p><
77、;p> //圖形區(qū)首地址D2, 圖形區(qū)寬度, 光標形狀, 顯示方式, 顯示開關(guān))</p><p> void LCD_Init(unsigned char Txt1,unsigned char Txt2,unsigned char Txt_Wide,</p><p> unsigned char Map1,unsigned char Map2,unsigned char
78、 Map_Wide,</p><p> unsigned char Guang_Biao,unsigned char Disp_Mode,unsigned char Kai_Guan)</p><p> {Write_Data2(Txt1,Txt2,TXT_STP);</p><p> Write_Data2(Txt_Wide,0,TXT_WID);</
79、p><p> Write_Data2(Map1,Map2,GRH_STP);</p><p> Write_Data2(Map_Wide,0,GRH_WID);</p><p> Write_Com(CUR_SHP|Guang_Biao);</p><p> Write_Com(Disp_Mode);</p><p&g
80、t; Write_Com(DIS_SW|Kai_Guan);}</p><p> 4.2.12顯示一個漢字子程序</p><p> //x表示顯示的行(0~15),y表示顯示的列(0~19),n表示字在表格中的位置</p><p> void Han_Zi(unsigned char x,unsigned char y,unsigned char Addr)
81、</p><p> {Set_xy(x,y);</p><p> Write_8_Data(Addr,INC_WR);</p><p> Write_8_Data(Addr+2,INC_WR);</p><p> Set_xy(x+1,y);</p><p> Write_8_Data(Addr+1,INC_
82、WR);</p><p> Write_8_Data(Addr+3,INC_WR);}</p><p> 4.2.13 清屏程序</p><p> void Clear_LCD()</p><p> {unsigned int a;</p><p> Set_xy(0,0);//從最左上角開始</p&g
83、t;<p> for(a=0;a<320;a++)//清屏320字節(jié)</p><p> Write_8_Data(0x83,INC_WR);}// 數(shù)據(jù)寫,地址加1</p><p> 4.2.14 自定義字符寫入CGROM函數(shù)</p><p> void Write_CGORM()</p><p> {unsig
84、ned int a;</p><p> Set_CGRAM();Set_Addr(0,0x0c);</p><p> for(a=0;a<992;a++)//992字節(jié)</p><p> Write_8_Data(Tab[a],INC_WR);}</p><p> 4.2.15 設(shè)置點顯示在屏幕上的坐標(以位為單位)</p
85、><p> //x表示顯示的行(0~127),y表示顯示的列(0~159),n=1表示打一點,n=0清除一點</p><p> void Point(unsigned char x,unsigned char y,bit n)</p><p> {unsigned char point;</p><p> unsigned int tem
86、p;</p><p> temp=x*20+y/8+320;point=0xf7-y%8;</p><p> if(n)point|=0xf8;</p><p> else point&=0xf7;</p><p> Write_Data2(temp&0xff,temp>>8,0x24);//設(shè)置寫地址&
87、lt;/p><p> Write_Com(point);}</p><p> 4.2.16 畫圓子程序,其中x0,y0表示圓心,R表示半徑</p><p> //先打第一象限內(nèi)的1/4段圓弧,再依據(jù)對稱原理打出其他3段圓弧</p><p> void Circle(unsigned char x0,unsigned char y0,uns
88、igned R,bit n)</p><p> {unsigned char i,j=0;</p><p> Point(x0,y0,n);</p><p> for(i=0;i<=R;i++)</p><p> { while(1)</p><p> { if(R*R-i*i<=j*j)brea
89、k; j++;}</p><p> Point(x0-j,y0+i,n);Point(x0-i,y0+j,n); //第一象限打點</p><p> Point(x0+j,y0+i,n);Point(x0+i,y0+j,n); //第二象限打點</p><p> Point(x0+j,y0-i,n);Point(x0+i,y0-j,n); //第三象限打點&l
90、t;/p><p> Point(x0-j,y0-i,n);Point(x0-i,y0-j,n); //第四象限打點</p><p><b> j=0; }}</b></p><p> 4.3 初始化代碼設(shè)計</p><p> //初始化代碼里包含定時器0、1的相關(guān)參數(shù)設(shè)置,初始化開機界面顯示等。</p>
91、<p> EA=ET0=ET1=1;//開啟中斷總開關(guān),允許外部中斷0、1中斷</p><p> TMOD=0x11;//將定時器0、1都設(shè)為定時模式且工作在方式一。</p><p> TH0=64800/256;//定時器0初始值裝載,用于按鍵發(fā)聲</p><p> TL0=64800%256;</p><p> TH
92、1=0x3c;// 定時器1初始值裝載,每25ms中斷一次</p><p><b> TL1=0xb0;</b></p><p> Init_disply();//調(diào)用開機界面顯示子函數(shù),包含了開機界面的所有內(nèi)容</p><p> 4.4 游戲時間代碼設(shè)計</p><p> if(F) //當(dāng)程序檢測到讀時間標志
93、位F=1(由定時器1控制)時會刷新一次時間。</p><p> {F=0;//為下一次做準備</p><p> Set_xy(13,17);//設(shè)置百位數(shù)字顯示的位置</p><p> Write_8_Data(0x10+Time/100,0xc4);//得到時間的百位數(shù)據(jù)</p><p> Set_xy(13,18); //設(shè)置十位
94、數(shù)字顯示的位置</p><p> Write_8_Data(0x10+Time%100/10,0xc4);//得到時間的十為數(shù)據(jù)</p><p> Set_xy(13,19); //設(shè)置個位數(shù)字顯示的位置</p><p> Write_8_Data(0x10+Time%10,0xc4);}//得到時間的個位數(shù)據(jù)</p><p> 4.
95、5 游戲選關(guān)代碼設(shè)計</p><p> //當(dāng)按下選關(guān)按鍵后,主程序調(diào)用選關(guān)函數(shù),程序代碼如下:</p><p> void Choice_Customs()</p><p> {Time=Steps=0;//選關(guān)時將時間、步數(shù)歸零</p><p> New_Step();//更新步數(shù)顯示</p><p>
96、Custom=Cust;//將選得的關(guān)傳給關(guān)數(shù)寄存器</p><p> New_Custom();//更新關(guān)數(shù)顯示</p><p> Dispaly();//更新地圖顯示</p><p> Cust++;//沒按下一次鍵鍵關(guān)數(shù)加一</p><p> if(Cust==18)Cust=1;}//如果關(guān)數(shù)等于18則回到第一關(guān)(游戲總共17
97、關(guān))</p><p> 4.6 步數(shù)、關(guān)數(shù)更新代碼設(shè)計</p><p> 4.6.1 步數(shù)更新代碼設(shè)計</p><p> //當(dāng)按下任意一個方向鍵,且箱子能移動時,會調(diào)用游戲步數(shù)更新子程序</p><p> void New_Step()</p><p> {Set_xy(7,17); //設(shè)置百位數(shù)字顯示的
98、位置</p><p> Write_8_Data(0x10+Steps/100,0xc4); //得到步數(shù)的百位數(shù)據(jù)</p><p> Set_xy(7,18); //設(shè)置十位數(shù)字顯示的位置</p><p> Write_8_Data(0x10+Steps%100/10,0xc4); //得到步數(shù)的十位數(shù)據(jù)</p><p> Set_
99、xy(7,19); //設(shè)置個位數(shù)字顯示的位置</p><p> Write_8_Data(0x10+Steps%10,0xc4);} //得到步數(shù)的個位數(shù)據(jù)</p><p> 4.6.2 關(guān)數(shù)更新代碼設(shè)計</p><p> void New_Custom()</p><p> {Set_xy(1,18);// 設(shè)置十位數(shù)字顯示的位置
100、</p><p> Write_8_Data(0x10+Custom/10,0xc4);// 得到關(guān)數(shù)的十位數(shù)據(jù)</p><p> Set_xy(1,19);// 設(shè)置個位數(shù)字顯示的位置</p><p> Write_8_Data(0x10+Custom%10,0xc4);}// 得到關(guān)數(shù)的個位數(shù)據(jù)</p><p> 4.7 過關(guān)代碼
101、設(shè)計</p><p> //當(dāng)所有箱子都推到指定位置時,會調(diào)用過關(guān)子程序,代碼如下:</p><p> void Pass()</p><p> {unsigned char i,j,a=1;//內(nèi)存空間分配</p><p> for(i=0;i<8;i++)//掃描8行</p><p> {if(!a
102、)break;//如果a=0則直接跳出函數(shù)</p><p> for(j=0;j<9;j++) //掃描9列 </p><p> //如果關(guān)卡數(shù)組表格中此位置是叉圖形或箱子和叉重合后的圖
103、 </p><p> if(Customs[Custom-1][i][j]==5||Customs[Custom-1][i][j]==4)</p><p> //如果動作跟蹤數(shù)組里此位置是箱子和叉重合后的圖,則將a置1</p><p> if(Follow_Act
104、ion[i][j]==5)a=1;</p><p> //如果動作跟蹤數(shù)組里此位置不是箱子和叉重合后的圖,則將a置0,并退出</p><p> else {a=0;break;}}</p><p> if(a){Custom++;//如果a=1則將關(guān)數(shù)加一(因為所有箱子都已推好,可以過關(guān))</p><p> Steps=Time=0;
105、//過關(guān)時將時間、步數(shù)歸零</p><p> New_Step();//更新步數(shù)顯示</p><p> if(Custom==18)Custom=1;//如果關(guān)數(shù)等于18則回到第一關(guān)(游戲總共17關(guān))</p><p> New_Custom();//更新關(guān)數(shù)顯示</p><p> Dispaly();}}//更新地圖顯示</p&
106、gt;<p> 4.8圖形顯示子程序</p><p> 圖形顯示子程序包括地圖顯示程序和原來位置顯示子程序兩個</p><p> 4.8.1 地圖顯示子程序</p><p> //在調(diào)用過關(guān)函數(shù)或選關(guān)函數(shù)時,會調(diào)用到顯示子函數(shù),功能是刷新地圖</p><p> void Dispaly()</p><
107、;p> {unsigned char i,j,a;</p><p> for(i=0;i<8;i++)//掃描8行</p><p> {for(j=0;j<9;j++)//掃描9列</p><p> {Follow_Action[i][j]=Customs[Custom-1][i][j];將關(guān)卡數(shù)組中的數(shù)據(jù)傳給跟蹤數(shù)組
108、 </p><p> a=Follow_Action[i][j];//將跟蹤數(shù)組中的數(shù)據(jù)傳給動態(tài)內(nèi)存</p><p
109、> switch(a)//根據(jù)內(nèi)存中的數(shù)據(jù)做出判斷</p><p> {case 0:a=0x80;break;//如果是0(空白)則將空白字模的地址80H傳給內(nèi)存</p><p> //如果是1(人物)則將人物字模的地址94H傳給內(nèi)存,并記錄人物位置所在坐標</p><p> case 1:a=0x94;x_Coordinate=i;y_Coordi
110、nate=j;break;</p><p> case 2:a=0x84;break;// 如果是2(墻壁)則將墻壁字模的地址84H傳給內(nèi)存</p><p> case 3:a=0x8c;break;// 如果是3(箱子)則將箱子字模的地址8cH傳給內(nèi)存</p><p> case 4:a=0x88;break;// 如果是4(叉)則將叉字模的地址88H傳給內(nèi)
111、存</p><p> case 5:a=0x90;break;}//如果是5(箱子和叉重合)則將地址90H傳給內(nèi)存</p><p> Han_Zi(2*i,2*j,a);}}}//調(diào)用寫漢字程序,將圖形顯示出來</p><p> 4.8.2原來位置顯示子程序</p><p> //此程序顯示當(dāng)人物移動后,人物本身位置所要顯示的圖形&l
112、t;/p><p> void _Display()</p><p> {if(a==0||a==3||a==1) //如果原來人物這個位置是空白或是箱子則顯示一個空白</p><p> {Han_Zi(2*x_Coordinate,2*y_Coordinate,0x80);// 將空白圖形顯示出來</p><p> Follow_Acti
113、on[x_Coordinate][y_Coordinate]=0;}//更新跟蹤數(shù)組中的內(nèi)容</p><p> //如果人物本身這里是一個叉圖形或是箱子或叉重合后的圖則顯示一個叉</p><p> if(a==4||a==5)</p><p> {Han_Zi(2*x_Coordinate,2*y_Coordinate,0x88);// 將叉圖形顯示出來<
114、;/p><p> Follow_Action[x_Coordinate][y_Coordinate]=4;}}// 更新跟蹤數(shù)組中的內(nèi)容</p><p> 4.9 中斷代碼設(shè)計</p><p> 中斷代碼設(shè)計包括定時器0和1兩段,定時器0為中斷發(fā)聲代碼,定時器1為中斷計時代碼,代碼如下:</p><p> 4.9.1 定時器0中斷發(fā)聲程序
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文----基于單片機的推箱子游戲設(shè)計
- 畢業(yè)論文----基于單片機的推箱子游戲設(shè)計
- 【畢業(yè)設(shè)計論文】基于c語言推箱子游戲設(shè)計畢業(yè)論文
- 基于android的推箱子游戲設(shè)計畢業(yè)論文
- 基于android的推箱子游戲的設(shè)計畢業(yè)論文
- 基于android推箱子游戲的設(shè)計與實現(xiàn)畢業(yè)論文
- 基于單片機的gps畢業(yè)設(shè)計論文
- 基于單片機滾動字幕設(shè)計畢業(yè)設(shè)計論文
- 基于單片機的定時顯示設(shè)計畢業(yè)設(shè)計(論文)
- 畢業(yè)設(shè)計論文---基于單片機的搖搖棒設(shè)計
- 畢業(yè)設(shè)計論文 基于單片機的電子日歷設(shè)計
- 基于單片機的畢業(yè)設(shè)計
- 畢業(yè)設(shè)計論文 基于單片機的溫度控制設(shè)計
- 基于單片機的俄羅斯方塊游戲畢業(yè)設(shè)計
- 基于單片機的智能加濕器畢業(yè)設(shè)計論文
- 單片機畢業(yè)設(shè)計論文01
- 基于單片機的智能加濕器畢業(yè)設(shè)計論文
- 畢業(yè)設(shè)計(論文)基于單片機的倒車雷達的設(shè)計
- 基于單片機的d類功放設(shè)計畢業(yè)設(shè)計論文
- 基于單片機的plc設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文
評論
0/150
提交評論