基于STM32的萬年歷設計_第1頁
基于STM32的萬年歷設計_第2頁
基于STM32的萬年歷設計_第3頁
基于STM32的萬年歷設計_第4頁
基于STM32的萬年歷設計_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于STM32的萬年歷設計班 級: 姓 名: 學 號: 成 績: 電子通信工程系題目:基于STM32的萬年歷設計前言: 隨著科技的快速發(fā)展,時間的流逝,至從觀太陽、擺鐘到現(xiàn)在電子鐘,人類不斷研究,不斷創(chuàng)新紀錄。美國DALLAS公司推出的具有涓細電流充電能的低功耗實時時鐘電路DS12C887。它可以對年、月、日、周日、時、分、秒進行計時,還具有閏年補償?shù)榷喾N功能,而且DS12C887的使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、周日、時、分、秒和溫度等信息,還具有時間校準等功能。該電路采用AT89S52單片機作為核心,采用數(shù)字式溫度傳感器DS18B20提取外

2、界溫度,功耗小,能在3V的低壓工作,電壓可選用35V電壓供電。進入新世紀LCD顯示屏的技術和產(chǎn)業(yè)都取得了長足的發(fā)展,作為重要的現(xiàn)代信息發(fā)布媒體之一,LCD顯示屏在證券交易、金融、交通、體育、廣告等領域被廣泛的應用。伴隨社會信息化進程的推進,LCD顯示屏技術也在不斷的推陳出新,應用領域愈加廣闊。基于STM32的LCD顯示可以更好的滿足各種需求,也更便于操作和實現(xiàn)?,F(xiàn)基于STM32在液晶顯示屏幕上顯示文本及圖形。 目前,顯示技術和顯示工業(yè)的發(fā)展迅速。顯示技術是傳遞視覺的信息技術。液晶顯示器件LCD是當今最有發(fā)展前途的一種平板顯示器件,它具有很多獨到的優(yōu)異特性。它具有顯示信息多、易于多彩化、體積小、

3、重量輕、功耗低、壽命長、價格低、無輻射、無污染、接口控制方便等優(yōu)點。 截至目前,我國在液晶顯示取得較大進步,我國LCD產(chǎn)業(yè)已經(jīng)走過了近30年的歷程.經(jīng)歷幾次大的投資浪潮之后,我國內(nèi)地已經(jīng)成為世界最大的TN-LCD(扭曲液晶顯示器)生產(chǎn)基地和主要的STN-LCD(超扭曲液晶顯示器)生產(chǎn)基地,并且從2003年開始,涉足TFT-LCD(薄膜晶體管液晶顯示器)領域.本課題設計采用STM32F103VE開發(fā)板,實現(xiàn)在LCD顯示屏上顯示由按鍵可操控的萬年歷功能。本實驗用到的硬件部分主要有STM32開發(fā)板、USB線、LCD液晶模塊,在LCD顯示屏上顯示相關內(nèi)容。綜上所述萬年歷應具有讀取方便、顯示直觀、功能多

4、樣、電路簡潔等諸多優(yōu)點,符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。本課題利用 STM32 的 RTC 實現(xiàn)一個簡易的電子時鐘,在液晶顯示屏中顯示時間值。顯示時間格式為XX:XX:XX(時:分:秒),當時間計數(shù)為: 23: 59: 59 時將刷新為: 00: 00: 00。1.功能描述 1.1設計要求1.具有數(shù)字時鐘功能。2.具有簡單日歷功能。3.具有手動校準時間功能。4.具有閏年識別功能。1.2 RTC(實時時鐘)簡介實時時鐘是一個獨立的定時器。 RTC 模塊擁有一組連續(xù)計數(shù)的計數(shù)器,在相應軟件配置下,可提供時鐘日歷的功能。修改計數(shù)器的值可以重新設置系統(tǒng)當前的時間和日期。RTC 模塊和時

5、鐘配置系統(tǒng)(RCC_BDCR 寄存器)是在后備區(qū)域,即在系統(tǒng)復位或從待機模式喚醒后 RTC 的設置和時間維持不變。系統(tǒng)復位后,禁止訪問后備寄存器和 RTC,防止對后備區(qū)域(BKP)的意外寫操作。執(zhí)行以下操作使能對后備寄存器和 RTC 的訪問:1.設置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位來使能電源和后備接口時鐘。2.設置寄存器 PWR_CR 的 DBP 位使能對后備寄存器和 RTC 的訪問。當我們需要在掉電之后,又需要 RTC 時鐘正常運行的話,單片機的 VBAT腳需外接 3.3V 的鋰電池。當我們重新上電的時候,主電源給 VBAT 供電,當系統(tǒng)掉電之后 VBAT

6、給 RTC 時鐘工作, RTC 中的數(shù)據(jù)都會保持在后備寄存器當中。野火 STM32 開發(fā)板的 VBAT 引腳接了 3.3V 的鋰電。3.STM32自帶了RTC時鐘計數(shù)器,從0開始計數(shù)到232。每一個計數(shù)代表秒計數(shù),每六十個計數(shù)代表分計數(shù),以此類推。24(小時)*60(分鐘)*60(秒鐘)=86400代表一天的計數(shù)時間。假設當前計數(shù)為count,count/86400得到計數(shù)的天數(shù),根據(jù)這個得到年月日。Count%86400得到時分秒。4.根據(jù)1中得到的年月日時分秒,進行計算的程序有:閏年判斷,星期幾計算,當前月有多少天等等。另外,秒表為RTC一秒鐘定時計數(shù)1.3設計方案的選擇可選擇的芯片方案整

7、個系統(tǒng)用STM32F103VE單片機作為中央控制器,由單片機執(zhí)行采集內(nèi)部RTC值,時鐘信號通過單片機I/O口傳給LCD12864,單片機模塊控制驅(qū)動模塊驅(qū)動顯示模塊,通過顯示模塊來實現(xiàn)信號的輸出、LCD12864的顯示及相關的控制功能。系統(tǒng)設有按鍵模塊用于對時間進行調(diào)整及擴展多個小鍵盤。方案一:采用89C51芯片采用89C51芯片作為硬件核心,采用Flash ROM,內(nèi)部具有4KB ROM 存儲空間,能于3V的超低壓工作,而且與MCS-51系列單片機完全兼容,但是運用于電路設計中時由于不具備ISP在線編程技術, 當在對電路進行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,對芯片的

8、多次拔插會對芯片造成一定的損壞。 方案二:采用AT89S52芯片片內(nèi)ROM全都采用Flash ROM;能以3V的超底壓工作;同時也與MCS-51系列單片機完全該芯片內(nèi)部存儲器為8KB ROM 存儲空間,同樣具有89C51的功能,且具有在線編程可擦除技術,當在對電路進行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,不需要對芯片多次拔插,所以不會對芯片造成損壞。不使用時鐘芯片,而直接用AT89S52單片機來實現(xiàn)電子萬年歷設計。AT89S52是一種帶8K字節(jié)閃爍可編程可擦除只讀存儲器的低電壓,高性能CMOS 8位微處理器,俗稱單片機。單片機的可擦除只讀存儲器可以反復擦寫1000余次。由

9、于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89S52是一種高效微控制器,為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。若采用單片機計時,利用它的一個16位定時器/計數(shù)器每50ms產(chǎn)生一個中斷信號,中斷20次后產(chǎn)生一個秒信號,然后根據(jù)時間進制關系依次向分、時、日、星期、月、年進位。這樣就實現(xiàn)了直接用單片機來實現(xiàn)電子萬年歷設計。方案三:采用STM32單片機STM32是一個低功耗,高性能32位單片機,片內(nèi)含4k Bytes ISP(In-system programmable)的可反復擦寫1000次的Flash只讀程序存儲器。主要性能有:與MCS-51單片機產(chǎn)品兼容、全

10、靜態(tài)操作:0Hz33Hz、 三級加密程序存儲器、32個可編程I/O口線、三個16位定時器/計數(shù)器、八個中斷源、全雙工UART串行通道、掉電后中斷可喚醒、看門狗定時器、雙數(shù)據(jù)指針、掉電標識符、易編程。從單片機芯片主要性能角度出發(fā),本數(shù)字電子鐘單片機芯片選擇設計采用方案采用STM32F103VE。1.3.2 顯示模塊選擇方案和論證: 方案一:采用ILI9341LED液晶顯示屏采用LED液晶顯示屏,液晶顯示屏的顯示功能強大,可顯示大量文字,圖形,顯示多樣,清晰可見,顯示質(zhì)量高,沒有電磁輻射,可視面積大,應用范圍廣,畫面效果好,數(shù)字式接口,勻稱小巧,功耗小。 方案二:采用點陣式數(shù)碼管顯示動態(tài)顯示,即各

11、位數(shù)碼管輪流點亮,對于顯示器各位數(shù)碼管,每隔一段延時時間循環(huán)點亮一次。利用人的視覺暫留功能可以看到整個顯示,但須保證掃描速度足夠快,人的視覺暫留功能才可察覺不到字符閃爍。顯示器的亮度與導通電流、點亮時間及間隔時間的比例有關。調(diào)整參數(shù)可以實現(xiàn)較高穩(wěn)定度的顯示。動態(tài)顯示節(jié)省了I/O口,降低了能耗。 點陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對于顯示文字比較適合,如采用在顯示數(shù)字顯得太浪費,且價格也相對較高,所以也不用此種作為顯示. 方案三: 采用LED數(shù)碼管動態(tài)掃描LED數(shù)碼管價格適中,對于顯示數(shù)字最合適,而且采用動態(tài)掃描法與單片機連接時,占用的單片機口線少。 從節(jié)省單片機芯片I/O口和降低能耗角

12、度出發(fā),本數(shù)字電子鐘數(shù)碼管顯示選擇設計采用方案一,既ILI9341LED顯示。 1.3.3時鐘芯片的選擇方案和論證:方案一:直接采用單片機定時計數(shù)器 直接采用單片機定時計數(shù)器提供秒信號,使用程序?qū)崿F(xiàn)年、月、日、星期、時、分、秒計數(shù)。采用此種方案雖然減少芯片的使用,節(jié)約成本,但是,實現(xiàn)的時間誤差較大。所以不采用此方案。 方案二:采用DS1302時鐘芯片實現(xiàn)時鐘采用DS1302時鐘芯片實現(xiàn)時鐘,DS1302芯片是一種高性能的時鐘芯片,可自動對秒、分、時、日、周、月、年以及閏年補償?shù)哪赀M行計數(shù),而且精度高,位的RAM做為數(shù)據(jù)暫存區(qū),工作電壓2.5V5.5V范圍內(nèi),2.5V時耗電小于300nA.方案三

13、:采用STM32的RTC定時器由于STM32自帶了實現(xiàn)計時功能的RTC時鐘計數(shù)器,可以直接使用。電路設計最終方案綜上各方案所述,對本課題方案選定: 采用STM32F103VE作為主控制芯片; STM32自帶的RTC提供時鐘;LCD液晶顯示作為顯示。1.4電源電路 本設計所需電源電壓為直流、電壓值大小5V的電壓源 。從硬件實物設計簡易程度與經(jīng)費方面考慮,用兩節(jié)電壓值大小2.5V干電池與電路電壓源引腳相連接即可達到硬件設計要求。即本設計可采用兩節(jié)電壓值大小2.5V干電池做硬件電路電壓源。為了方便改寫程序,本次實驗采用USB線連接電腦進行操作。 1.5按鍵電路 本設計所需按鍵用于進行顯示時間的調(diào)整與

14、設置擴展的小鍵盤。 單片機芯片4個I/O口可與按鍵直接相連,通過編程,單片機芯片即可控制按鍵接口電平的高低,即按鍵的開與關,以達到用按鍵進行顯示時間的調(diào)整與設置擴展的小鍵盤的設計要求。2.硬件設計2.1設計組成框圖電 腦USB線STM32開發(fā)板LCD液晶模塊按鍵區(qū) 圖 設計的組成框圖2.2 STM32F103VE實驗板STM32F103系列屬于中低端的32位ARM微控制器,該系列芯片是意法半導體(ST)公司出品,其內(nèi)核是Cortex-M3。該系列芯片按片內(nèi)Flash的大小可分為三大類:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。芯片集成定時器,

15、CAN,ADC,SPI,I2C,USB,UART,等多種功能。 分為三大類: LD(小于64K), MD(小于256K), HD(大于256K), STM32F103VET6類屬第三類。 STM32F103ZET6芯片介紹: 基于ARM Cortex-M3核心的32 位微控制器,LQFP-144封裝. 512K 片內(nèi)FLASH(相當于硬盤),64K片內(nèi)RAM(相當于內(nèi)存) ,片內(nèi)FLASH 支持在線編程(IAP).高達72M 的頻率,數(shù)據(jù),指令分別走不同的流水線,以確保 CPU運行速度達到最大化 . 通過片內(nèi)BOOT區(qū),可實現(xiàn)串口下載程序(ISP). 片內(nèi)雙RC 晶振,提供8M和32K 的頻率

16、. 支持片外高速晶振(8M),和片外低速晶振(32K).其中片外低速晶振可用于 CPU 的實時時鐘,帶后備電源引腳,用于掉電后的時鐘行走. 42個16位的后備寄存器(可以理解為電池保存的RAM),利用外置的紐扣電池,和實現(xiàn)掉電數(shù)據(jù)保存功能. 支持 JTAG,SWD調(diào)試.配合廉價的J-LINK,實現(xiàn)高速低成本的開發(fā)調(diào)試方案。多達80個IO(大部分兼容5V邏輯),4個通用定時器,2個高級定時器,2個基本定時器,3路SPI接口,2路I2S 接口,2路I2C接口,5路USART,一個USB從設備接口,一個 CAN接口,SDIO接口,可兼容SRAM,NOR和NAND Flash 接口的16位總線-FSM

17、C。 3路共16通道的12位AD輸入,2路共2 通道的12位 DA 輸出.支持片外獨立電壓基準.2.3 USB線USB開發(fā)涉及主機和設備,為了避免開發(fā)驅(qū)動程序,使用Windows自帶的驅(qū)動程序。所以設備枚舉成HID類設備。USB鼠標就是標準的USB-HID設備。不過操作系統(tǒng)阻止了應用程序直接訪問USB鼠標返回的報告。所以本例使用自定義HID設備。一來免去了開發(fā)驅(qū)動程序,二來自定義的HID設備應用程序和設備可以自由收發(fā)數(shù)據(jù)(僅指數(shù)據(jù)內(nèi)容)。 USB是一個外部總線標準,用于規(guī)范電腦與外部設備的連接和通訊。USB接口即插即用和熱插拔功能。USB接口可連接127種外設,如鼠標和鍵盤等。USB是在199

18、4年底由英特爾等多家公司聯(lián)合在1996年推出后,已成功替代串口和并口,已成為當今電腦與大量智能設備的必配接口。USB版本經(jīng)歷了多年的發(fā)展,到如今已經(jīng)發(fā)展為3.0版本。對于大多數(shù)工程師來說,開發(fā)USB2.0 接口產(chǎn)品主要障礙在于:要面對復雜的USB2.0協(xié)議、自己編寫USB設備的驅(qū)動程序、熟悉單片機的編程。這不僅要求有相當?shù)腣C編程經(jīng)驗、還能夠編寫USB接口的硬件(固件)程序。所以大多數(shù)人放棄了自己開發(fā)USB產(chǎn)品。為了將復雜的問題簡單化,西安達泰電子特別設計了USB2.0協(xié)議轉(zhuǎn)換模塊。USB20D模塊可以被看作是一個USB2.0協(xié)議的轉(zhuǎn)換器,將電腦的USB2.0接口轉(zhuǎn)換為一個透明的并行總線,就象

19、單片機總線一樣。從而幾天之內(nèi)就可以完成USB2.0產(chǎn)品的設計。2.4液晶顯示器LCD控制器簡介 LCD液晶顯示器(Liquid Crystal Display: LCD)的構造是在兩片平行的玻璃當中放置液態(tài)的晶體,兩片玻璃中間有許多垂直和水平的細小電線,透過通電與否來控制桿狀水晶分子改變方向,將光線折射出來產(chǎn)生畫面。LCM(LCD Module)即LCD顯示模組、液晶模塊,是指將液晶顯示器件,連接,控制與驅(qū)動等外圍電路,PCB電路板,背光源,結(jié)構件等裝配在一起的組件。由于液晶顯示屏功耗低、體積小,承載的信息量大,因而被廣泛用于信息輸出、與用戶進行交互。由于 STM32 內(nèi)部沒有集成專用的液晶屏

20、和觸摸屏的控制接口,所以在顯示面板中應自帶含有驅(qū)動芯片的驅(qū)動電路(液晶屏和觸摸屏的驅(qū)動電路是獨立的),STM32 芯片通過驅(qū)動芯片來控制液晶屏和觸摸屏。以本實驗3.2 寸液晶屏(240*320)為例,它使用 ILI9341 芯片控制液晶屏,通過 XPT2046 芯片控制觸摸屏。LCD 為非發(fā)光性的顯示裝置,它需要借助背光源才能達到顯示功能,LED 控制器就是用來控制液晶屏中的 LED 背光源。 2.4.1液晶顯示器在內(nèi)部電路結(jié)構上主要構成1.驅(qū)動板(也叫主板):主要是用以接收、處理從外部送進來的模擬(VGA)或者數(shù)字(DVI)視頻信號,并通過屏線送出信號去控制液晶屏(PANEL)正常工作。驅(qū)動

21、板上含有MCU單元,它是液晶顯示器的檢測控制中心和大腦。 2.電源板:用于將90240V 的交流電壓轉(zhuǎn)變?yōu)?2V、5V、3V 等的直流電供給顯示器工作。3.背光板(也叫高壓板):用于將主板或電源板輸出的12V 的直流電壓轉(zhuǎn)變?yōu)镻ANEL 需要的高頻的15001800V 的高壓交流電,用于點亮PANEL的背光燈。電源板和背光板有時會做在一起也就是所謂的電源背光二合一板。 4.液晶屏:液晶顯示用模塊,它是液晶顯示器的核心部件,其包含液晶板和驅(qū)動電路。其中,液晶屏是液晶顯示器內(nèi)部最為關鍵的部件,它對液晶顯示器的性能和價格具有決定性的作用。2.4.2 IL19341控制器結(jié)構液晶屏的控制芯片內(nèi)部結(jié)構非

22、常復雜 ,最主要的是位于中間GRAM(Graphics RAM),可以理解為顯存。GRAM 中每個存儲單元都對應著液晶面板的一個像素點。它右側(cè)的各種模塊共同作用把 GRAM 存儲單元的數(shù)據(jù)轉(zhuǎn)化成液晶面板的控制信號,使像素點呈現(xiàn)特定的顏色,而像素點組合起來則成為一幅完整的圖像。 接口與 MCU 進行通訊,MUC 通過 8080 接口與 ILI9341進行通訊,從而訪問它的控制寄存器(CR)、地址計數(shù)器(AC)、及 GRAM。 2.4.3像素點的數(shù)據(jù)格式圖像的像素點是由紅、綠、藍三原色組成,三原色根據(jù)其深淺程度被分為0255 個級別,它們按不同比例的混合可以得出各種色彩。ILI9341 最高能夠控

23、制18位LCD,為了傳輸方便一般采用16位的控制模式。2.4.4給整個屏幕上色再次回到 ILI9341_Init 函數(shù),它調(diào)用完 ILI9341_REG_Config()初始化了液晶屏后,向ILI9341 發(fā)送了一個命令寫 GRAM 內(nèi)容,即后面發(fā)送的數(shù)據(jù)都被解析為顯示到屏幕像素點的數(shù)據(jù)。代碼中使用 for 循環(huán)把語句 ILI9341_Write_Data(GBLUE)執(zhí)行了 320*240 次,即把所有像素點都顯示為 GBLUE 顏色。 3.軟件設計3.1程序流程框圖 圖時間調(diào)整程序流程圖3.2字模的創(chuàng)建使用字模III-增強版v3.91軟件來制作中文字庫。打開軟件,點擊“自動批量生成字庫”按

24、鈕選項,點擊選擇“二級漢字庫”按鈕。在“源字體”選項里面做如下設置,需要注意的是大小問題,因為我們本次的設計目標是實現(xiàn)16*16的漢字,所以在此選擇小四字體。設置好之后如下點擊“開始轉(zhuǎn)換進程”按鈕.就會在安裝目錄下或者你設置好的目錄下生成.c后綴的字庫文件。對LCD顯示來說,只要能夠在指定的位置描寫制定顏色的點,那么就能夠很好地根據(jù)漢字字模信息來描寫漢字。在此,為了能夠更好的清楚字模的取向和高低位的排列順序,可以現(xiàn)先在pc測試剛才制作好的庫文件?;氐健白帜II-增強版v3.91”軟件,采用與之前同樣的方式生成bin格式的字庫文件(即“生成格式”選項設置為“bin文件格式”)。在軟件安裝目錄下

25、會生成Font.dat文件,我們用“WinHex”軟件查看他的具體內(nèi)容,與剛才制作的.c字庫的文件內(nèi)容是一致的。最后將生成的漢字字庫拷貝到SD卡根目錄下并重命名為“HZLIB.bin”。3.3程序的設計一共三個任務:主處理任務、觸摸屏任務、秒更新任務。void App_UCGUI_TaskCreate (void) CPU_INT08U os_err;os_err = os_err; Clock_SEM=OSSemCreate(1); /建立秒更新中斷的信號量 /硬件平臺初始化 BSP_Init(); /主處理任務- os_err = OSTaskCreateExt(AppTaskUserIF

26、,(void *)0,(OS_STK*)&AppTaskUserIFStkAPP_TASK_USER_IF_STK_SIZE-1,APP_TASK_USER_IF_PRIO,APP_TASK_USER_IF_PRIO,(OS_STK *)&AppTaskUserIFStk0,APP_TASK_USER_IF_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); /觸摸屏任務- os_err = OSTaskCreateExt(AppTaskKbd, (void *)0, (OS_STK *)&AppTa

27、skKbdStkAPP_TASK_KBD_STK_SIZE-1, APP_TASK_KBD_PRIO, APP_TASK_KBD_PRIO, (OS_STK *)&AppTaskKbdStk0, APP_TASK_KBD_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); /秒更新任務 os_err = OSTaskCreateExt(Clock_Updata,(void *)0,(OS_STK *)&Clock_Updata_StkClock_Updata_STK_SIZE-1,Clock_Updata

28、_PRIO,Clock_Updata_PRIO,(OS_STK *)&Clock_Updata_Stk0,Clock_Updata_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);萬年歷中的時間用的是STM32自帶的RTC實時時鐘。3.4程序設計3.4.1界面背景初始化。static void AppTaskUserIF (void *p_arg) (void)p_arg;INT8U err; /界面初始化 GUI_Init();/ucgui 初始化_ExecCalibration(); /* 觸摸屏校準 */GU

29、I_SetBkColor(GUI_WHITE);/設置背景色GUI_SetColor(GUI_GRAY); /設置前景色 GUI_Clear();/清屏 Lcd_show_bmp(0, 0,"/RTC.bmp");/顯示萬年歷背景GUI_SetFont(&GUI_FontHZ_SimSun_16);GUI_DispStringAt("一",15,47); /顯示星期一GUI_DispStringAt("二",44,47);/顯示星期二GUI_DispStringAt("三",73,47);/顯示星期三GUI

30、_DispStringAt("四",102,47);/顯示星期四GUI_DispStringAt("五",131,47);/顯示星期五GUI_SetColor(GUI_RED);/用紅字顯示周末GUI_DispStringAt("六",160,47);/顯示星期六GUI_DispStringAt("日",189,47);/顯示星期日to_tm(RTC_GetCounter(), &s_time); /根據(jù)RTC時鐘得到萬年歷時間的初值,注意,這個值是根據(jù)用戶查詢?nèi)f年歷變化GUI_SetFont(&G

31、UI_Font16_1 );/設置英文字體GUI_DispDecAt(s_time.tm_year,4,13,4);/顯示萬年歷的年份GUI_SetFont(&GUI_FontHZ_SimSun_16); /設置中文字體GUI_DispString("年");/顯示年GUI_SetFont(&GUI_Font16_1 );/設置英文字體GUI_DispDec(s_time.tm_mon,2);/顯示萬年歷的月份GUI_SetFont(&GUI_FontHZ_SimSun_16);/設置中文字體GUI_DispString("月")

32、;/顯示月GUI_SetFont(&GUI_Font16_1 );/設置英文字體GUI_DispDec(s_time.tm_mday,2);/顯示萬年歷的日子GUI_SetFont(&GUI_FontHZ_SimSun_16);/設置中文字體GUI_DispString("日");/顯示日k=getWeekDay(s_time.tm_year,s_time.tm_mon,1);/得到某年某月的第一天的星期數(shù)GUI_GotoXY(18,69);./位置設定GUI_SetFont(&GUI_Font6x8); /主任務執(zhí)行程序void RTC_Show(

33、uint32_t TimeVar) u8 str15; / 字符串暫存 u8 i,k; static flag=0; #if (GUI_SUPPORT_CURSOR|GUI_SUPPORT_TOUCH)GUI_CURSOR_Show();/鼠標顯示 #endif WM_SetCreateFlags(WM_CF_MEMDEV); /* Automatically use memory devices on all windows */ if(flag=0)/初始化按鍵,只執(zhí)行一次。 /建立按鍵F1-F5 _ahButton0 =BUTTON_Create(5, 0, 32,13, GUI_KEY

34、_F1 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton1=BUTTON_Create(5, 29, 32,13, GUI_KEY_F2 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton2=BUTTON_Create(53, 0, 16,13, GUI_KEY_F3 , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton3=BUTTON_Create(53,29,16,13, GUI_KEY_F4 , WM_C

35、F_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton4=BUTTON_Create(85, 0, 16,13, GUI_KEY_F5, WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton5=BUTTON_Create(85,29, 16,13, GUI_KEY_F6, WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV); /按鍵字體設置 BUTTON_SetFont(_ahButton0,&GUI_Font6x8);/GUI_Font16_AS

36、CII BUTTON_SetFont(_ahButton1,&GUI_Font6x8);/GUI_Font16_ASCII BUTTON_SetFont(_ahButton2,&GUI_Font6x8);/GUI_Font16_ASCII BUTTON_SetFont(_ahButton3,&GUI_Font6x8);/GUI_Font16_ASCII BUTTON_SetFont(_ahButton4,&GUI_Font6x8);/GUI_Font16_ASCIIBUTTON_SetFont(_ahButton5,&GUI_Font6x8);/GUI_

37、Font16_ASCII /按鍵背景色設置 BUTTON_SetBkColor(_ahButton0,0,GUI_DARKMAGENTA); /按鍵背景顏色BUTTON_SetBkColor(_ahButton1,0,GUI_DARKMAGENTA); BUTTON_SetBkColor(_ahButton2,0,GUI_DARKMAGENTA); BUTTON_SetBkColor(_ahButton3,0,GUI_DARKMAGENTA); BUTTON_SetBkColor(_ahButton4,0,GUI_DARKMAGENTA); BUTTON_SetBkColor(_ahButto

38、n5,0,GUI_DARKMAGENTA); /按鍵前景色設置 BUTTON_SetTextColor(_ahButton0,0,GUI_WHITE); BUTTON_SetTextColor(_ahButton1,0,GUI_WHITE);BUTTON_SetTextColor(_ahButton2,0,GUI_WHITE);BUTTON_SetTextColor(_ahButton3,0,GUI_WHITE);BUTTON_SetTextColor(_ahButton4,0,GUI_WHITE);BUTTON_SetTextColor(_ahButton5,0,GUI_WHITE);/按鍵

39、顯示字符BUTTON_SetText(_ahButton0, "+"); BUTTON_SetText(_ahButton1, "-");BUTTON_SetText(_ahButton2, "+"); BUTTON_SetText(_ahButton3, "-"); BUTTON_SetText(_ahButton4, "+");BUTTON_SetText(_ahButton5, "-");flag=1; u8 key = GUI_GetKey(); /實時獲得觸摸按鍵的

40、值if(key=40) /年數(shù)增加按鈕s_time.tm_year+; /F1if(s_time.tm_year>2099)/超過范圍處理s_time.tm_year=1970;else if(key=41)/年數(shù)減小按鈕s_time.tm_year-; /F2if(s_time.tm_year<1900)/超過范圍處理s_time.tm_year=2099;else if(key=42) /月數(shù)增加按鈕s_time.tm_mon+; /F3if(s_time.tm_mon>12)/超過范圍處理s_time.tm_mon=1;else if(key=43) /月數(shù)減小按鈕s_

41、time.tm_mon-; /F4if(s_time.tm_mon<0)/超過范圍處理s_time.tm_mon=12;else if(key=44) /日數(shù)增加按鈕s_time.tm_mday+; /F5if(s_time.tm_mday>getDays(s_time.tm_year,s_time.tm_mon)/超過范圍處理s_time.tm_mday=1;else if(key=45) /日數(shù)減小按鈕s_time.tm_mday-; /F6if(s_time.tm_mday<0)/超過范圍處理s_time.tm_mday=getDays(s_time.tm_year,s

42、_time.tm_mon);GUI_SetFont(&GUI_Font16_1 );GUI_DispDecAt(s_time.tm_year,4,13,4);/顯示萬年歷的年數(shù)GUI_SetFont(&GUI_FontHZ_SimSun_16);GUI_DispString("年");/顯示年GUI_SetFont(&GUI_Font16_1 );GUI_DispDec(s_time.tm_mon,2);/顯示萬年歷的月數(shù)GUI_SetFont(&GUI_FontHZ_SimSun_16);GUI_DispString("月&quo

43、t;);/顯示月GUI_SetFont(&GUI_Font16_1 );GUI_DispDec(s_time.tm_mday,2);/顯示萬年歷的日數(shù)GUI_SetFont(&GUI_FontHZ_SimSun_16);GUI_DispString("日");/顯示日GUI_DispString(" ");GetChinaCalendarStr(u16)systmtime.tm_year,(u8)systmtime.tm_mon,(u8)systmtime.tm_mday,str); /陽歷轉(zhuǎn)陰歷GUI_DispString(str);

44、/顯示陰歷GUI_SetColor(GUI_RED); /字體顏色GUI_DispString("萬年歷"); k=getWeekDay(s_time.tm_year,s_time.tm_mon,1);/得到某年某月的第一天的星期數(shù) GUI_GotoXY(18,69);./位置設定 GUI_SetFont(&GUI_Font6x8); /萬年歷日子顯示 for(i=1;i<=40;i+)/第一行最少顯示一個,第六行最多顯示二個,i的上限只需要大于37即可 if(i<k+1|i>getDays(s_time.tm_year,s_time.tm_mon

45、)+k)/本月1號前和最后一天后的格子顯示清零 GUI_DispString(" "); /顯示空格,用于清除之前數(shù)據(jù) else if(i+1)%7=0|i%7=0)/如果為星期六和星期天,字體設置為紅色 GUI_SetColor(GUI_RED); else/否則為黑色 GUI_SetColor(GUI_BLACK); if(i=s_time.tm_mday+k)/如果該天為所選日期,設置背景為黃色GUI_SetBkColor(GUI_YELLOW); GUI_DispDecSpace(i-k,2);/顯示日子GUI_SetBkColor(GUI_WHITE);/恢復之前

46、背景色 GUI_GotoXY(GUI_GetDispPosX()+17,GUI_GetDispPosY();/光標移動到下一個格子 if(i%7=0) GUI_GotoXY(18,GUI_GetDispPosY()+27);/7天換行顯示 for(i=1;i<=40;i+) if(i<k+1|i>getDays(s_time.tm_year,s_time.tm_mon)+k)/本月1號前和最后一天后的格子顯示清零 GUI_DispString("");/顯示兩個中文空格,占兩個中文字符 else GUI_SetColor(GUI_BLUE);/正常顯示藍色

47、if(i=s_time.tm_mday+k)/如果該天為所選日期,設置背景為黃色GUI_SetBkColor(GUI_YELLOW);GUI_SetBkColor(GUI_WHITE);/恢復背景色 GUI_GotoXY(GUI_GetDispPosX()+7,GUI_GetDispPosY(); if(i%7=0) GUI_GotoXY(12,GUI_GetDispPosY()+27); WM_ExecIdle(); /刷新屏幕 /* 輸出公歷時間 */ GUI_SetFont(&GUI_Font16_1 );GUI_DispDecAt(systmtime.tm_year, 240,

48、 60,4);/顯示當前年 GUI_DispString("-");GUI_DispDec(systmtime.tm_mon,2);/顯示當前月GUI_DispString("-");GUI_DispDec(systmtime.tm_mday,2);/顯示當前日 GUI_DispDecAt(systmtime.tm_hour,240,76,2);/顯示當前時GUI_DispString(":");GUI_DispDec(systmtime.tm_min,2); /顯示當前分GUI_DispString(":");GUI_DispDec(systmtime.tm_sec,2);/顯示當前秒GUI_SetFont(&GUI_FontHZ_SimSun_16);GUI_DispStringAt("星期",240,92);/顯示當前星期 GUI_DispString(WEEK_STRsystmtime.tm_wday);3.4.2指定年月日的星期數(shù)u8 getWeekDay(u16 y, u8 m, u8 d) /得到指定年月日的星期數(shù) if (m = 1) m = 13; if (m = 2) m = 14; u8 week = (d +

溫馨提示

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

評論

0/150

提交評論