版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《單片機(jī)原理及應(yīng)用》</p><p><b> 課程設(shè)計(jì)</b></p><p> 設(shè)計(jì)題目:基于單片機(jī)的液晶計(jì)算器設(shè)計(jì) </p><p> 專業(yè)班級(jí): 電子信息工程1001 </p><p> 學(xué)生姓名: </p><p>
2、; 學(xué)生學(xué)號(hào): </p><p> 指導(dǎo)教師: </p><p> 完成日期: 2013年6月9日 </p><p><b> 機(jī)電工程學(xué)院、</b></p><p><b> 電子信息工程專業(yè)</b></
3、p><p><b> 目錄</b></p><p> 1.課程設(shè)計(jì)的目的……………………………………………………2</p><p> 2.課程設(shè)計(jì)的內(nèi)容和要求………………………………………………2</p><p> 2.1課程設(shè)計(jì)內(nèi)容……………………………………………………2</p><p>
4、 2.2課程設(shè)計(jì)要求……………………………………………………2</p><p> 3.課程設(shè)計(jì)原理……………………………………………………2</p><p> 4.課程設(shè)計(jì)所需器材及其介紹…………………………………………2</p><p> 4.1課程設(shè)計(jì)所需器材………………………………………………2</p><p> 4.2課程設(shè)
5、計(jì)所需器材介紹…………………………………………2</p><p> 5.課程設(shè)計(jì)步驟……………………………………………………6</p><p> 5.1問題分析……………………………………………………6</p><p> 5.2算法設(shè)計(jì)……………………………………………………6</p><p> 5.3功能模塊分割…………………………
6、…………………………6</p><p> 5.4算術(shù)運(yùn)算程序流程圖……………………………………………6</p><p> 5.5系統(tǒng)總流程圖……………………………………………………7</p><p> 5.6仿真電路模型的構(gòu)建……………………………………………7</p><p> 6.課程設(shè)計(jì)結(jié)果及結(jié)論…………………………………………
7、………7</p><p> 6.1課程設(shè)計(jì)結(jié)果……………………………………………………7</p><p> 6.1.1仿真模型與結(jié)果………………………………………………7</p><p> 6.1.2程序設(shè)計(jì)……………………………………………………8</p><p> 7.心得體會(huì)……………………………………………………10</
8、p><p> 8.參考文獻(xiàn)……………………………………………………10</p><p> 9.附錄……………………………………………………11</p><p><b> 1.課程設(shè)計(jì)的目的</b></p><p> 通過本課程設(shè)計(jì)使學(xué)生進(jìn)一步鞏固單片機(jī)原理與技術(shù)的基本概念、基本理論,分析問題的基本方法;增強(qiáng)學(xué)生的軟件
9、編程實(shí)現(xiàn)能力和解決實(shí)際問題的能力,使學(xué)生能有效地將理論和實(shí)際緊密結(jié)合,拓展學(xué)生在工程實(shí)踐方面的專業(yè)知識(shí)和相關(guān)技能。</p><p> 2.課程設(shè)計(jì)的內(nèi)容和要求</p><p><b> 2.1課程設(shè)計(jì)內(nèi)容</b></p><p> 基于液晶顯示的簡易計(jì)算器設(shè)計(jì)。 </p><p><b> 2.2目標(biāo)
10、</b></p><p> 1.硬件電路包括1602顯示屏,4*4鍵盤。</p><p> 2.能夠顯示不少于4位的數(shù)字。</p><p> 3.能夠完成1位以上十進(jìn)制數(shù)的加、減、乘、除運(yùn)算,結(jié)果保留至小數(shù)點(diǎn)后1位。</p><p> 4.設(shè)計(jì)中使用C語言編程。</p><p><b>
11、 3.課程設(shè)計(jì)原理</b></p><p> 運(yùn)用MM74C922芯片作為4*4鍵盤的譯碼器輸入AT89C51單片機(jī)內(nèi),再植入運(yùn)算的程序,通過LCD靜態(tài)顯示相關(guān)數(shù)字,得到計(jì)算結(jié)果,電路中同時(shí)有復(fù)位電路,內(nèi)部時(shí)鐘模式電路來控制,是電路更穩(wěn)定。</p><p> 4.課程設(shè)計(jì)所需器材及其介紹</p><p> 4.1課程設(shè)計(jì)所需器材</p>
12、<p> 本設(shè)計(jì)選用AT89C51單片機(jī)為主控單元; </p><p> 顯示部分:采用LCD靜態(tài)顯示;</p><p> 按鍵部分:采用4*4鍵盤;</p><p> 用MM74C922為4*4鍵盤掃描IC,讀取輸入的鍵值。</p><p> AT89C51LM016LMM74C9224*4鍵盤</
13、p><p> 4.2課程設(shè)計(jì)所需器材介紹</p><p> (1).AT89C51芯片</p><p> MCS-51 單片機(jī)是在一塊芯片中集成了CPU、RAM、ROM、定時(shí)器/計(jì)數(shù)器和多功能I/O等一臺(tái)計(jì)算機(jī)所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲(chǔ)器(RAM)、程序存儲(chǔ)器(ROM/EPROM)、并行I/O 口、串
14、行口、定時(shí)器/計(jì)數(shù)器、中斷系統(tǒng)及特殊功能寄存器(SFR)。單片機(jī)是靠程序運(yùn)行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨(dú)特的一些功能,通過使用單片機(jī)編寫的程序可以實(shí)現(xiàn)高智能,高效率,以及高可靠性!因此我們采用單片機(jī)作為計(jì)算器的主要功能部件,可以進(jìn)行很快地實(shí)現(xiàn)運(yùn)算功能,如圖4-1所示:</p><p> 圖4-1 AT89C51芯片</p><p> AT89C51單片
15、機(jī)引腳介紹:</p><p> VCC: 供電電壓。 </p><p><b> GND:接地。 </b></p><p> P0口:P0口為一個(gè)8位漏級(jí)開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P0口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0 口作
16、為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。 </p><p> P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。 </p><p> P2口:P
17、2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH
18、編程和校驗(yàn)時(shí)接收高八位地址信號(hào)和控制信號(hào)。 </p><p> P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 </p><p> P3口也可作為AT89C51的一些特殊功能口:</p><p&g
19、t; P3.0 RXD(串行輸入口) P3.1 TXD(串行輸出口) P3.2 /INT0(外部中斷0) </p><p> P3.3 /INT1(外部中斷1) P3.4 T0(記時(shí)器0外部輸入) P3.5 T1(記時(shí)器1外部輸入) </p><p> P3.6 /WR(外部數(shù)據(jù)存儲(chǔ)器寫選通) P3.7 /RD(外部數(shù)據(jù)存儲(chǔ)器讀選通) </p><p> P
20、3口同時(shí)為閃爍編程和編程校驗(yàn)接收一些控制信號(hào)。 </p><p> RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。 </p><p> ALE/PROG:當(dāng)訪問外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號(hào),此頻率為振蕩器頻率的1/6。因此它可用作對
21、外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲(chǔ)器時(shí),將跳過一個(gè)ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時(shí), ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。 </p><p> /PSEN:外部程序存儲(chǔ)器的選通信號(hào)。在由外部程序存儲(chǔ)器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)
22、存儲(chǔ)器時(shí),這兩次有效的/PSEN信號(hào)將不出現(xiàn)。 </p><p> /EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲(chǔ)器(0000H-FFFFH),不管是否有內(nèi)部程序存儲(chǔ)器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時(shí),此間內(nèi)部程序存儲(chǔ)器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 </p><p> XTAL1:反向振蕩放大器
23、的輸入及內(nèi)部時(shí)鐘工作電路的輸入。 </p><p> XTAL2:來自反向振蕩器的輸出。</p><p><b> (2).4*4鍵盤</b></p><p> 計(jì)算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨(dú)立按鍵的方式,在這種情況下,編程會(huì)很簡單,但是會(huì)占用大量的I/O 口資源,因此在很多情況下都不采用這種方式,而是采用矩陣鍵盤
24、的方案。矩陣鍵盤采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤,在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵。這樣鍵盤上按鍵的個(gè)數(shù)就為4×4個(gè)。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中I/O 口的利用率。</p><p> 矩陣鍵盤的工作原理:</p><p> 計(jì)算器的鍵盤布局如圖4-2所示:一般有16個(gè)鍵組成,在單片機(jī)中正好可以用一個(gè)P口實(shí)現(xiàn)16個(gè)按鍵功能,這種形
25、式在單片機(jī)系統(tǒng)中也最常用。</p><p> 圖4-2 矩陣鍵盤布局圖</p><p> 矩陣鍵盤內(nèi)部電路圖如圖4-3所示:</p><p> 圖4-3矩陣鍵盤內(nèi)部電路圖</p><p> (3).MM74C922</p><p> 為了進(jìn)一步節(jié)省單片機(jī)I/O口資源,我在設(shè)計(jì)中使用了MM74C922芯片。M
26、M74C922是一款4*4鍵盤掃描IC,它可檢測到與之相連的4*4鍵盤的按鍵輸入,并通過數(shù)據(jù)輸出口將按鍵相應(yīng)的編碼輸出。其引腳圖如圖4-4所示:</p><p> 圖4-4 MM94C22</p><p> MM74C922特點(diǎn)及引腳功能</p><p> MM74C922具有下列特點(diǎn):1.功耗低,電壓3—5V;2.三態(tài)門輸出,與LPTTL兼容;3.輸出鎖存
27、按下的最后的鍵;4.用一個(gè)電容器就可以消除鍵盤抖動(dòng);5.兩鍵輪回;6.行具有上拉功能;7.具有芯片內(nèi)或芯片外時(shí)鐘;8.最大開關(guān)電阻為50KΩ。MM74C922采用18腳雙列直插封裝,其引腳排列如圖圖4-4所示。各引腳功能如下:</p><p> (1) Y1~Y4(腳1~腳4):4*4鍵盤第一列至第四。</p><p> (2) X1~X4(腳11、10、8、7):4*4鍵盤第一行至第
28、四行。</p><p> (3) DOA~ DOD(Dataout A~D,腳14~17):按鍵之BCD碼輸出,其中DOA為LSB,DOD為MSB。</p><p> (4) OSC(Oscillator,腳5):鍵盤掃描電路之頻率所需外加電容的連引腳。</p><p> (5) KBM(Keyboard Mask,腳6):內(nèi)部消除開關(guān)彈跳電路所外加電容的引腳
29、。</p><p> (6) OE(Output Enable,腳13):芯片使能腳,接低電位可使芯片使能。</p><p> (7) DA(Data Available,腳12):數(shù)據(jù)有效輸出腳。任一按鍵按下時(shí),此腳位會(huì)輸出高電位,按鍵釋放后此腳又會(huì)恢復(fù)為低電位。</p><p> MM74C92真值表如下表所示</p><p>
30、MM74C922真值表</p><p> 鍵盤掃描可采用外部時(shí)鐘或外接電容來執(zhí)行。譯碼器具有芯片的上拉電阻,使開關(guān)電阻可以高達(dá)50kΩ。開關(guān)矩陣中不需要二極管就可以消除多重開關(guān),內(nèi)部消顫電路僅需要一個(gè)單一電容就可以實(shí)現(xiàn)。當(dāng)有鍵按下時(shí),數(shù)據(jù)輸出有效為高電平;當(dāng)鍵釋放后,數(shù)據(jù)輸出有效返回到低電平。即使有另外一個(gè)鍵按下,在正常消顫期間后,數(shù)據(jù)輸出有效返回至高電平表明接受新的鍵輸入。在任何兩個(gè)開關(guān)之間備有兩鍵輪回功能。
31、即使某一鍵釋放,內(nèi)部鎖存器仍然鎖存住按下的最后的鍵值。三態(tài)門輸出便于總線的擴(kuò)展和運(yùn)行。</p><p><b> (4).LCD顯示</b></p><p> 本設(shè)計(jì)采用LCD液晶顯示器(圖4-5)來顯示輸出數(shù)據(jù)。通過D0-D7引腳向LCD寫指令字或?qū)憯?shù)據(jù)以使LCD實(shí)現(xiàn)不同的功能或顯示相應(yīng)數(shù)據(jù)。</p><p> 圖4-5 LM016L&
32、lt;/p><p> LM017L LCD采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如下表所示:</p><p><b> 引腳接口說明表</b></p><p> LM017L液晶模塊內(nèi)部的控制器共有11條控制指令,如下表所示:</p><p><b> 控制命令表</b>
33、;</p><p> 1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實(shí)現(xiàn)的。(說明:1為高電平、0為低電平)</p><p> 指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置。</p><p> 指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。</p><p> 指令3:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動(dòng)方向,高電平
34、右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。</p><p> 指令4:顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。</p><p> 指令5:光標(biāo)或顯示移位 S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)
35、。</p><p> 指令6:功能設(shè)置命令 DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線 N:低電平時(shí)為單行顯示,高電平時(shí)雙行顯示 F: 低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符。</p><p> 指令7:字符發(fā)生器RAM地址設(shè)置。</p><p> 指令8:DDRAM地址設(shè)置。</p><p> 指令9:讀忙信
36、號(hào)和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。</p><p><b> 指令10:寫數(shù)據(jù)。</b></p><p><b> 指令11:讀數(shù)據(jù)。</b></p><p> 讀寫操作時(shí)序如下圖所示:</p><p><b> 讀操
37、作時(shí)序</b></p><p><b> 寫操作時(shí)序</b></p><p> 1602LCD的RAM地址映射及標(biāo)準(zhǔn)字庫表</p><p> 液晶顯示模塊是一個(gè)慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時(shí)要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,下圖是160
38、2的內(nèi)部顯示地址。</p><p> 1602LCD內(nèi)部顯示地址</p><p> 例如第二行第一個(gè)字符的地址是40H,那么是否直接寫入40H就可以將光標(biāo)定位在第二行第一個(gè)字符的位置呢?這樣不行,因?yàn)閷懭腼@示地址時(shí)要求最高位D7恒定為高電平1所以實(shí)際寫入的數(shù)據(jù)應(yīng)該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。</p><
39、p> 在對液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時(shí)光標(biāo)是自動(dòng)右移的,無需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。</p><p> 1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,如圖10-58所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是
40、01000001B(41H),顯示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來,我們就能看到字母“A”</p><p> 圖10-58 字符代碼與圖形對應(yīng)圖</p><p><b> 5.課程設(shè)計(jì)步驟</b></p><p><b> 5.1問題分析</b></p><p> ?。?)怎么實(shí)現(xiàn)從
41、鍵盤輸入數(shù)據(jù)或功能的算法。</p><p> (2)怎么實(shí)現(xiàn)在LCD上數(shù)據(jù)的顯示的算法。</p><p> ?。?)怎么實(shí)現(xiàn)對數(shù)據(jù)的運(yùn)算功能的算法。</p><p><b> 5.2算法設(shè)計(jì)</b></p><p> ?。?)通過MM74C922芯片對鍵盤的譯碼來實(shí)現(xiàn)鍵盤輸入檢測程序。</p><
42、p> ?。?)利用LCD靜態(tài)顯示,通過程序向LCD寫指令字或數(shù)據(jù)使LCD完成不同功能或顯示相應(yīng)數(shù)據(jù)。</p><p> ?。?)將各種運(yùn)算符的算法通過編寫靈活的子程序來實(shí)現(xiàn)。</p><p><b> 5.3功能模塊分割</b></p><p> 5.4算術(shù)運(yùn)算程序流程圖</p><p><b>
43、5.5系統(tǒng)總流程圖</b></p><p> 5.6仿真電路模型的構(gòu)建</p><p> 6.課程設(shè)計(jì)結(jié)果及結(jié)論</p><p><b> 6.1課程設(shè)計(jì)結(jié)果</b></p><p> 6.1.1硬件/軟件程序設(shè)計(jì)</p><p><b> 1.硬件電路圖</
44、b></p><p><b> 2.軟件程序設(shè)計(jì)</b></p><p><b> 完整程序見附錄。</b></p><p><b> 7.心得體會(huì)</b></p><p> 剛開始,我們頭緒不是很清楚,不知道從哪里入手,但通過老師的耐心指導(dǎo)和同學(xué)認(rèn)真研究設(shè)計(jì)課題
45、,上網(wǎng)查資料、確定基本設(shè)計(jì)方案、對所用芯片功能進(jìn)行查找、調(diào)試、上機(jī)仿真等,經(jīng)歷了一次次的困難,卻積累了很多寶貴的經(jīng)驗(yàn)。在整個(gè)設(shè)計(jì)的過程中遇到的問題主要有以下三點(diǎn),第一:基礎(chǔ)知識(shí)掌握的不牢固,主要表現(xiàn)在一些常用的電路的形式和功能不清楚,對書本上的內(nèi)容理解不夠透徹。第二:對一些常用的應(yīng)用軟件缺少應(yīng)用。第三:相關(guān)知識(shí)掌握的不夠全面,缺少系統(tǒng)設(shè)計(jì)的經(jīng)驗(yàn)。我覺得動(dòng)手之前,頭腦里必須清楚該怎么做,這一點(diǎn)是很重要的。</p><p
46、><b> 8.參考文獻(xiàn)</b></p><p> [1] 何宏、龔?fù)?編著,單片機(jī)原理與接口技術(shù),北京,國防工業(yè)出版社,2006.1 </p><p> [2].康華光,電子技術(shù)基礎(chǔ) 數(shù)字部分(第五版),高等教育出版社,2006.1。</p><p> [3] 胡漢才 編著,單片機(jī)原理及其接口技術(shù),北京:清華大學(xué)出版社,199
47、6.7 </p><p> [4].郭天祥,51單片機(jī)C語言教程,北京:電子工業(yè)出版社,2009.1。</p><p> [5] 何立民 主編,MCS-51系列單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì),北京:北京航空航天大學(xué)出版社,1990</p><p><b> 9.附錄</b></p><p> #include<reg
48、51.h></p><p> #include<math.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> uchar code table[]="wsn_ji_suan_qi"
49、;</p><p> char translate(int keycode);</p><p> void arithmetic();</p><p> void init_LCM();</p><p> void write_data(char ddata);</p><p> void write_com
50、(char command);</p><p> void check_BF();</p><p> void clearLCD();</p><p> void display(long a);</p><p> void dealerror(); </p><p> void dataoverflow(
51、);</p><p><b> /*定義變量*/</b></p><p> long x=0,x1=0,y=0,z=0,num=0;</p><p> int operators,input,iny=0,count=0;</p><p> uchar k=0;</p><p><b
52、> char key;</b></p><p> char error[5]="error";</p><p> char overflow[8]="overflow";</p><p> sbit EN=P3^4;</p><p> sbit R_W=P3^5;</p
53、><p> sbit RS=P3^6;</p><p><b> main()</b></p><p><b> {</b></p><p><b> EA=1;</b></p><p><b> EX0=1;</b><
54、/p><p><b> IT0=1;</b></p><p><b> P2=0xff;</b></p><p> write_com(0x30);//display(0);</p><p> init_LCM();</p><p> write_com(0x01);&
55、lt;/p><p> for(count=0;count<16;count++)</p><p><b> {</b></p><p> write_data(table[count]);</p><p><b> }</b></p><p> write_c
56、om(0x80+0x40); //改變地址指針從第二行開始寫</p><p><b> while(1)</b></p><p><b> {</b></p><p><b> }</b></p><p><b> }</b></p>
57、<p> char translate(int keycode)//鍵盤譯碼</p><p><b> {</b></p><p> switch(keycode)</p><p><b> {</b></p><p> case 0: return '7';
58、 break;</p><p> case 1: return '4'; break;</p><p> case 2: return '1';break;</p><p> case 3: return 'c';break;</p><p> case 4: return
59、'8';break;</p><p> case 5: return '5';break;</p><p> case 6: return '2';break;</p><p> case 7: return '0';break;</p><p> case
60、 8: return '9';break;</p><p> case 9: return '6';break;</p><p> case 10: return '3';break;</p><p> case 11: return '=';break;</p><
61、;p> case 12: return '/';break;</p><p> case 13: return '*';break;</p><p> case 14: return '-';break;</p><p> case 15: return '+';break;<
62、;/p><p><b> } </b></p><p><b> }</b></p><p> /*外部中斷處理*/</p><p> void INT_0(void) interrupt 0 </p><p><b> { </b>
63、</p><p> if(key=='=')</p><p> { key=translate(P2&0x0f);</p><p> if(key<='9'&&key>='0')</p><p> clearLCD();</p><
64、p><b> else</b></p><p> { clearLCD();</p><p> display(x1);</p><p><b> x=x1/10;</b></p><p><b> }</b></p><p><
65、b> }</b></p><p> key=translate(P2&0x0f);</p><p> if(key<='9'&&key>='0') //判斷按下的鍵是否為數(shù)值</p><p><b> {</b></p><p>
66、; num=num*10+(key-'0');</p><p> if (operators>0)</p><p><b> {</b></p><p><b> y=num;</b></p><p><b> iny=1;</b></p&
67、gt;<p><b> }</b></p><p><b> else</b></p><p><b> x=num;</b></p><p> if(num<214748364&&num>-214748364) </p><p
68、><b> {</b></p><p> write_data(key); </p><p><b> }</b></p><p><b> else</b></p><p> dataoverflow();</p><p><b
69、> }</b></p><p><b> else</b></p><p><b> {</b></p><p> switch(key)</p><p><b> {</b></p><p><b> case
70、'c':</b></p><p><b> x=0;</b></p><p><b> y=0;</b></p><p><b> num=0;</b></p><p> operators=0;</p><p>
71、clearLCD();</p><p><b> break;</b></p><p><b> case '=':</b></p><p> write_data(0x3d);</p><p> arithmetic();</p><p><b
72、> iny=0;</b></p><p> operators=0;</p><p><b> num=0;</b></p><p><b> break;</b></p><p><b> case '+':</b></p&g
73、t;<p> write_data(0x2b);</p><p> if (operators)</p><p> arithmetic();</p><p> operators=1;</p><p><b> num=0;</b></p><p><b>
74、break;</b></p><p><b> case '-':</b></p><p> write_data(0x2d);</p><p> if (operators)</p><p> arithmetic();</p><p> operators
75、=2;</p><p><b> num=0;</b></p><p><b> break;</b></p><p><b> case '*':</b></p><p> write_data(0x2a);</p><p>
76、 if (operators)</p><p> arithmetic();</p><p> operators=3;</p><p><b> num=0;</b></p><p><b> break;</b></p><p><b> case &
77、#39;/':</b></p><p> write_data(0x2f);</p><p> if (operators)</p><p> arithmetic();</p><p> operators=4;</p><p><b> num=0;</b><
78、;/p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void arithmetic()//運(yùn)算子程
79、序</p><p><b> {</b></p><p><b> if(iny)</b></p><p><b> {</b></p><p> switch(operators)</p><p><b> {</b>&
80、lt;/p><p><b> case 1:</b></p><p> x1=(x+y)*10;</p><p> num=x1; if(num<214748364&&num>-214748364)</p><p><b> {</b>&
81、lt;/p><p> display(num);</p><p><b> }</b></p><p><b> else</b></p><p> dataoverflow();</p><p><b> break;</b></p>
82、<p><b> case 2:</b></p><p> x1=(x-y)*10;</p><p> num=x1; if(num<214748364&&num>-214748364)</p><p><b> {</b></p&g
83、t;<p> display(num);</p><p><b> }</b></p><p><b> else</b></p><p> dataoverflow();</p><p><b> break;</b></p><p
84、><b> case 3:</b></p><p> x1=x*y*10;</p><p> num=x1; if(num<214748364&&num>-214748364)</p><p><b> {</b></p><p
85、> display(num);</p><p><b> }</b></p><p><b> else</b></p><p> dataoverflow();</p><p><b> break;</b></p><p><b
86、> case 4:</b></p><p><b> if (y==0)</b></p><p> dealerror();</p><p><b> else</b></p><p><b> {</b></p><p>
87、 x1=(x*10)/y;</p><p><b> num=x1; </b></p><p> if(num<214748364&&num>-214748364)</p><p><b> {if(x>=y)</b></p><p><b> {
88、</b></p><p> display(num);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> write_data(0x30+0);
89、</p><p> write_data(0x2e);</p><p> write_data(0x30+num);</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b><
90、/p><p> dataoverflow();</p><p> //x=x1/10;</p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p&g
91、t;<b> y=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> void init_LCM()</p><p><b> {</b></p><p> wri
92、te_com(0x30);</p><p> write_com(0x30);</p><p> write_com(0x30);</p><p> write_com(0x38);</p><p> write_com(0x08);</p><p> write_com(0x01);</p>
93、<p> write_com(0x06);</p><p> write_com(0x0e);</p><p><b> }</b></p><p> /*LCD寫數(shù)據(jù)*/</p><p> void write_data(char ddata)</p><p><b&g
94、t; {</b></p><p> RS=1;/*寫數(shù)據(jù)*/</p><p><b> R_W=0;</b></p><p> EN=1;/*使能開*/</p><p> P1=ddata;/*將數(shù)據(jù)送入p1口*/</p><p> EN=0;/*使能關(guān)*/</
95、p><p> check_BF();</p><p><b> }</b></p><p> /*LCD寫指令*/</p><p> void write_com(char command)</p><p><b> {</b></p><p&g
96、t; RS=0;/*寫指令*/</p><p><b> R_W=0;</b></p><p> EN=1;/*使能開*/</p><p> P1=command;/*將數(shù)據(jù)送入p1口*/</p><p> EN=0;/*使能關(guān)*/</p><p> check_BF();<
97、;/p><p><b> }</b></p><p> /*LCD檢查忙碌*/</p><p> void check_BF()</p><p><b> {</b></p><p> char i,x=0x80;</p><p><b&g
98、t; P1=0xff;</b></p><p> while(x&0x80)</p><p><b> {</b></p><p><b> RS=0;</b></p><p><b> R_W=1;</b></p><p>
99、;<b> EN=1;</b></p><p><b> x=P1;</b></p><p><b> EN=0;</b></p><p> for (i=0;i<10;i++);</p><p><b> }</b></p>
100、<p> EN=0;/*關(guān)使能*/</p><p><b> }</b></p><p><b> /*LCD清屏*/</b></p><p> void clearLCD()</p><p><b> {</b></p><p>
101、 for(z=0;z<32;z++)</p><p><b> {</b></p><p> write_com(0x80+0x40+z);</p><p> write_data(' ');</p><p><b> }</b></p><p&g
102、t; write_com(0x80+0x40);</p><p><b> }</b></p><p><b> /*LCD顯示*/</b></p><p> void display(long a)</p><p><b> {</b></p><
103、;p> long temp,b,c=-1;</p><p> int lenth=1,i,j;</p><p><b> if(a<0)</b></p><p><b> {</b></p><p><b> a=a*c;</b></p>&
104、lt;p> write_data('-');</p><p><b> } </b></p><p><b> temp=a;</b></p><p> while((temp=temp/10)!=0)</p><p><b> {</b>&l
105、t;/p><p><b> lenth++;</b></p><p><b> }</b></p><p> for(i=lenth;i>1;i--)</p><p><b> {</b></p><p><b> b=1;<
106、/b></p><p> for(j=0;j<i-1;j++)</p><p><b> {</b></p><p><b> b=b*10;</b></p><p><b> }</b></p><p> write_data(0
107、x30+a/b);</p><p><b> a=a%b;</b></p><p><b> }</b></p><p> write_data(0x2e);</p><p> write_data(0x30+a);</p><p><b> }</
108、b></p><p> void dealerror()</p><p><b> {</b></p><p><b> int i=0;</b></p><p> clearLCD();</p><p> for(i=0;i<5;i++)</p&
109、gt;<p> write_data(error[i]);</p><p><b> }</b></p><p> /*數(shù)值溢出處理*/</p><p> void dataoverflow()</p><p><b> {</b></p><p>&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于單片機(jī)的計(jì)算器設(shè)計(jì)-單片機(jī)課程設(shè)計(jì)
- 單片機(jī)計(jì)算器課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--計(jì)算器
- 單片機(jī)課程設(shè)計(jì)-計(jì)算器
- 課程設(shè)計(jì)-單片機(jī)計(jì)算器
- 單片機(jī)課程設(shè)計(jì)——計(jì)算器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---計(jì)算器實(shí)驗(yàn)
- 單片機(jī)課程設(shè)計(jì)--簡易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)簡易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)-簡易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)簡易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)報(bào)告---計(jì)算器
- 單片機(jī)課程設(shè)計(jì)--簡易計(jì)算器
- 單片機(jī)系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)--計(jì)算器
- 51單片機(jī)計(jì)算器設(shè)計(jì)課程設(shè)計(jì)
- 課程設(shè)計(jì)---單片機(jī)簡易計(jì)算器設(shè)計(jì)
- 基于51單片機(jī)簡易計(jì)算器課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---簡易計(jì)算器的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--簡易計(jì)算器的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告計(jì)算器2
評(píng)論
0/150
提交評(píng)論