基于51單片機的計算器和萬年歷畢業(yè)論文的設計_第1頁
基于51單片機的計算器和萬年歷畢業(yè)論文的設計_第2頁
基于51單片機的計算器和萬年歷畢業(yè)論文的設計_第3頁
基于51單片機的計算器和萬年歷畢業(yè)論文的設計_第4頁
基于51單片機的計算器和萬年歷畢業(yè)論文的設計_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1引言1.1概述眾所周知單片機是一種集成在電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計時器等功能(可能還包括顯示驅(qū)動電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個小而完善的計算機系統(tǒng)。本設計要制作的就是單片機于生活中最為常見的幾種應用——簡易計算器。本簡易計算器以AT89S52單片機作為核心,可以顯示簡易的計算和時間,時間可以人為設定;另外還可以顯示當前的日歷,顯示格式為年(四位),月(兩位),日(兩位)。設置時間的位切換、設定數(shù)值、啟動定時器、切換日歷通過外部中斷來實現(xiàn)。簡易計算器不僅可以進行簡易的計算還可以顯示時間。簡易計算器顯示電路由LCD1602組成,制作該裝置的材料需要有軟硬件的支持,硬件方面AT89C51單片機,晶振,電源,液晶屏LCD1602。1.2設計思路1、本課題設計的是簡單的計算器,可以進行四則運算,為了得到較好的顯示效果,所以采用LCD顯示數(shù)據(jù)和結(jié)果;2、計算器部分:鍵盤包括數(shù)字鍵(0-9)、符號鍵(+、-、*、/)、清除鍵(ON/C)和等號鍵(=),故需要16個按鍵,設計中采用矩陣鍵盤;3、時間顯示的部分,有年、月、日、時、分、秒、時間顯示和計算器控制鍵的分別設置,故需要8個獨立的按鍵;3、執(zhí)行程序:開機顯示零,等待鍵入數(shù)值,當鍵入數(shù)字,通過LCD顯示出來,當鍵入+、-、*、/運算符,計算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲,并等待再次鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號就會在LCD上輸出運算結(jié)果;4、錯誤提示:當單片機執(zhí)行程序中有錯誤時,會在LCD上顯示相應的提示,如:當輸入的數(shù)值或計算器得到的結(jié)果大于計算器的顯示范圍時,計算器會在LCD上提示溢出;當除數(shù)為0時,計算器會在LCD上提示錯誤,顯示“error”。2單片機及其應用單片機是一種集成在電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計時器等功能(可能還包括顯示驅(qū)動電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個小而完善的計算機系統(tǒng)。圖2.1AT89S522.1單片機介紹單片微型計算機簡稱單片機,是典型的嵌入式微控制器(MicrocontrollerUnit),常用英文字母的縮寫MCU表示單片機,它最早是被用在工業(yè)控制領域。單片機由芯片內(nèi)僅有CPU的專用處理器發(fā)展而來。最早的設計理念是通過將大量外圍設備和CPU集成在一個芯片中,使計算機系統(tǒng)更小,更容易集成進復雜的而對體積要求嚴格的控制設備當中。INTEL的Z80是最早按照這種思想設計出的處理器,從此以后,單片機和專用處理器的發(fā)展便分道揚鑣單片機是靠程序運行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨特的一些功能,這是別的器件需要費很大力氣才能做到的,有些則是花大力氣也很難做到的。一個不是很復雜的功能要是用美國50年代開發(fā)的74系列,或者60年代的CD4000系列這些純硬件來搞定的話,電路一定是一塊大PCB板!但是如果要是用美國70年代成功投放市場的系列單片機,結(jié)果就會有天壤之別!只因為單片機的通過你編寫的程序可以實現(xiàn)高智能,高效率,以及高可靠性!單片機的硬件特性:單片機集成度高。單片機包括CPU、4KB容量的ROM(8031無)、128B容量的RAM、2個16位定時/計數(shù)器、4個8位并行口、全雙工串口行口。系統(tǒng)結(jié)構(gòu)簡單,使用方便,實現(xiàn)模塊化。P1口:P1口是一個具有內(nèi)部上拉電阻的8位雙向I/O口,P1輸出緩沖器能驅(qū)動4個TTL邏輯電平。對P1端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流。此外,P1.0和P1.2分別作定時器/計數(shù)器2的外部計數(shù)輸入(P1.0/T2)和定時器/計數(shù)器2的觸發(fā)輸入(P1.1/T2EX),具體如下表所示。在flash編程和校驗時,P1口接收低8位地址字節(jié)。引腳號第二功能P1.0T2(定時器/計數(shù)器T2的外部計數(shù)輸入),時鐘輸出P1.1T2EX(定時器/計數(shù)器T2的捕捉/重載觸發(fā)信號和方向控制)P1.5MOSI(在系統(tǒng)編程用)P1.6MISO(在系統(tǒng)編程用)P1.7SCK(在系統(tǒng)編程用)P2口:P2口是一個具有內(nèi)部上拉電阻的8位雙向I/O口,P2輸出緩沖器能驅(qū)動4個TTL邏輯電平。對P2端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流。在訪問外部程序存儲器或用16位地址讀取外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX@DPTR)時,P2口送出高八位地址。在這種應用中,P2口使用很強的內(nèi)部上拉發(fā)送1。在使用8位地址(如MOVX@RI)訪問外部數(shù)據(jù)存儲器時,P2口輸出P2鎖存器的內(nèi)容。在flash編程和校驗時,P2口也接收高8位地址字節(jié)和一些控制信號。P3口:P3口是一個具有內(nèi)部上拉電阻的8位雙向I/O口,P2輸出緩沖器能驅(qū)動4個TTL邏輯電平。對P3端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流。P3口亦作為AT89S52特殊功能(第二功能)使用,如下表所示。在flash編程和校驗時,P3口也接收一些控制信號。引腳號第二功能:P3.0RXD(串行輸入)P3.1TXD(串行輸出)P3.2INT0(外部中斷0)P3.3INT0(外部中斷0)P3.4T0(定時器0外部輸入)P3.5T1(定時器1外部輸入)P3.6WR(外部數(shù)據(jù)存儲器寫選通)P3.7RD(外部數(shù)據(jù)存儲器寫選通)RST:復位輸入。晶振工作時,RST腳持續(xù)2個機器周期高電平將使單片機復位??撮T狗計時完成后,RST腳輸出96個晶振周期的高電平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能無效。DISRTO默認狀態(tài)下,復位高電平有效。ALE/PROG:地址鎖存控制信號(ALE)是訪問外部程序存儲器時,鎖存低8位地址的輸出脈沖。在flash編程時,此引腳(PROG)也用作編程輸入脈沖。在一般情況下,ALE以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或時鐘使用。然而,特別強調(diào),在每次訪問外部數(shù)據(jù)存儲器時,ALE脈沖將會跳過。如果需要,通過將地址為8EH的SFR的第0位置“1”,ALE操作將無效。這一位置“1”,ALE僅在執(zhí)行MOVX或MOVC指令時有效。否則,ALE將被微弱拉高。這個ALE使能標志位(地址為8EH的SFR的第0位)的設置對微控制器處于外部執(zhí)行模式下無效。PSEN:外部程序存儲器選通信號(PSEN)是外部程序存儲器選通信號。當AT89S52從外部程序存儲器執(zhí)行外部代碼時,PSEN在每個機器周期被激活兩次,而在訪問外部數(shù)據(jù)存儲器時,PSEN將不被激活。EA/VPP:訪問外部程序存儲器控制信號。為使能從0000H到FFFFH的外部程序存儲器讀取指令,EA必須接GND。為了執(zhí)行內(nèi)部程序指令,EA應該接VCC。在flash編程期間,EA也接收12伏VPP電壓。XTAL1:振蕩器反相放大器和內(nèi)部時鐘發(fā)生電路的輸入端。XTAL2:振蕩器反相放大器的輸出端。3LCD1602的原理及其應用3.1LCD1602的介紹LCD1602已很普遍了,具體介紹我就不多說了,市面上字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780寫的控制程序可以很方便地應用于市面上大部分的字符型液晶。字符型LCD通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣。3.2LCD1602的引腳1602LCD采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表3.1所示:表3.1LCD1602的引腳說明編號符號引腳說明編號符號引腳說明1VSS電源地9D2數(shù)據(jù)2VDD電源正極10D3數(shù)據(jù)3VL液晶顯示偏壓11D4數(shù)據(jù)4RS數(shù)據(jù)/命令選擇12D5數(shù)據(jù)5R/W讀/寫選擇13D6數(shù)據(jù)6E使能信號14D7數(shù)據(jù)7D0數(shù)據(jù)15BLA背光源正極8D1數(shù)據(jù)16BLK背光源負極表3.1:引腳接口說明表第1腳:VSS為地電源。第2腳:VDD接5V正電源。第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。第15腳:背光源正極。第16腳:背光源負極。3.3LCD1602的指令1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表3.2所示:表3.2LCD1602的指令說明編號指令RSR/WD7D6D5D4D3D2D1D01清顯示00000000012光標返回000000001*3置輸入模式00000001I/DS4顯示開/關控制0000001DCB5光標或字符移位000001S/CR/L**6置功能00001DLNF**7置字符發(fā)生存貯器地址0001字符發(fā)生存貯器地址8置數(shù)據(jù)存貯器地址001顯示數(shù)據(jù)存貯器地址9讀忙標志或地址01BF計數(shù)器地址10寫數(shù)到CGRAM或DDRAM)10要寫的數(shù)據(jù)內(nèi)容11從CGRAM或DDRAM讀數(shù)11讀出的數(shù)據(jù)內(nèi)容表3.2:控制命令表1602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現(xiàn)的。(說明:1為高電平、0為低電平)指令1:清顯示,指令碼01H,光標復位到地址00H位置。指令2:光標復位,光標返回到地址00H。指令3:光標和顯示模式設置I/D:光標移動方向,高電平右移,低電平左移S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。指令4:顯示開關控制。D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示C:控制光標的開與關,高電平表示有光標,低電平表示無光標B:控制光標是否閃爍,高電平閃爍,低電平不閃爍。指令5:光標或顯示移位S/C:高電平時移動顯示的文字,低電平時移動光標。指令6:功能設置命令DL:高電平時為4位總線,低電平時為8位總線N:低電平時為單行顯示,高電平時雙行顯示F:低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符。指令7:字符發(fā)生器RAM地址設置。指令8:DDRAM地址設置。指令9:讀忙信號和光標地址BF:為忙標志位,高電平表示忙,此時模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。指令10:寫數(shù)據(jù)。指令11:讀數(shù)據(jù)。與HD44780相兼容的芯片時序表如下:表3.3LCD1602基本操作時序說明讀狀態(tài)輸入RS=L,R/W=H,E=H輸出D0—D7=狀態(tài)字寫指令輸入RS=L,R/W=L,D0—D7=指令碼,E=高脈沖輸出無讀數(shù)據(jù)輸入RS=H,R/W=H,E=H輸出D0—D7=數(shù)據(jù)寫數(shù)據(jù)輸入RS=H,R/W=L,D0—D7=數(shù)據(jù),E=高脈沖輸出無3.4LCD1602的RAM地址映射及標準字庫表液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令之前一定要確認模塊的忙標志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖3.1是1602的內(nèi)部顯示地址。圖3.1LCD1602的內(nèi)部地址例如第二行第一個字符的地址是40H,那么是否直接寫入40H就可以將光標定位在第二行第一個字符的位置呢?這樣不行,因為寫入顯示地址時要求最高位D7恒定為高電平1所以實際寫入的數(shù)據(jù)應該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在對液晶模塊的初始化中要先設置其顯示模式,在液晶模塊顯示字符時光標是自動右移的,無需人工干預。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,如表3.4所示,這些字符有:阿拉伯數(shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。表3.4CGROM和CGRAM中字符代碼與字符圖形對應關系4整體設計4.1設計方法本電路設計采用AT89S52單片機為核心,利用晶振產(chǎn)生頻率為1HZ的時鐘脈沖信號,利用液晶屏LCD1602顯示計算及其時間信息,通過對AT89S52單片機的編程控制液晶屏LCD1602的顯示。顯示計算和簡易計算的信息同在LCD1602,通過按鍵切換選擇。外部按鍵可及時設定或調(diào)整時間或計算的信息。4.2硬件設計本系統(tǒng)以AT89S52單片機為核心,本系統(tǒng)選用12MHZ的晶振,,使得單片機有合理的運行速度。起振電容22pF對振蕩器的頻率高低、振蕩器的穩(wěn)定性和起振的快速性影響較合適,復位電路為按鍵高電平復位。4.2.1按鍵調(diào)整電路圖4.1獨立按鍵S0為調(diào)秒的按鍵,當按下S0時秒加1;S1為調(diào)分的按鍵,當按S1時分加1;S2按鍵為調(diào)時,當按下S2時時加1;S3按鍵為調(diào)日,當按下S3時日加1;S4為調(diào)月,當按下S4時月加1;S5為調(diào)年,當按下S5時年加1;當S6按下時,顯示時間;S7按下時,顯示計算。4.2.2復位電路圖4.2復位電路51單片機是高電平復位。所以本設計采用的是上電復位和手動復位相結(jié)合的方式。4.2.3LCD1602的顯示電路圖4.3顯示部分本設計采用液晶屏LCD1602來顯示輸出數(shù)據(jù),通過D0-D7引腳向LCD寫指令字或?qū)憯?shù)據(jù)以使LCD實現(xiàn)不同的功能或顯示相應的數(shù)據(jù)。4.2.4電源供電電路圖4.4電源部分三端穩(wěn)壓集成電路LM7805,是指這種穩(wěn)壓用的集成電路,只有三條引腳輸出,分別是輸入端、接地端和輸出端。如圖4.4所示,這是一個輸出+5V直流電壓的穩(wěn)壓電源電路。采用集成穩(wěn)壓器LM7805,二極管DS1起保護作用,C4為輸出端濾波電容,當輸出電流較大時,LM7805應配上散熱板,本設計中功率小不用。78/79系列集成穩(wěn)壓IC中的78或79后面的數(shù)字代表該三端集成穩(wěn)壓電路的輸出電壓,如7805表示輸出電壓為+5V。4.2.5鍵盤的設計圖4.5矩陣鍵盤計算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨立按鍵的方式,在這種情況下,編程會很簡單,但是會占用大量的I/O口資源,因此在很多情況下都不采用這種方式,而是采用矩陣鍵盤的方案。矩陣鍵盤采用四條I/O線作為行線,四條I/O線作為列線組成鍵盤,在行線和列線的每個交叉點上設置一個按鍵。這樣鍵盤上按鍵的個數(shù)就為4*4個。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機系統(tǒng)中I/O口的利用率。4.3軟件設計本電路軟件設計采用C語言編寫程序(具體程序在附件中給出)。程序設計主要包括簡易計算的編程,按鍵編程,時間控制編程,液晶屏LCD1602的顯示編程。4.4軟件仿真在硬件設計完成后,利用軟件對其進行仿真,這樣,就會減少在做硬件時的錯誤,做到更準確。本次我采用Proteus軟件仿真。如圖4.1所示,簡易計算器的時間顯示。如圖4.2所示,簡易計算器的計算顯示。經(jīng)過此次的軟件仿真,仿真結(jié)果正常,可以順利的進行硬件制作。圖4.6時間顯示圖4.7計算顯示4.5硬件調(diào)試前期工作都是為了最后一步,就是自己動手焊接,制作出完整的實物。在確保焊接無誤后,接著將之前編好的程序燒進單片機,做最后的硬件調(diào)試。結(jié)束語在用單片機實現(xiàn)簡易計算的設計中使用到了AT89S52、LCD1602及其4*4鍵盤的使用。在設計過程中我通過在網(wǎng)上和圖書館查閱資料,收集了關于單片機和液晶屏LCD1602顯示方面的資料,通過對這些資料的學習,我了解了單片機的基本結(jié)構(gòu)和單片機在生活和生產(chǎn)中所發(fā)揮的作用以及液晶屏LCD1602的原理和使用。本次設計完成的主要工作和任務如下:對設計方案的理論研究,單片機的合理選型,硬件電路的設計,電路板的制作,元器件的焊接,軟件的編寫和調(diào)試以及此次論文的編寫。通過設計簡易計算器的過程中,我掌握了單片機的基本原理及其基本的應用,對它的各種硬件接口與軟件設計方法有一定的認識。通過對電路原理圖、PCB圖的繪制,又加深對ProtelDXP的使用,電路仿真、電路板的制作掌握了對Proteus仿真軟件的使用。本次論文設計是對以前學過的理論知識進行了鞏固,加深了理解,提高了應用的能力,提高了自己的發(fā)現(xiàn)、分析、解決問題的能力。經(jīng)歷了從最初的選題、硬件設計、軟件設計到最后仿真結(jié)果的出現(xiàn),從一定程度上提高了對專業(yè)的認識及興趣,就我而言,對以后就業(yè)有及其重大的影響。致謝在此也很感謝學校和老師給我們提供了這樣的平臺,能使我們的動手能力增強;感謝老師對我們提供的幫助,感謝他們帶給我知識,使我完成本次的畢業(yè)設計。同時也感謝我的同學們,對我的支持!參考文獻[1]田立.田清.代方震.51單片機C語言程序設計.北京.人民郵電出版社.2008:132-148.[2]張儀和.例說51單片機(C語言版)(第三版).北京.人民郵電出版社.2010:374-392.[3]譚浩強.C程序設計(第三版).北京.清華大學出版社.2003:140-150.[4]溫子祺.劉志峰.冼安勝.林秩謙.李益鴻.51單片機C語言創(chuàng)新教程.北京.北京航空航天大學出版社.2011:154-163.[5]俞錫存.曹國華.單片機原理及接口技術(shù).西安.西安電子科技大學出版社.2000:80-95..附錄1.硬件電路原理圖2.軟件編程程序#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitrs=P0^0;sbitrw=P0^1;sbite=P0^2;sbitk0=P1^0;sbitk1=P1^1;sbitk2=P1^2;sbitk3=P1^3;sbitk4=P1^4;sbitk5=P1^5;sbitk6=P1^6;sbitk7=P1^7;unsignedcharcodedigit[]={"0123456789"};//定義字符數(shù)組顯示數(shù)字unsignedchars,m,h,day,month,year,count;voidwrite_dat(uchardat);voidwrite_com(ucharcom);voidkeyscan();/***功能說明:顯示編碼,加上0x30,分別為'1'、'2'、'3'、'+'、'4'、'5'、'6'、'-'等***/ucharcodetable1[]={1,2,3,0x2b-0x30,4,5,6,0x2d-0x30,7,8,9,0x2a-0x30,0,0x3d-0x30,0x01-0x30,0x2f-0x30};uchark=0,flag=0,num,fuhao,i;longa,b,c;voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/***函數(shù)功能:指定字符顯示的實際地址入口參數(shù):x***/voidWriteAddress(unsignedcharx){write_com(x|0x80);}//顯示位置的確定方法規(guī)定為"80H+地址碼x"/***函數(shù)功能:顯示小時***/voidDisplayHour(){unsignedchari,j; i=h/10;//取整運算,求得十位數(shù)字 j=h%10;//取余運算,求得各位數(shù)字WriteAddress(0x45);//寫顯示地址,將十位數(shù)字顯示在第2行第0列 write_dat(digit[i]);//將十位數(shù)字的字符常量寫入LCDwrite_dat(digit[j]);//將個位數(shù)字的字符常量寫入LCD}/***函數(shù)功能:顯示分鐘***/voidDisplayMinute(){unsignedchari,j;i=m/10;//取整運算,求得十位數(shù)字 j=m%10;//取余運算,求得各位數(shù)字WriteAddress(0x48);//寫顯示地址,將十位數(shù)字顯示在第2行第3列 write_dat(digit[i]);//將十位數(shù)字的字符常量寫入LCD write_dat(digit[j]);//將個位數(shù)字的字符常量寫入LCD}/***函數(shù)功能:顯示秒***/voidDisplaySecond(){unsignedchari,j; i=s/10;//取整運算,求得十位數(shù)字 j=s%10;//取余運算,求得各位數(shù)字WriteAddress(0x4b);//寫顯示地址,將十位數(shù)字顯示在第2行第6列 write_dat(digit[i]);//將十位數(shù)字的字符常量寫入LCDwrite_dat(digit[j]);//將個位數(shù)字的字符常量寫入LCD}/***函數(shù)功能:顯示年***/voidDisplayYear(){unsignedchari,j; i=year/10;//取整運算,求得十位數(shù)字 j=year%10;//取余運算,求得各位數(shù)字WriteAddress(0x07);//寫顯示地址,將十位數(shù)字顯示在第2行第0列 write_dat(digit[i]);//將十位數(shù)字的字符常量寫入LCDwrite_dat(digit[j]);//將個位數(shù)字的字符常量寫入LCD}/***函數(shù)功能:顯示月***/voidDisplayMonth(){unsignedchari,j;i=month/10;//取整運算,求得十位數(shù)字 j=month%10;//取余運算,求得各位數(shù)字WriteAddress(0x0a);//寫顯示地址,將十位數(shù)字顯示在第2行第3列 write_dat(digit[i]);//將十位數(shù)字的字符常量寫入LCD write_dat(digit[j]);//將個位數(shù)字的字符常量寫入LCD}/***函數(shù)功能:顯示日***/voidDisplayDay(){unsignedchari,j; i=day/10;//取整運算,求得十位數(shù)字 j=day%10;//取余運算,求得各位數(shù)字WriteAddress(0x0d);//寫顯示地址,將十位數(shù)字顯示在第2行第6列 write_dat(digit[i]);//將十位數(shù)字的字符常量寫入LCDwrite_dat(digit[j]);//將個位數(shù)字的字符常量寫入LCD}voidkeyscan2() {if(k0==0) {delay(5); if(k0==0) {s++; if(s==60) s=0;}} if(k1==0) {delay(5); if(k1==0) {m++; if(m==60) m=0;}} if(k2==0) {delay(5); if(k2==0) {h++; if(h==60) h=0;}} if(k3==0) {delay(5); if(k3==0) {day++; if(day==30) day=0;}} if(k4==0) {delay(5); if(k4==0) {month++; if(month==13) month=0;}} if(k5==0) {delay(5); if(k5==0) {year++; if(year==99) year=0; }}} voidkeyscan(){uchartemp;P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case0xee:num=0;break;case0xde:num=1;break;case0xbe:num=2;break;case0x7e:num=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}/***當按下1,2,3,松手后執(zhí)行下面這段語句***/if(num==0||num==1||num==2){if(flag==0)a=a*10+table1[num];//如果沒有按符號鍵,符號前的數(shù)值為aelseif(flag==1)b=b*10+table1[num];//如果按了符號鍵,符號后的數(shù)值為bif(k==1)//如果之前按了'='號,再按鍵時清屏,進行下一次計算{k=0;write_com(0x01);}}elseif(num==3)//判斷按下'+'{flag=1;fuhao=1;}i=table1[num];//顯示按下的鍵write_dat(0x30+i);}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case0xed:num=4;break;case0xdd:num=5;break;case0xbd:num=6;break;case0x7d:num=7;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}if(num==4||num==5||num==6)//判斷是否按下'4','5','6'{if(k==1){k=0;write_com(0x01);}if(flag==0)a=a*10+table1[num];elseif(flag==1)b=b*10+table1[num];}elseif(num==7){flag=1;fuhao=2;}i=table1[num];//顯示按下的鍵write_dat(0x30+i);}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp)//{case0xeb:num=8;break;case0xdb:num=9;break;case0xbb:num=10;break;case0x7b:num=11;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}if(num==8||num==9||num==10)//判斷是否按下'7','8','9'{if(k==1){k=0;write_com(0x01);}if(flag==0)a=a*10+table1[num];elseif(flag==1)b=b*10+table1[num];}elseif(num==11)//判斷是否按下'*'{flag=1;fuhao=3;}i=table1[num];write_dat(0x30+i);}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case0xe7:num=12;//0鍵break;case0xd7:num=13;//'='break;case0xb7:num=14;//清0鍵break;case0x77:num=15;//'/'break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}switch(num){case12:{if(k==1)k=0;{write_com(0x01);}if(flag==0)a=a*10;elseif(flag==1)b=b*10;write_dat(0x30);}break;case13://按=鍵{k=1;if(fuhao==1)//如果符號鍵是+,執(zhí)行+運算{write_com(0x80+0x4f);write_com(0x04);c=a+b;while(c!=0){write_dat(0x30+c%10);c=c/10;}write_dat(0x3d);fuhao=0;a=0;b=0;flag=0;}if(fuhao==2){write_com(0x80+0x4f);write_com(0x04);if(a>=b){c=a-b;while(c!=0){write_dat(0x30+c%10);c=c/10;}}elseif(a<b){c=b-a;while(c!=0){write_dat(0x30+c%10);c=c/10;}write_dat(0x2d);}write_dat(0x3d);a=0;b=0;flag=0;fuhao=0;}if(fuhao==3)//如果符號鍵是*{write_com(0x80+0x4f);write_com(0x04);c=a*b;while(c!=0){write_dat(0x30+c%10);c=c/10;}write_dat(0x3d);a=0;b=0;flag=0;fuhao=0;}if(fuhao==4)//如果符號鍵是/{i=0;write_com(0x80+0x4f);write_com(0x04);c=(long)(((float)a/b)*1000000);//結(jié)果保留6位小數(shù)while(c!=0){write_dat(0x30+c%10);c=c/10;i++;if(i==6)//顯示完六位小數(shù)后,顯示·write_dat(0x2e);}if(a/b<=0)write_dat(0x30);write_dat(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case14:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}break;case15:{flag=1;fuhao=4;write_dat(0x30+table1[num]);}break;}}}/***led1602***/voidwrite_com(ucharcom){rs=0;//選擇寫指令rw=0;P2=com;e=1;delay(5);//無延時不能正常工作e=0;}voidwrite_dat(uchardat){rs=1;//選擇寫數(shù)據(jù)rw=0;P2=dat;e=1;delay(5);//無延時不能正常工作e=0;}voidinit()//初始化{delay(15);write_com(0x38);delay(6);write_com(0x38);delay(6);write_com(0x38);write_com(0x38);write_com(0x0c);//開顯示,關光標write_com(0x06);//光標移動設置write_com(0x01);/清屏}voidgeshi(){ WriteAddress(0x00);write_dat('D'); WriteAddress(0x01);write_dat('a');WriteAddress(0x02);write_dat('t');WriteAddress(0x03);write_dat('e'); WriteAddress(0x04);write_dat(':'); WriteAddress(0x05);write_dat('2'); WriteAddress(0x06);write_dat('0'); WriteAddress(0x09);write_dat('-'); Writ

溫馨提示

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

評論

0/150

提交評論