版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
歡迎閱讀本文檔,希望本文檔能對您有所幫助!歡迎閱讀本文檔,希望本文檔能對您有所幫助!歡迎閱讀本文檔,希望本文檔能對您有所幫助!歡迎閱讀本文檔,希望本文檔能對您有所幫助!歡迎閱讀本文檔,希望本文檔能對您有所幫助!歡迎閱讀本文檔,希望本文檔能對您有所幫助!DSP課程設計題目DSP實現(xiàn)液晶顯示電子日歷英文題目院系專業(yè)姓名班級學號指導教師實訓地點
摘要傳統(tǒng)的液晶顯示往往采用單片機控制。但在系統(tǒng)有大量高速實時數(shù)據(jù)的情況下,單片機由于受到處理速度的限制就顯得力不從心。為了解決這些問題,本文提出了一種基于DSP控制的液晶顯示屏的設計,有效地解決以上所遇到的問題。本文提出了一種基于DSP控制的液晶顯示數(shù)字模擬鐘的設計。通過對DSP芯片TMS320LVC5416PGE和液晶模塊LCM12864ZK的分析和研究,利用TMS320LVC5416PGE的DSP最小系統(tǒng)板構建了一個時間顯示系統(tǒng),采用LCM12864ZK液晶模塊顯示時間,用按鍵調整時間。該時鐘系統(tǒng)包括硬件電路的實現(xiàn)和系統(tǒng)程序設計兩部分。對液晶顯示時鐘系統(tǒng)的硬件原理和主程序流程圖進行了介紹,并給出了定時器的初始化程序和按照液晶顯示模塊接口讀寫時序編寫的在DSP芯片TMS320LVC5416PGE上的液晶顯示初始化程序。關鍵詞:DSP;TMS320LVC5416PGE;LCM12864ZK液晶模塊DigitalsimulationclockDSPrealizedAbstractThetraditionalliquidcrystaldisplay(LCD)oftenUSESthemonolithiccontrol.Butinthesystemwithalotofhigh-speedreal-timedata,duetoasinglechipprocessingspeedlimitisragged.Inordertosolvetheseproblems,thispaperputsforwardaDSPcontrolbasedonthedesignoftheLCDscreen,effectivetosolvetheaboveproblems.ThispaperputforwardbasedonDSPcontrolliquidcrystaldisplay(LCD)digitalsimulationclockdesign.Throughtothedigitalsignalprocessor(DSP)TMS320LVC5416PGEandLCDmoduleLCM12864ZKanalysisandresearch,usingtheleastTMS320LVC5416PGEDSPsystemboardhasconstructedatimedisplaysystem,adoptingLCM12864ZKLCDmoduleshowtime,withbuttonssettlingtime.Thisclocksystemincludingtherealizationofhardwarecircuitandsystemprogrammingdesigntwoparts.Onliquidcrystaldisplayclocksystemhardwareprincipleandmainprogramflowchartarepresented,andgivesthetimerandinitialprogramaccordingtoLCDmoduleinterface,speaking,readingandwritingindigitalsignalprocessor(DSP)thetimingwriteTMS320LVC5416PGEonliquidcrystaldisplay(LCD)initialprogram.Keywords:DSP;shutTMS320LVC5416PGE;LCM12864ZKLCDmodule
目錄Abstract II第一章緒論 11.1DSP芯片主要特點 11.2DSP芯片與通用微處理器主要區(qū)別 11.3DSP的優(yōu)點 2第二章系統(tǒng)硬件組成 22.1DSP模塊 22.1.1TMS320C5416的特點和硬件組成框圖 32.1.2TMS320C5416的存儲器 42.2液晶顯示模塊 52.2.1顯示數(shù)據(jù)控制方法 52.2.2發(fā)送控制命令: 62.2.3寫顯示數(shù)據(jù): 62.2.4其它問題: 72.3鍵盤模塊 7第三章程序設計 83.1設計思路 83.2主程序 9第四章總結 23參考文獻: 24致謝 24第一章緒論DSP芯片,也稱數(shù)字信號處理器,是一種特別適合與數(shù)字信號處理運算的微處理器,其主要應用是實時快速地實現(xiàn)各種數(shù)字信號處理算法。既具有高速數(shù)字信號處理功能,又具有實時性強、功耗低、集成度高等嵌入式微計算機的特點,所以隨著科技的發(fā)展,DSP技術在機電控制領域的應用愈加廣泛。LCD可顯示字符、漢字和圖形,且顯示清晰美觀、功耗低,現(xiàn)在已成為電子產品中應用最為廣泛的顯示方式。近年來,基于DSP的LCD圖文顯示技術一直受到科技人員的關注。本文利用DSP芯片TMS320LVC5416PGE的數(shù)字I/O口來控制慢速LCM12864ZK液晶顯示模塊,用軟件編程來實現(xiàn)對外設LCM12864ZK液晶顯示模塊的讀寫接口時序,并且按照LCM12864ZK液晶顯示模塊的時序要求加入相應的等待延時來實現(xiàn)高速的DSP芯片和低速的液晶顯示模塊的工作匹配,從而實現(xiàn)基于DSP的液晶顯示時鐘設計。1.1DSP芯片主要特點根據(jù)數(shù)字信號處理的要求,DSP芯片一般具有如下主要特點:(1)在一個指令周期內可完成一次乘法和一次加法;(2)程序和數(shù)據(jù)空間分開,可以同時訪問指令和數(shù)據(jù);(3)片內具有快速RAM,通常可通過獨立的數(shù)據(jù)總線在兩塊中同時訪問;(4)具有低開銷或無開銷循環(huán)及跳轉的硬件支持;(5)快速的中斷處理和硬件I/O支持;(6)可以并行執(zhí)行多個操作;(7)具有在單周期內操作的多個硬件地址產生器;(8)支持流水線操作,使取指,譯碼和執(zhí)行等操作可以重疊執(zhí)行。1.2DSP芯片與通用微處理器主要區(qū)別DSP芯片與通用微處理器在應用領域有著很大的不同,主要區(qū)別在于:(1)DSP的速度比MCU快,主頻較高;(2)DSP適合于數(shù)據(jù)處理,數(shù)據(jù)處理的指令效率較高;(3)DSP均為16位以上的處理器,不適合于低檔的場合;(4)DSP可以同時處理的事件較多,系統(tǒng)級成本有可能較低;(5)DSP的靈活性較好,大多數(shù)算法都可以軟件實現(xiàn);(6)DSP的集成度較高,可靠性較好。1.3DSP的優(yōu)點數(shù)字信號處理系統(tǒng)是以數(shù)字信號處理為基礎的,因此具有數(shù)字處理的全部優(yōu)點:(1)接口方便DSP系統(tǒng)與其他以現(xiàn)代數(shù)字技術為基礎的系統(tǒng)或設備都是兼容的,與這樣的系統(tǒng)接口實現(xiàn)某種功能要比模擬系統(tǒng)與這些系統(tǒng)接口要容易得多。(2)編程方便DSP系統(tǒng)中的可編程DSP芯片可使設計人員在開發(fā)過程中靈活方便地對軟件進行修改和升級。(3)穩(wěn)定性好DSP系統(tǒng)以數(shù)字處理為基礎,受環(huán)境溫度及噪聲的影響較小,可靠性高。(4)精度高16位數(shù)字系統(tǒng)可以達到10-5的精度,32位數(shù)字系統(tǒng)可達到2×10-10的精度。(5)可重復性好模擬系統(tǒng)的性能受元器件參數(shù)性能影響較大,而數(shù)字系統(tǒng)基本不受影響,因此數(shù)字系統(tǒng)便于測試,調試和大規(guī)模生產。(6)集成方便DSP系統(tǒng)中的數(shù)字部件有高度的規(guī)范性,便于大規(guī)模集成。第二章系統(tǒng)硬件組成完整系統(tǒng)所需的模塊有DSP模塊、液晶顯示模塊、鍵盤模塊。2.1DSP模塊使用TI公司的TMS320LVC5416PGE型號的DSP芯片構成最小系統(tǒng)板,該系統(tǒng)板是DSP芯片工作的最小系統(tǒng),主要由DSP芯片TMS320LVC5416PGE、StaticRAM芯片CY7C1021和3.3V電源組成。DSP芯片的引腳可以在實驗中根據(jù)需要通過拓展插口引出。最小系統(tǒng)可引出的DSP功能有:I/O,AD,SPI,SCI,CAN,PWM,Interrupt,AP和電源引腳。根據(jù)本系統(tǒng)的需要,從最小系統(tǒng)板拓展插口引出所用到的DSP芯片引腳試驗箱上液晶顯示模塊的訪問、控制是由5416DSP對擴展I/O接口的操作完成。試驗箱上液晶顯示模塊的訪問、控制是由5416DSP對擴展I/O接口的操作完成。2.1.1TMS320C5416的特點和硬件組成框圖TMS320C5416采用TMS320C54x系列內核,其主要特性如下所示:CPU先進的多總線結構。40位算術邏輯運算單元(ALU)。17位×17位并行乘法器與40位專用加法器相連。比較、選擇、存儲單元(CSSU)。指數(shù)編碼器可以在單個周期內計算40位累加器中數(shù)值的指數(shù)。雙地址生成器包括8個輔助寄存器和兩個輔助寄存器算術運算單元(ARAU)。存儲器64K字程序存儲器、64K字數(shù)據(jù)存儲器以及64K字I/O空間。指令系統(tǒng)單指令重復和塊指令重復操作。塊存儲器傳送指令。32位長操作數(shù)指令。同時讀入兩個或3個操作數(shù)的指令。并行存儲和并行加載的算術指令。條件存儲指令。從中斷快速返回指令在片外圍電路軟件可編程等待狀態(tài)發(fā)生器。可編程分區(qū)轉換邏輯電路。帶有內部振蕩器。外部總線關斷控制,以斷開外部的數(shù)據(jù)總線、地址總線和控制信號。數(shù)據(jù)總線具有總線保持器特性??删幊潭〞r器。并行主機接口(HPl)。電源可用IDLEl、IDLE2和IDLE3指令控制功耗,以工作在省電方式。可以控制關斷CLKOUT輸出信號。在片仿真接口具有符合IEEEll49.1標準的在片仿真接口(JTAG)。速度單周期定點指令的執(zhí)行時間為25/20/15/12.5/10-ns(40MIPS/50MIPS/66MIPS/80MIPS/100MIPS)。2.1.2TMS320C5416的存儲器TMS320C54x存儲器由3個獨立的可選擇空間組成:程序空間、數(shù)據(jù)空間和I/O空間。程序存儲器空間包括程序指令和程序中所需的常數(shù)表格;數(shù)據(jù)存儲器空間用于存儲需要程序處理的數(shù)據(jù)或程序處理后的結果;I/O空間用于與外部存儲器映象的外設接口,也可以用于擴展外部數(shù)據(jù)存儲空間。其內部存儲空間分配如圖1所示。圖1.TMS320VC5416存儲器分配圖程序空間通過MP/和OVLY位的設置,可以實現(xiàn)對片內存儲器(ROM、RAM)的配置,即哪些片內存儲器映象在程序存儲器空間。器件復位時,復位、中斷和陷阱中斷的向量映象在地址FF80H開始的程序存儲器空間。然而,復位后這些向量可以被重新映象在程序存儲器空間任何128字頁的開始。這樣,可以把向量表移出引導ROM,并重新配置其地址。數(shù)據(jù)空間通過對處理器方式狀態(tài)寄存器PMST的DROM位的設置,將片內ROM配置在數(shù)據(jù)存儲器空間(DROM=1),這樣,可以用指令將片內ROM作為數(shù)據(jù)存儲器中的數(shù)據(jù)ROM來讀取。復位時,DROM位被清0。64K字的數(shù)據(jù)存儲器空間包括數(shù)據(jù)存儲器映象寄存器,0000H~001FH是常用的CPU寄存器地址,0020H~005FH是片內外設寄存器的地址。I/O空間除程序存儲器空間和數(shù)據(jù)存儲器空間外,C54x系列器件還提供了I/O存儲器空間,利用I/O空間可以擴展外部存儲器。I/O存儲器空間為64K字(0000h~FFFFh),有兩條指令PORTR和PORTW可以對I/O存儲器空間操作,讀寫時序與程序存儲器空間和數(shù)據(jù)存儲器空間有很大不同。2.2液晶顯示模塊LCM12864ZK液晶模塊用于字符、數(shù)字和漢字的顯示,該模塊有128×64個像素,可以顯示4行漢字,每行8個,共計32個漢字;或者4行半角字符,每行16個,共計64個半角字符。通過各點亮滅的組合,即可顯示出文字、圖片的信息。需要強調的是,LCM12864ZK液晶模塊的VR和VO引腳端需要串連一個10的可調電阻,且在初次使用時要微調10電阻,使得液晶屏的字符顯示清晰明亮。系統(tǒng)中的\o"液晶顯示"液晶顯示單元采用LCM128645ZK型中文液晶顯示模塊。該模塊電源操作范圍寬(2.7Vto5.5V),其低功耗設計可滿足產品的省電要求;同時,模塊與微控器的接口界面靈活(三種模式:并行8位/4位,串行3線/2線),可實現(xiàn)漢字、ASCII碼、點陣圖形的同屏顯示,支持所有的主流液晶操作指令,預留多種控制線(復位/串并選擇/亮度調整)供用戶靈活使用。液晶顯示模塊的訪問、控制是由5416DSP對擴展I/O接口的操作完成??刂艻/O口的尋址:命令控制I/O接口的地址為0x8001,數(shù)據(jù)控制I/O接口的地址為0x8003和0x8004,輔助控制I/O接口的地址為0x8002。2.2.1顯示數(shù)據(jù)控制方法:液晶顯示模塊中有兩片顯示緩沖存儲器,分別對應屏幕顯示的象素,向其中寫入數(shù)值將改變顯示,寫入“1”則顯示一點,寫入“0”則不顯示。其地址與象素的對應方式如圖2所示:圖2.液晶數(shù)據(jù)顯示格式2.2.2發(fā)送控制命令:向液晶顯示模塊發(fā)送控制命令的方法是通過向命令控制I/O接口寫入命令控制字,然后再向輔助控制接口寫入0。下面給出的是基本命令字、解釋和C語言控制語句舉例。.設置液晶顯示開關:0x3f打開顯示;0x3e關閉顯示;Port8001=0x3f;port8002=0;//將液晶顯示打開:00111111Port8001=0x3e;port8002=0;//將液晶顯示關閉:00111110.設置顯示起始行:0x0c0+起始行取值,其中起始行取值為0至63;Port8001=0x0c0;port8002=0;//設置從存儲器第0行開始顯示Port8001=0x0c8;port8002=0;//設置從存儲器第8行開始顯示.設置操作頁:0x0b8+頁號,其中頁號取值為0-7:10111000+頁號Port8001=0x0b8;port8002=0;//設置即將操作的存儲器第0頁Port8001=0x0ba;port8002=0;//設置即將操作的存儲器第2頁.設置操作列:0x40+列號,其中列號為取值為0-63:01000000Port8001=0x40;port8002=0;//設置即將操作的存儲器第0列Port8001=0x44;port8002=0;//設置即將操作的存儲器第4列2.2.3寫顯示數(shù)據(jù):在使用命令控制字選擇操作位置(頁數(shù)、列數(shù))之后,可以將待顯示的數(shù)據(jù)寫入液晶顯示模塊的緩存。將數(shù)據(jù)發(fā)送到相應數(shù)據(jù)控制I/O接口即可。液晶顯示器的硬件電路上有自動移到下列的功能。發(fā)送到下列的數(shù)據(jù),不必先設置其列號。由于液晶模塊相對于DSP來講是慢速設備,在命令之間可能需要增加延時語句。舉例說明:Port8003=0x80;port8002=0;//向左側屏幕緩存存入數(shù)據(jù)0x80,如果顯示行、頁號和列號均//為0時,屏幕上第8行第1列將顯示黑色象素(數(shù)據(jù)位從高到低,//顯示在一列的從下到上)。Port8004=0x01;port8002=0;//向右側屏幕緩存存入數(shù)據(jù)0x01,如果顯示行、頁號和列號均//為0時,屏幕上第1行第65列將顯示黑色象素(數(shù)據(jù)位從高到低,//顯示在一列的從下到上)。2.2.4其它問題:數(shù)據(jù)信號的傳送:由于液晶顯示模塊相對運行在8MHz主頻下的DSP屬于較為慢速設備,連接時需要考慮數(shù)據(jù)線上信號的等待問題;電平轉換:由于DSP為3.3v設備,而液晶顯示模塊屬于5v設備,所以在連接控制線、數(shù)據(jù)線時需要加電平隔離和轉換設備。液晶顯示器與DSP的連接:片選片選液晶顯示模塊數(shù)據(jù)控制端地址譯碼地址TMS320L控制VC5416PGE數(shù)據(jù)其他控制圖3.液晶顯示器與DSP的連接2.3鍵盤模塊ICETEK-VC5416-A是一塊以TMS320VC5416DSP為核心的DSP擴展評估板,它通過擴展接口與實驗箱的顯示/控制模塊連接,可以控制其各種外圍設備,也可以接收外設發(fā)送的各種數(shù)據(jù)、信息。鍵盤的掃描碼由DSP的I/O擴展地址0x8001給出,當有鍵盤輸入時,讀此端口得到掃描碼,當無鍵被按下時讀此端口的結果為0。讀取的方法如下:nScanCode=port8001;temp=port8002;//nScanCode中為掃描碼先讀,然后清零。第三章程序設計3.1設計思路本次設計采用C語言編程,通過編程實現(xiàn)在液晶的左側顯示圖片,在液晶的右側從上到下依次顯示“電子日歷”、“x月x日”、“星期x”、及時間。其主程序流程圖如下:開始初始化硬件系統(tǒng)開始初始化硬件系統(tǒng)清液晶顯示屏定時器初始化顯示圖片、日歷、數(shù)字鐘圖4.主程序流程圖整個系統(tǒng)軟件設計主要包括程序、中斷服務程序、顯示程序等幾個部分。各個模塊均寫成函數(shù)形式,便于結構化程序設計。各個模塊之間可能需要交換數(shù)據(jù),我們采取定義公共變量的方法來實現(xiàn),這樣就不必通過形參和實參方式來交換數(shù)據(jù),簡化了程序設計。主程序主要完成系統(tǒng)初始化,中斷初始化和構建一個循環(huán)不得地顯示當前時間。本系統(tǒng)采用的是顯示芯片來實現(xiàn)系統(tǒng)顯示的。顯示時主要根據(jù)LCD芯片時序要求,模擬產生相應的時序,選中芯片,向LCD芯片送相應的控制字設定其工作方式,再送相應數(shù)據(jù)完成顯示工作。當“秒”計至60時,“分”加1,當“分”計到60時,“時”加1,當“時”計到24時,“時”清0,”星期”加1完成一天計時。
3.2主程序Clock.h#include"top.h"http://包含宏定義和函數(shù)聲明#include"scancode.h"http://包含鍵碼unsignedcharcKey,W_flag;unsignedchartimebuf[8]={20,11,6,17,5,8,1,30};//空年月日周時分秒 main(){ Init_LCD(); //LCD初始化 Init_Timer();//定時器初始化 while(1) { dis_clock(timebuf[2],timebuf[3],timebuf[4],timebuf[5],timebuf[6],timebuf[7]); cKey=ScanKey();//按鍵掃描 if(cKey>='0'&&cKey<='7') W_flag=cKey; w_clock(); //修改數(shù)據(jù) }; }/********************************************************函數(shù)名:鍵盤掃描輸入:無輸出:unsignedcharcKey功能:掃描鍵盤,并將轉換后的鍵碼通過cKey返回********************************************************/unsignedcharScanKey(){ unsignedintnScanCode; unsignedcharcKey,temp; cKey=0; nScanCode=port8001;//讀鍵盤掃描碼,然后取出低八位 nScanCode&=0xff; temp=port8002; temp=temp; //根據(jù)掃描碼的值作出相應的動作 Delay(1500); if(nScanCode!=0&&nScanCode!=0xff)//如果按下 { cKey=ConvertScanToChar(nScanCode);//掃描碼轉化為相應的數(shù)字 } returncKey; }/********************************************************函數(shù)名:鍵碼轉換函數(shù)輸入:unsignedcharcScanCode輸出:charcReturn功能:鍵碼轉換********************************************************/charConvertScanToChar(unsignedcharcScanCode){ charcReturn; cReturn=0; switch(cScanCode) { caseSCANCODE_0:cReturn='0';break; caseSCANCODE_1:cReturn='1';break; caseSCANCODE_2:cReturn='2';break; caseSCANCODE_3:cReturn='3';break; caseSCANCODE_4:cReturn='4';break; caseSCANCODE_5:cReturn='5';break; caseSCANCODE_6:cReturn='6';break; caseSCANCODE_7:cReturn='7';break; caseSCANCODE_8:cReturn='8';break; caseSCANCODE_9:cReturn='9';break; caseSCANCODE_Del:cReturn='.';break; caseSCANCODE_Enter:cReturn='=';break; caseSCANCODE_Plus:cReturn='+';break; caseSCANCODE_Minus:cReturn='-';break; caseSCANCODE_Mult:cReturn='*';break; caseSCANCODE_Divid:cReturn='/';break; caseSCANCODE_Num:cReturn='N';break;//NumLock } returncReturn;}/********************************************************函數(shù)名:數(shù)據(jù)修改函數(shù)輸入:無輸出:無功能:判斷并修改對應位數(shù)據(jù)********************************************************/voidw_clock(){ if(W_flag=='2') { if(cKey=='+') { timebuf[2]++; if(timebuf[2]==13) timebuf[2]=1; } if(cKey=='-') { timebuf[2]--; if(timebuf[2]==0) timebuf[2]=12; }; } if(W_flag=='3') { if(cKey=='+') { timebuf[3]++; if(timebuf[3]==32) timebuf[3]=1; } if(cKey=='-') { timebuf[3]--; if(timebuf[3]==0) timebuf[3]=31; }; } if(W_flag=='4') { if(cKey=='+') { timebuf[4]++; if(timebuf[4]==8) timebuf[4]=1; } if(cKey=='-') { timebuf[4]--; if(timebuf[4]==0) timebuf[4]=7; }; } if(W_flag=='5') { if(cKey=='+') { timebuf[5]++; if(timebuf[5]==24) timebuf[5]=0; } if(cKey=='-') { timebuf[5]--; if(timebuf[5]==0) timebuf[5]=23; }; } if(W_flag=='6') { if(cKey=='+') { timebuf[6]++; if(timebuf[6]==60) timebuf[6]=0; } if(cKey=='-') { timebuf[6]--; if(timebuf[6]==0) timebuf[6]=60; }; } if(W_flag=='7') { if(cKey=='+') { timebuf[7]++; if(timebuf[7]==60) timebuf[7]=0; } if(cKey=='-') { timebuf[7]--; if(timebuf[7]==0) timebuf[7]=60; }; }}/********************************************************函數(shù)名:延時函數(shù)輸入:unsignedintnDelay輸出:無功能:延時nDelay*64個指令周期********************************************************/voidDelay(unsignedintnDelay){ intii,jj,kk=0; for(ii=0;ii<nDelay;ii++) { for(jj=0;jj<64;jj++) { kk++; } }}LCD.h#include"mo.h"#include"top.h"#include<math.h>unsignedcharKey_flag=0;externunsignedchartimebuf[];/********************************************************函數(shù)名:LCD初始化函數(shù)輸入:無輸出:無功能:初始化LCD********************************************************/voidInit_LCD(){ CLKMD=0; port8000=0; //初始化ICETEK-CTR Delay(LCDDELAY); port8000=0x80; Delay(LCDDELAY); port8000=0; Delay(LCDDELAY); port8007=0; //關閉東西方向的交通燈 Delay(LCDDELAY); port8007=0x40; //關閉南北方向的交通燈 Delay(LCDDELAY); TurnOnLCD(); //打開顯示 LCDCLS();//清除顯示內存 Dispic(clkbmp);//顯示圖片 //顯示固定部分漢字 hanzi(0,0,zimo+32*0); hanzi(0,16,zimo+32*1); hanzi(0,16*2,zimo+32*2); hanzi(0,16*3,zimo+32*3); hanzi(4,8,zimo+32*4); hanzi(4,8+16,zimo+32*5); hanzi(2,16,zimo+32*6); hanzi(2,16*3,zimo+32*7); shuzi(6,8*2,NUM+16*10); shuzi(6,8*5,NUM+16*10); }//打開液晶顯示子程序voidTurnOnLCD(){ port8001=LCDCMDTURNON;//發(fā)送打開液晶顯示命令 Delay(LCDDELAY); port8002=0;//發(fā)送輔助命令 Delay(1024); port8001=LCDCMDSTARTLINE;//默認設置在第0行開始顯示 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY);}//#defineLCDCMDSTARTLINE0xc0//第0行的行號,其它行號為0xc0+行號(0~63)//#defineLCDCMDPAGE0xb8//第0頁的頁號,其它頁號為0xb8+頁號(0~7)//#defineLCDCMDVERADDRESS0x40//第0列的列號,其它列號為0x40+列號(0~63)//液晶顯示屏清屏voidLCDCLS(){ inti,j; port8001=LCDCMDSTARTLINE;//設置在從第0行開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); for(i=0;i<8;i++) { port8001=LCDCMDPAGE+i;//設置在從第0頁開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); port8001=LCDCMDVERADDRESS;//設置在從第0列開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); for(j=0;j<64;j++)//從第0列開始,逐列清除,液晶有自動移到下一列的功能。 { port8003=0; Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); } port8001=LCDCMDPAGE+i;//移到下一頁 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); port8001=LCDCMDVERADDRESS;//從第0列開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); for(j=0;j<64;j++)//從第0~63列開始清空? { port8004=0; Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); } }}/********************************************************函數(shù)名:畫圖函數(shù)輸入:unsignedchar*pic輸出:無功能:在一個半屏內畫一幅64*64的圖片********************************************************/voidDispic(unsignedchar*pic){ inti,j; port8001=LCDCMDSTARTLINE;//設置從第0行開始顯示 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); for(j=0;j<=7;j++) { port8001=LCDCMDPAGE+j;//設置在從第0頁開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); port8001=LCDCMDVERADDRESS;//設置在從第0列開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); for(i=0;i<64;i++) { port8003=pic[i+64*j];//8003是左半屏,8004是右半屏 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); } }}/********************************************************函數(shù)名:寫漢字函數(shù)輸入:unsignedcharx,unsignedchary,unsignedchar*hanzi輸出:無功能:在任意給定點(x,y)處寫一個16*16的漢字 x,y∈[0,63] ********************************************************/voidhanzi(unsignedcharx,unsignedchary,unsignedchar*hanzi){ intj; port8001=LCDCMDSTARTLINE;//設置從第0行開始顯示 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); port8001=LCDCMDPAGE+x;//設置在從第0頁開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); port8001=LCDCMDVERADDRESS+y;//設置在從第0列開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); for(j=0;j<16;j++) { port8004=(Key_flag==0)?hanzi[j]:~hanzi[j]; Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); } port8001=LCDCMDPAGE+x+1;//設置在從第0頁開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); port8001=LCDCMDVERADDRESS+y;//設置在從第0列開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); for(j=0;j<16;j++) { port8004=(Key_flag==0)?(hanzi[j+16]):(~hanzi[j+16]); Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); } }/********************************************************函數(shù)名:寫數(shù)字函數(shù)輸入:unsignedcharx,unsignedchary,unsignedchar*shuzi輸出:無功能:在任意給定點(x,y)處寫一個8*16的數(shù)字 x,y∈[0,63] ********************************************************/voidshuzi(unsignedcharx,unsignedchary,unsignedchar*shuzi){ intj; port8001=LCDCMDSTARTLINE;//設置從第0行開始顯示 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); port8001=LCDCMDPAGE+x;//設置在從第0頁開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); port8001=LCDCMDVERADDRESS+y;//設置在從第0列開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); for(j=0;j<8;j++) { port8004=(Key_flag==0)?(shuzi[j]):(~shuzi[j]); Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); } port8001=LCDCMDPAGE+x+1;//設置在從第0頁開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); port8001=LCDCMDVERADDRESS+y;//設置在從第0列開始 Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); for(j=0;j<8;j++) { port8004=(Key_flag==0)?(shuzi[j+8]):(~shuzi[j+8]); Delay(LCDDELAY); port8002=0; Delay(LCDDELAY); } }/********************************************************函數(shù)名:顯示數(shù)字時鐘函數(shù)輸入:unsignedcharyue0,unsignedcharri0,unsignedcharxingqi0,unsignedcharshi0,unsignedcharfen0,unsignedcharmiao0輸出:無功能:在給定的位置顯示數(shù)字時鐘********************************************************/voiddis_clock(unsignedcharyue0,unsignedcharri0,unsignedcharxingqi0,unsignedcharshi0,unsignedcharfen0,unsignedcharmiao0){ unsignedcharyue1,yue2,ri1,ri2,shi1,shi2,fen1,fen2,miao1,miao2; //數(shù)據(jù)處理 yue1=yue0/10; yue2=yue0%10; ri1=ri0/10; ri2=ri0%10; shi1=shi0/10; shi2=shi0%10; fen1=fen0/10; fen2=fen0%10; miao1=miao0/10; miao2=miao0%10; //顯示月日周時分秒 shuzi(2,8*0,NUM+16*yue1); if(yue1!=1)//當月的第一位為0時消隱 shuzi(2,8*0,NUM+16*11); shuzi(2,8*1,NUM+16*yue2); shuzi(2,8*4,NUM+16*ri1); if(ri1==0)//當日的第一位為0時消隱 shuzi(2,8*4,NUM+16*11); shuzi(2,8*5,NUM+16*ri2); hanzi(4,40,week+(xingqi0-1)*32); shuzi(6,8*0,NUM+16*shi1); shuzi(6,8*1,NUM+16*shi2); shuzi(6,8*3,NUM+16*fen1); shuzi(6,8*4,NUM+16*fen2); shuzi(6,8*6,NUM+16*miao1); shuzi(6,8*7,NUM+16*miao2);}Timer.h#include"top.h"externunsignedchartimebuf[8];//空年月日周時分秒 //uWork臨時變量,nCount定時計數(shù)變量,nCountLed交通燈狀態(tài)順序變量unsignedintuWork,nCount,nCountLed;//交通燈依次發(fā)光狀態(tài)寄存器unsignedintuLed[12][2]={{1,0x40},{2,0x40},{4,0x40}, {0,0x41},{0,0x42},{0,0x44}, {8,0x40},{0x10,0x40},{0x20,0x40}, {0,0x48},{0,0x50},{0,0x60}, };//每行2個數(shù)值表示一組東西方向和南北方向交通燈狀態(tài)/********************************************************函數(shù)名:定時器初始化函數(shù)輸入:無輸出:無功能:初始化定時器********************************************************/voidInit_Timer(){ nCount=0;nCountLed=0; asm(" ssbx INTM"); //關中斷,進行關鍵設置時不許打擾 //重定位中斷向量表在80H處 uWork=PMST; //設置PMST寄存器 PMST=uWork&0xff; //中斷向量表起始地址=80H //設置通用定時器 //IMRANDIFROFVC5416 //15~14|13|12|11|10|9|8|7|6|5|4|3|2|1|0| //reserved|DMAC5|DMAC4|XINT1|RINT1|HINT|INT3|XINT2|RINT2|XINT0|RINT0|TINT|INT2|INT1|INT0| IMR=0x8; //使能TINT //TCROFVC5416 //15~12|11|10|9~6|5|4|3~0| //reserved|Soft|Free|PSC|T
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年環(huán)保公益宣傳品采購與服務合同3篇
- 2024年版:建筑工程專業(yè)分包合同模板
- 簡易警報器課程設計
- 工程經(jīng)濟學課程設計
- 航天能源課程設計思路
- 電工實訓教學課程設計
- 《黑衣“超人”》課件
- 機械沖床課程設計題目
- 色彩搭配系統(tǒng)課程設計
- 米利根案件課程設計
- 《皮膚病中成藥導引》課件
- 2024-2030年中國除顫儀行業(yè)市場分析報告
- 2023-2024學年廣東省廣州市越秀區(qū)九年級(上)期末物理試卷(含答案)
- 廣東省廣州市天河區(qū)2023-2024學年八年級上學期期末考試物理試題(含答案)
- 2024年高一上學期期末數(shù)學考點《壓軸題》含答案解析
- 成都中醫(yī)藥大學博士申請
- 太空軍事法律問題-洞察分析
- 2024年行政執(zhí)法人員資格考試必考知識題庫及答案(共250題)
- 招標代理崗位職責規(guī)章制度
- 家校攜手育桃李 齊心合力創(chuàng)輝煌 課件高二上學期期末家長會
- 二零二四年風力發(fā)電項目EPC總承包合同
評論
0/150
提交評論