楊 偉,肖義平
(湖北工業(yè)大學(xué) 電氣與電子工程學(xué)院,湖北 武漢 430068)
隨著社會的不斷發(fā)展,人們對終端顯示器的要求越來越高,體積小、重量輕、功耗低、清晰度高的LCD顯示器無疑成為大家心中理想的選擇[1]。與傳統(tǒng)的CRT相比,基于單片機的LCD顯示系統(tǒng)具有硬件結(jié)構(gòu)簡單、控制方便、成本低等優(yōu)點,在現(xiàn)代嵌入式系統(tǒng)中已得到廣泛的運用。本文設(shè)計了一種基于單片機STM32F103C8T6和LCD12864的液晶顯示系統(tǒng),可以實現(xiàn)字符、圖形的顯示,并在此基礎(chǔ)上設(shè)計了一個貪吃蛇游戲?qū)嵗?/p>
LCD顯示系統(tǒng)主要由單片機、LCD顯示模塊、電源模塊、4×4矩陣鍵盤、通信接口電路組成。系統(tǒng)方框圖如圖1所示。
圖1 系統(tǒng)方框圖
系統(tǒng)電源部分可以使用5 V電源端口供電,再通過3.3 V穩(wěn)壓芯片ASM1117-3.3得到單片機與LCD顯示模塊所需電源。單片機采用ST公司的芯片STM32F103C8T6,4×4矩陣鍵盤作為系統(tǒng)的輸入設(shè)備,采用LCD12864液晶顯示模塊作為系統(tǒng)的顯示部分。單片機系統(tǒng)通過處理鍵盤輸入數(shù)據(jù)后,根據(jù)不同的情況對顯示屏發(fā)出不同的操作指令。通信接口電路主要是由芯片PL2303構(gòu)成,它的功能主要是將電腦的USB接口轉(zhuǎn)換為串口,同時還將PC的邏輯電平轉(zhuǎn)換為與單片機系統(tǒng)相同的CMOS電平,方便程序的燒寫以及與上位機的通信。
KeilMDK是德國Keil公司為基于Cortex-M、ARM7、ARM9等系列處理器提供的一款集成開發(fā)環(huán)境,支持程序的編輯、編譯、鏈接以及在線調(diào)試等功能,可以自動配置啟動代碼,簡單易學(xué),性能優(yōu)越,能滿足大多數(shù)嵌入式應(yīng)用[2]。
STM32F103C8T6是一款基于ARM32位的Cortext M3內(nèi)核的單片機,2.0~3.6 V的寬電壓供電范圍,CPU工作頻率最大可達72 MHz,具有單周期的乘法指令和硬件除法,以及優(yōu)先級可編程的中斷系統(tǒng)。同時它還具有64 KB的Flash存儲器與20 KB的SRAM存儲器,另外還集成了非常豐富的片內(nèi)外設(shè),如看門狗、定時器、GPIO口、DMA控制器、ADC、UART、SPI接口、IIC接口等,具有成本低、速度快、性價比高等優(yōu)點。
LCD12864液晶屏的數(shù)據(jù)接口是串行的,工作電壓為2.8~5.5 V,像素為128×64,顯示顏色為黑白色,背光顏色為藍(lán)色,不帶字庫。模塊內(nèi)部采用的控制器為ST7565P,功耗非常低,在省電模式下的工作電流最大僅為5 μA,顯示模塊僅有8個引腳接口,占用主控制器的I/O數(shù)量少。LCD12864引腳說明如表1所示。
表1 LCD12864引腳說明
單片機STM32F103C8T6與LCD顯示模塊的硬件連接非常簡單,如圖2所示。LCD12864引腳編號為1~5的控制端口可以直接與STM32F103C8T6單片機的GPIO口相連,第8引腳是LCD的背光電源端口,通過單片機的一個I/O口控制三極管的導(dǎo)通來控制背光電源的通斷,從而節(jié)省功耗[3]。
圖2 單片機STM32F103C8T6與LCD12864的硬件連接圖
系統(tǒng)軟件設(shè)計主要包括LCD初始化、寫數(shù)據(jù)、寫命令,以及畫點、字符顯示等程序設(shè)計。液晶顯示模塊正常工作前,需要對其進行初始化,主要包括復(fù)位液晶、確定顯示對比度、偏壓比等參數(shù),然后才能實現(xiàn)字符、圖形以及其他的顯示功能。在向液晶顯示模塊寫入數(shù)據(jù)或者命令時,一定要注意寫入的時序,只有嚴(yán)格地按照時序編寫驅(qū)動程序才能正常工作。設(shè)計程序時,為了方便移植,可以將相關(guān)引腳的操作用宏封裝起來,如將片選引腳拉低的操作可以用宏LCD_CS_0()定義[4-5]。寫數(shù)據(jù)命令的功能函數(shù)如下:
寫數(shù)據(jù)功能函數(shù)voidLCD12864_WriteData(uint8 Dat)實現(xiàn)方法與寫命令功能函數(shù)相同,只是打開片選后,選擇的是寫數(shù)據(jù)LCD_A0_1()。
在設(shè)計LCD液晶驅(qū)動程序時,最基本的功能就是在屏幕的任意位置顯示一個點,然后在此基礎(chǔ)上實現(xiàn)更復(fù)雜的功能。但是每次寫入的數(shù)據(jù)都包含了8個點的信息,而且該LCD顯示模塊沒有讀控制端口,不能通過讀數(shù)據(jù)的命令了解其他7個點的狀態(tài),這樣就不能達到最終的目的。為了解決這個問題,可以在單片機的內(nèi)存區(qū)開辟一個數(shù)據(jù)空間,來記錄顯示器上每個點的顯示情況,代碼如下:
因為液晶模塊未帶字庫,在字符顯示前,需要將其字模存入單片機的程序存儲空間中,然后在任意坐標(biāo)顯示一個點的基礎(chǔ)上,實現(xiàn)字符的顯示。8×16字符顯示的驅(qū)動程序如下:
以單片機STM32F103C8T6作為控制核心,在LCD12864驅(qū)動程序的基礎(chǔ)上,實現(xiàn)了貪吃蛇游戲的功能。貪吃蛇游戲程序主要分為3個子程序模塊,即鍵盤掃描模塊、LCD12864驅(qū)動模塊和貪吃蛇游戲數(shù)據(jù)處理模塊。貪吃蛇程序流程圖如圖3所示。
圖3 貪吃蛇程序流程圖
游戲中的食物和蛇可以看作兩個不同的對象,它們的屬性可以用兩個結(jié)構(gòu)體變量來描述,然后根據(jù)游戲功能將整個大模塊合理地劃分為各個子模塊,并編寫相應(yīng)的功能函數(shù),供主模塊函數(shù)調(diào)用。在設(shè)計程序時,定義蛇的最長長度為15,蛇運動區(qū)域的長為20個單位,寬為15個單位,即橫坐標(biāo)的坐標(biāo)范圍為1~20,縱坐標(biāo)的坐標(biāo)范圍為1~15。貪吃蛇游戲中定義了食物結(jié)構(gòu)體和蛇結(jié)構(gòu)體變量。食物結(jié)構(gòu)體定義為:
蛇結(jié)構(gòu)體變量中定義了蛇體長度、蛇的等級和蛇的分?jǐn)?shù),具體定義為:
在貪吃蛇游戲的程序設(shè)計中,放置食物的程序會涉及如何獲取隨機數(shù)的問題,為了增加游戲的隨機性,本次設(shè)計不采用偽隨機數(shù)產(chǎn)生的方法,而是利用單片機的AD采樣引腳在懸空的情況下采樣,獲得的AD值作為隨機種子,然后通過一系列的運算來得到隨機數(shù),經(jīng)過實踐得知,此種方式得到的隨機數(shù)更真實,效果很好。食物放置程序如下:
STM32F103C8T6是一款高性能的單片機,LCD12864硬件接口簡單,所占用單片機的I/O口資源非常少,單片機有足夠的硬件資源供其他外設(shè)使用,顯示系統(tǒng)可以作為其他嵌入式系統(tǒng)的一部分,運用于不同的顯示場合;系統(tǒng)的程序設(shè)計采用的是C語言,其移植性非常好,模塊化的設(shè)計思想可以在系統(tǒng)中靈活地擴展其他功能,滿足不同的顯示要求。
[1]劉金星,李洪文.基于高速單片機的液晶顯示模塊控制[J].液晶與顯示,2011,26(1):88-91.
[2]韓敬海,王蕊.Cortext-M3開發(fā)技術(shù)與實現(xiàn)[M].西安:西安電子科技大學(xué)出版社,2013.
[3]陳楊楊,陳梅.基于PIC18F458單片機的LCD顯示[J].儀表技術(shù),2005(4):52-53.
[4]武俊鵬,張國印,姚愛紅,等.基于ARM的嵌入式系統(tǒng)設(shè)計實驗與實踐教程[M].北京:清華大學(xué)出版社,2011.
[5]石紅曉,吳光敏.基于Nios II處理器的TFT-LCD圖形顯示設(shè)計[J].微型機與應(yīng)用,2010,29(18):37-39.