單片機4x4鍵盤計算器課程設(shè)計_第1頁
已閱讀1頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  《單片機課程設(shè)計報告》</p><p>  教 學(xué) 院: </p><p>  專業(yè)班級: </p><p>  學(xué) 號: </p><p>  學(xué)生姓名: </p>

2、<p>  指導(dǎo)教師: </p><p>  時 間: </p><p>  地 點: </p><p>  單片機課程設(shè)計任務(wù)書</p><p><b>  一、課題名稱</b></p&g

3、t;<p><b>  單片機課程設(shè)計</b></p><p><b>  二、設(shè)計目的 </b></p><p>  為了進(jìn)一步鞏固學(xué)習(xí)的理論知識,增強學(xué)生對所學(xué)知識的實際應(yīng)用能力和運用所學(xué)的知識解決實際問題的能力,開始為期兩周的單片機課程設(shè)計。通過實訓(xùn)使學(xué)生在鞏固所學(xué)知識的基礎(chǔ)之上具有初步的單片機系統(tǒng)設(shè)計與應(yīng)用能力。</p

4、><p><b>  三、設(shè)計內(nèi)容</b></p><p>  設(shè)計基于51單片機的簡易計算器系統(tǒng)電路,并以該電路為基礎(chǔ)進(jìn)行編程,要求能夠?qū)崿F(xiàn)0-99之間的數(shù)進(jìn)行加、減、乘、除運算的功能。 </p><p><b>  四、設(shè)計要求 </b></p><p>  1、設(shè)計簡易計算器,要求能對0-99之間

5、的數(shù)進(jìn)行加、減、乘、除運算。</p><p>  2、用4×4的鍵盤作為輸入設(shè)備。</p><p>  3、用LED或LCD進(jìn)行顯示。</p><p>  4、編寫無符號數(shù)加、減、乘、除運算、輸入和顯示的程序。</p><p>  5、對系統(tǒng)的進(jìn)行綜合和調(diào)試,使其具有對0-99之間的數(shù)進(jìn)行加、減、乘、除運算的功能。</p>

6、;<p>  6、編寫課程設(shè)計的總結(jié)</p><p><b>  五、設(shè)計進(jìn)度表</b></p><p><b>  六、設(shè)計報告</b></p><p>  課程設(shè)計報告的基本內(nèi)容至少包括封面、正文、附錄三部分。課程設(shè)計報告要求統(tǒng)一格式,字體工整規(guī)范。</p><p><b&g

7、t;  1、封面</b></p><p>  封面包括“《單片機課程設(shè)計》課程設(shè)計報告”、班級、姓名、學(xué)號以及完成日期等。</p><p><b>  2、正文</b></p><p>  正文是實踐設(shè)計報告的主體,具體由以下幾部分組成:</p><p> ?。?)課程設(shè)計題目;</p><

8、;p>  (2)課程設(shè)計任務(wù)與要求;</p><p> ?。?)設(shè)計過程(包括設(shè)計方案、設(shè)計原理、創(chuàng)新點以及采用的新技術(shù)等);</p><p>  (4)方案的比較與論證;</p><p> ?。?)硬件電路設(shè)計,各個模塊的設(shè)計與器件的選擇;</p><p> ?。?)軟件程序的設(shè)計與調(diào)試;</p><p>  

9、(7)課程設(shè)計總結(jié)(包括自己的收獲與體會;遇到的問題和解決的方法;技術(shù)實現(xiàn)技巧和創(chuàng)新點;作品存在的問題和改進(jìn)設(shè)想等);</p><p><b>  3.附錄</b></p><p>  附錄1:系統(tǒng)設(shè)計原理圖</p><p>  附錄2:系統(tǒng)硬件元器件清單</p><p><b>  附錄3:系統(tǒng)的程序<

10、/b></p><p>  七、考核方式與成績評定辦法</p><p>  備注:成績等級:優(yōu)(90分~100分)、良(80分~89分)、中(70分~79分)、及格(60分~69分)、60分以下為不及格。</p><p><b>  八、參考書目</b></p><p>  [1] 李朝青.單片機原理及接口技術(shù)(簡

11、明修訂版).杭州:北京航空航天大學(xué)出版社,1998</p><p>  [2] 李廣弟.單片機基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,1994</p><p>  [3] 閻石.數(shù)字電子技術(shù)基礎(chǔ)(第三版). 北京:高等教育出版社,1989</p><p>  [4] 廖常初.現(xiàn)場總線概述[J].電工技術(shù),1999.</p><p>  [5

12、] 徐仁貴等編著.《單片微型計算機應(yīng)用技術(shù)》.北京:機械工業(yè)出版社.2001年2月第1版 </p><p>  [6] 張毅剛等編著.《單片機原理及應(yīng)用》. 北京:高等教育出版社.2004年1月第1版</p><p>  一、課程設(shè)計任務(wù)與要求</p><p>  設(shè)計基于51單片機的簡易計算器系統(tǒng)電路,并以該電路為基礎(chǔ)進(jìn)行編程,要求能夠?qū)崿F(xiàn)0-99之間的數(shù)

13、進(jìn)行加、減、乘、除運算的功能,并要求如下:</p><p>  1、設(shè)計簡易計算器,要求能對0-99之間的數(shù)進(jìn)行加、減、乘、除運算;</p><p>  2、用4×4的鍵盤作為輸入設(shè)備;</p><p>  3、用LED或LCD進(jìn)行顯示;</p><p>  4、使用C語言編寫無符號數(shù)加、減、乘、除運算、輸入和顯示的程序;</

14、p><p>  5、對系統(tǒng)的進(jìn)行綜合和調(diào)試,使其具有對0-99之間的數(shù)進(jìn)行加、減、乘、除運算的功能,還具有清零功能等;</p><p>  6、編寫課程設(shè)計的總結(jié)。</p><p>  二、設(shè)計方案與選擇方案</p><p><b>  1、芯片</b></p><p><b>  1.1、

15、方案構(gòu)思</b></p><p>  本設(shè)計中的芯片可以采用兩種方案,一種是以FPGA為核心處理芯片,配備相應(yīng)的外設(shè);另一種是以STC89C52處理器,配備相應(yīng)的外設(shè)。</p><p> ?。?)方案一:采用FPGA控制</p><p>  FPGA是一種高密度的可編程邏輯器件,自從Xilinx公司1985年推出第一片F(xiàn)PGA以來,F(xiàn)PGA的集成密度和性

16、能提高很快,其集成密度最高達(dá)500萬門/片以上,系統(tǒng)性能可達(dá)200MHz。由于FPGA器件集成密度高,方便易用,開發(fā)和上市周期短,在數(shù)字設(shè)計和電子生產(chǎn)中得到迅速普及和應(yīng)用,并一度在高密度的可編程邏輯器件領(lǐng)域中獨占鰲頭。</p><p>  但是基于SRAM編程的FPGA,其編程信息需存放在外部存儲器上,需外部存儲器芯片,且使用方法復(fù)雜,保密性差,而其對于一個簡單的計算器而言,使用FPGA有點大材小用,成本太高。&

17、lt;/p><p>  (2)方案二:采用AT89C51</p><p>  單片機是單片微型機的簡稱,故又稱為微控制器MCU(Micro Control Unit)。通常由單塊集成電路芯片組成,內(nèi)部包含有計算機的基本功能部件:中央處理器CPU,存儲器和I/O接口電路等。因此,單片機只要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個單片機控制系統(tǒng)。單片機廣泛應(yīng)用于智能產(chǎn)品,智能儀表,測控技術(shù),智能

18、接口等,具有操作簡單、實用方便、價格便宜等優(yōu)點。</p><p>  AT89C51是一種帶4K字節(jié)FLASH存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節(jié)閃存可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復(fù)擦除1000次。該器件采用ATM

19、EL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器。</p><p>  1.2、方案比較與選擇</p><p>  通過以上兩種方案的論證和比較,從設(shè)計的實用性、方便性和成本等諸多方面考慮,最終選擇了以AT89C51單片機作為中央處理單元進(jìn)行計算器的設(shè)計,這樣

20、設(shè)計能夠?qū)崿F(xiàn)對六位整數(shù)、兩位小數(shù)的加、減、乘、除的四則運算。</p><p><b>  2、輸入模塊</b></p><p><b>  2.1、方案構(gòu)思</b></p><p> ?。?)方案一:采用獨立式按鍵作為輸入模塊</p><p>  獨立式按鍵輸入模塊,其特點是:直接用I/O口構(gòu)成單個

21、按鍵電路,接口電路配置靈活、按鍵識別和軟件結(jié)構(gòu)簡單;但是當(dāng)鍵數(shù)較多時,占用I/O口較多,比較浪費資源。其原理圖如圖1所示。</p><p>  圖 1 獨立的功能按鍵 圖 2 矩陣鍵盤輸入</p><p> ?。?)方案二:采用矩陣式鍵盤作為輸入模塊</p><p>  矩陣式按鍵輸入模塊,其特點是:電路和軟件稍復(fù)雜,但相比之下,當(dāng)鍵數(shù)

22、越多時,越節(jié)約I/O口,比較節(jié)省資源。其原理圖如圖2所示。</p><p>  2.2、方案比較與選擇</p><p>  本設(shè)計中的輸入模塊使用的是矩陣鍵盤輸入。</p><p>  鍵盤輸入預(yù)置用于計算,按鍵較多。若是采用獨立按鍵,需頻繁按鍵,為軟件設(shè)計增加負(fù)擔(dān),且操作界面不友好;若是采用矩陣式按鍵,可以方便地輸入一個數(shù)值,使操作界面更具有人性化,且節(jié)約了寶貴的

23、I/O口資源。</p><p>  通過對比,故采用方案二作為系統(tǒng)輸入模塊。</p><p><b>  3、顯示模塊</b></p><p><b>  3.1、方案構(gòu)思</b></p><p> ?。?)方案一:采用LED數(shù)碼管靜態(tài)顯示</p><p>  采用LED數(shù)碼

24、管的靜態(tài)顯示,其特點是:其亮度較高;這種顯示方式接口,編程容易且管理簡單;不足的是,占用的I/O的線資源較多。如果采用單片機或CPLD/FPGA來控制的話,勢必存在浪費I/O口資源的問題。如圖3所示。</p><p>  圖 3 4位數(shù)碼管靜態(tài)顯示</p><p> ?。?)方案二:采用LED數(shù)碼管動態(tài)顯示</p><p>  采用LED數(shù)碼管的動態(tài)顯示,其特點是

25、:其亮度比靜態(tài)顯示的亮度要差一些;但其電路比較簡單,適合于顯示位數(shù)較多的情況。如圖4所示。</p><p>  圖 4 4位數(shù)碼管的動態(tài)顯示</p><p>  (3)方案三:采用LCD1602液晶顯示</p><p>  采用LCD1602液晶顯示,其特點是:可以調(diào)節(jié)其背光亮度,這種顯示方式接口,編程雖然有些麻煩,但管理較方便,占用的I/O口資源線也不多。<

26、;/p><p>  3.2、方案比較與選擇</p><p>  本設(shè)計中的顯示模塊使用的是LCD1602液晶顯示。</p><p>  在計算器運算中,需顯示的數(shù)字、符號較多,按很據(jù)個方面的特點,而后可以發(fā)現(xiàn)LCD液晶顯示,雖然在價格上的確是稍貴于LED數(shù)碼管;但數(shù)碼管在硬件設(shè)計電路中,會因線太多、線路復(fù)雜而過于繁瑣,則舍棄LED數(shù)碼管,選擇LCD液晶顯示。</p

27、><p>  通過對比,故采用方案三作為系統(tǒng)顯示模塊。</p><p>  三、整體方案原理框圖</p><p>  1.1硬件與軟件系統(tǒng)設(shè)計</p><p>  依據(jù)系統(tǒng)分析及實現(xiàn)功能,硬件小系統(tǒng)方框圖如圖1所示:</p><p><b>  圖5 </b></p><p>

28、  依據(jù)系統(tǒng)硬件設(shè)計,軟件系統(tǒng)主要包括:</p><p>  單片機控制程序模塊:作為系統(tǒng)的主控制程序模塊,用KeilC編程控制其他程序模塊的協(xié)調(diào)工作;</p><p>  鍵盤程序模塊:用來輸入用戶的功能,使單片機完成相應(yīng)的控制功能;</p><p>  液晶顯示模塊:使用字符型液晶顯示器顯示用戶的選擇。</p><p>  1.2 單片機

29、模塊 </p><p>  單片機控制主程序流程圖如下:</p><p><b>  圖6 </b></p><p>  單片機外圍擴展電路程序模塊</p><p>  為了節(jié)約成本,本設(shè)計中液晶顯示模塊與單片機之間采用模擬口線的方式控制,鍵盤與單片機之間采用掃描的工作方式。</p><p> 

30、 鍵盤程序流程圖(掃描方式)</p><p>  鍵盤程序流程圖如下所示:</p><p><b>  圖7</b></p><p>  LCM程序流程圖如下所示:</p><p><b>  圖8</b></p><p>  本設(shè)計的軟件系統(tǒng)分別用偉福E6000和KeilC

31、編寫及編譯。4*4鍵盤程序模塊用匯編語言和C語言編寫,實現(xiàn)直接從P2口掃描得到鍵盤碼,并采用查詢方式得到與之對應(yīng)的LCD字型碼,在LCD上顯示出來。</p><p><b>  四、單元電路設(shè)計</b></p><p><b>  1.1鍵盤輸入</b></p><p>  計算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果

32、采用獨立按鍵的方式,在這種情況下,編程會很簡單,但是會占用大量的I/O口資源,因此在很多情況下都不采用這種方式。為此,我們引入了矩陣鍵盤的應(yīng)用,采用四條I/O線作為行線,四條I/O線作為列線組成鍵盤。在行線和列線的每個交叉點上設(shè)置一個按鍵。這樣鍵盤上按鍵的個數(shù)就為4×4個。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機系統(tǒng)中I/O口的利用率。</p><p>  矩陣鍵盤的工作原理:</p><

33、;p>  計算器的鍵盤布局如圖5所示:一般有16個鍵組成,在單片機中正好可以用一個P口實現(xiàn)16個按鍵功能,這種形式在單片機系統(tǒng)中也最常用。 </p><p><b>  圖9 鍵盤布局圖</b></p><p>  圖10 矩陣鍵盤內(nèi)部電路圖</p><p>  鍵盤上的每一個按鍵都有一個鍵值。給鍵賦值的最直接辦法是將行、列線按二進(jìn)制順

34、序排列,當(dāng)某一鍵按下時,鍵盤掃描程序執(zhí)行到給該列置低電平0,若讀出各行狀態(tài)為非全1,這時的行、列數(shù)據(jù)組合成鍵值。鍵盤鍵值從左到右、從上到下依次是77,7B,7D,7E;B7,BB,BD,BE,…,E7,EB,ED,EE。這種負(fù)邏輯表示往往不夠直觀,因而采用行、列線加反向器或軟件求反的方法將鍵盤改成正邏輯。這時,鍵值依次為88,84,82,81;48,44,42,41,…,18,14,12,11。不論是正邏輯還是負(fù)邏輯,這種鍵值表示方式分

35、散度在且不等距,用于指令不太方便。對于不是4*4或8*4或8*8鍵盤,使用也不容易,故在許多場合下,采用依次排列鍵值的方法。這時的鍵值與鍵號相一致。</p><p><b>  1.2 單片機控制</b></p><p>  MCS-51單片機是在一塊芯片中集成了CPU、RAM、ROM、定時器/計數(shù)器和多功能I/O等一臺計算機所需要的基本功能部件。如果按功能劃分,它由

36、如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲器(RAM)、程序存儲器(ROM/EPROM)、并行I/O口、串行口、定時器/計數(shù)器、中斷系統(tǒng)及特殊功能寄存器(SFR)。</p><p>  單片機是靠程序運行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨特的一些功能,通過使用單片機編寫的程序可以實現(xiàn)高智能,高效率,以及高可靠性!因此我們采用單片機作為計算器的主要功能部件,可以進(jìn)行很快地實現(xiàn)運算功

37、能。</p><p>  圖11 單片機控制電路的時鐘電路和復(fù)位電路</p><p><b>  LCD1602顯示</b></p><p>  圖12 LCD1602顯示</p><p>  1602點陣字符液晶模塊(LCM)引腳及功能</p><p>  1腳(VDD/VSS):電源5V

38、77;10%或接地。</p><p>  2腳(VSS/ VDD):接地或電源(5±0.5)V。</p><p>  3腳(VO):反視度調(diào)整。使用可變電阻調(diào)整,通常接地。</p><p>  4腳(RS):寄存器選擇(1:選擇數(shù)據(jù)寄存器;0:選擇指令寄存器)。</p><p>  5腳(R/W):讀/寫選擇(1:讀;0:寫)。&l

39、t;/p><p>  6腳(E):使能操作(1:LCM可做讀寫操作;0:LCM不可做讀寫操作)。</p><p>  7腳(DB0):雙向數(shù)據(jù)總線的第0位。</p><p>  8腳(DB1):雙向數(shù)據(jù)總線的第1位。</p><p>  9腳(DB2):雙向數(shù)據(jù)總線的第2位。</p><p>  10腳(DB3):雙向數(shù)據(jù)

40、總線的第3位。</p><p>  11腳(DB4):雙向數(shù)據(jù)總線的第4位。</p><p>  12腳(DB5):雙向數(shù)據(jù)總線的第5位。</p><p>  13腳(DB6):雙向數(shù)據(jù)總線的第6位。</p><p>  14腳(DB7):雙向數(shù)據(jù)總線的第7位。</p><p>  15腳(VDD):背光顯示器電源+5

41、V。</p><p>  16腳(VSS):背光顯示器接地。</p><p><b>  五、實物效果圖</b></p><p>  圖13 實物效果圖</p><p><b>  六、心得體會</b></p><p>  兩周的時間,終于順利完成了單片機的課程設(shè)計。由于

42、自己對單片機編程還不是很熟悉,結(jié)果在設(shè)計的時候遇到了一系列問題,程序總是調(diào)試部處理,不過還好,最后在同學(xué)的幫助下終于把程序調(diào)試出來了,雖然程序設(shè)計實現(xiàn)的功能與老師要求的不盡相同,不過勉強還算可以。從這里我知道了基本知識的重要性。其實進(jìn)行程序設(shè)計的時候主要是對各功能模塊的把握。計算器里面最難的一部分是矩陣鍵盤的掃描和編碼,那個費了很大力氣。</p><p>  另外一點就是硬件焊接調(diào)試部分。焊接的時候到時輕松,一個

43、下午就焊接好了,然后是調(diào)試部分。調(diào)試花費的時間還是比較長的。不過有了上個學(xué)期數(shù)字電路焊接調(diào)試的經(jīng)驗,這次單片機調(diào)試還算是比較順利。我也是從電路板的正負(fù)電源檢測起,一步一步來,最終得到了想要的結(jié)果。調(diào)試的時候主要遇到了兩個問題。一個是鍵盤總是沒有反應(yīng),為了這個自己調(diào)試了很久,前前后后把電路板檢查了幾次,最后才發(fā)現(xiàn)是鍵盤本身的問題,和同學(xué)們換了個好鍵盤才行。另一個問題是總是顯示不出來1、4、7這三個數(shù)字。檢測來檢測去,發(fā)現(xiàn)來是在測試最小系統(tǒng)

44、時在一個位選端接了高電平,對位選信號產(chǎn)生了影響。當(dāng)把那個高電平去掉后,終于得到了正確的結(jié)果。</p><p>  總的來說這次課程設(shè)計達(dá)到了完成了基本任務(wù),達(dá)到了基本要求。通過親身對程序設(shè)計和電路焊接調(diào)試的體會,自己對單片機有了進(jìn)一步的了解,單片機編程能力也得到了提高。電路板的焊接與調(diào)試,使自己電路調(diào)試的方法和思想進(jìn)一步加強了。這次單片機課程設(shè)計應(yīng)該說是比較成功的。</p><p><

45、;b>  七、參考文獻(xiàn)</b></p><p>  [1] 李朝青.單片機原理及接口技術(shù)(簡明修訂版).杭州:北京航空航天大學(xué)出版社,1998</p><p>  [2] 李廣弟.單片機基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,1994</p><p>  [3] 閻石.數(shù)字電子技術(shù)基礎(chǔ)(第三版). 北京:高等教育出版社,1989</p>

46、;<p>  [4] 廖常初.現(xiàn)場總線概述[J].電工技術(shù),1999.</p><p><b>  八、附錄</b></p><p><b>  1. 系統(tǒng)程序</b></p><p>  #include <reg52.h></p><p>  #define uchar

47、 unsigned char</p><p>  #define uint unsigned int</p><p>  sbit rs=P1^0;</p><p>  sbit rw=P1^1;</p><p>  sbit e=P1^2;</p><p>  void write_dat(uchar dat); &

48、lt;/p><p>  void write_com(uchar com);</p><p>  void keyscan();</p><p>  /********************** </p><p><b>  功能說明:</b></p><p>  顯示編碼,加上0x30,</

49、p><p>  分別為'1','2','3','+',</p><p>  '4','5','6','-',等</p><p>  **********************/</p><p>  uchar code

50、 table1[]=</p><p><b>  {</b></p><p>  1,2,3,0x2b-0x30,</p><p>  4,5,6,0x2d-0x30,</p><p>  7,8,9,0x2a-0x30,</p><p>  0,0x3d-0x30,0x01-0x30,0x2f-

51、0x30</p><p><b>  };</b></p><p>  uchar k=0,flag=0,num,fuhao,i;</p><p>  long a,b,c;</p><p>  void delay(uint z)</p><p><b>  {</b>&l

52、t;/p><p><b>  uint x,y;</b></p><p>  for(x=z;x>0;x--)</p><p>  for(y=110;y>0;y--);</p><p><b>  }</b></p><p>  void keyscan()<

53、/p><p><b>  {</b></p><p>  uchar temp;</p><p><b>  P2=0xfe;</b></p><p><b>  temp=P2;</b></p><p>  temp=temp&0xf0;</

54、p><p>  while(temp!=0xf0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p><b>  temp=P2;</b></p><p>  temp=temp&0xf0

55、;</p><p>  while(temp!=0xf0)</p><p><b>  {</b></p><p><b>  temp=P2;</b></p><p>  switch(temp)</p><p><b>  {</b></p&g

56、t;<p>  case 0xee:num=0;</p><p><b>  break; </b></p><p>  case 0xde:num=1;</p><p><b>  break;</b></p><p>  case 0xbe:num=2;</p>

57、<p><b>  break;</b></p><p>  case 0x7e:num=3;</p><p><b>  break;</b></p><p><b>  } </b></p><p>  while(temp!=0xf0)</p>

58、<p>  { temp=P2;</p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*當(dāng)按下1,2,3,松手后執(zhí)行下面這段語句*/</p><p>  

59、if(num==0||num==1||num==2)</p><p><b>  {</b></p><p>  if(flag==0)</p><p>  a=a*10+table1[num];//如果沒有按符號鍵,符號前的數(shù)值為a</p><p>  else if(flag==1)</p><p

60、>  b=b*10+table1[num]; //如果按了符號鍵,符號后的數(shù)值為b</p><p>  if(k==1) //如果之前按了'='號,再按鍵時清屏,進(jìn)行下一次計算</p><p><b>  {</b></p><p><b>  k=0;</b></p><

61、p>  write_com(0x01);</p><p><b>  }</b></p><p><b>  } </b></p><p>  else if(num==3) //判斷按下'+'</p><p><b>  {</b></p>

62、;<p><b>  flag=1;</b></p><p><b>  fuhao=1;</b></p><p><b>  } </b></p><p>  i=table1[num]; //顯示按下的鍵</p><p>  write_dat(0x30

63、+i); </p><p><b>  }</b></p><p><b>  P2=0xfd;</b></p><p><b>  temp=P2;</b></p><p>  temp=temp&0xf0;</p><p>  while(t

64、emp!=0xf0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p><b>  temp=P2;</b></p><p>  temp=temp&0xf0;</p><p>  w

65、hile(temp!=0xf0)</p><p><b>  {</b></p><p><b>  temp=P2;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xed:

66、num=4;</p><p><b>  break; </b></p><p>  case 0xdd:num=5;</p><p><b>  break;</b></p><p>  case 0xbd:num=6;</p><p><b>  break

67、;</b></p><p>  case 0x7d:num=7;</p><p><b>  break;</b></p><p><b>  } </b></p><p>  while(temp!=0xf0)</p><p>  { temp=P2;<

68、;/p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(num==4||num==5||num==6) //判斷是否按下'4','5','6'&l

69、t;/p><p><b>  {</b></p><p><b>  if(k==1)</b></p><p><b>  {</b></p><p><b>  k=0;</b></p><p>  write_com(0x01);&

70、lt;/p><p><b>  }</b></p><p>  if(flag==0)</p><p>  a=a*10+table1[num];</p><p>  else if(flag==1)</p><p>  b=b*10+table1[num]; </p><

71、;p><b>  }</b></p><p>  else if(num==7)</p><p><b>  {</b></p><p><b>  flag=1;</b></p><p>  fuhao=2; </p><p><b&g

72、t;  }</b></p><p>  i=table1[num]; //顯示按下的鍵</p><p>  write_dat(0x30+i); </p><p><b>  }</b></p><p><b>  P2=0xfb;</b></p><p

73、><b>  temp=P2;</b></p><p>  temp=temp&0xf0;</p><p>  while(temp!=0xf0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p>

74、<p><b>  temp=P2;</b></p><p>  temp=temp&0xf0;</p><p>  while(temp!=0xf0)</p><p><b>  {</b></p><p><b>  temp=P2;</b></p

75、><p>  switch(temp) //</p><p><b>  {</b></p><p>  case 0xeb:num=8;</p><p><b>  break; </b></p><p>  case 0xdb:num=9; </p>

76、<p><b>  break;</b></p><p>  case 0xbb:num=10;</p><p><b>  break; </b></p><p>  case 0x7b:num=11;</p><p>  break; </p>&

77、lt;p><b>  } </b></p><p>  while(temp!=0xf0)</p><p>  { temp=P2;</p><p>  temp=temp&0xf0;</p><p><b>  }</b></p><p><b>

78、;  }</b></p><p>  if(num==8||num==9||num==10) //判斷是否按下'7','8','9'</p><p><b>  {</b></p><p><b>  if(k==1)</b></p><p&

79、gt;<b>  {</b></p><p><b>  k=0;</b></p><p>  write_com(0x01);</p><p><b>  }</b></p><p>  if(flag==0)</p><p>  a=a*10+tab

80、le1[num];</p><p>  else if(flag==1)</p><p>  b=b*10+table1[num];</p><p><b>  }</b></p><p>  else if(num==11) //判斷是否按下'*'</p><p>&l

81、t;b>  {</b></p><p><b>  flag=1;</b></p><p><b>  fuhao=3;</b></p><p><b>  }</b></p><p>  i=table1[num];</p><p>

82、  write_dat(0x30+i);</p><p><b>  }</b></p><p><b>  P2=0xf7;</b></p><p><b>  temp=P2;</b></p><p>  temp=temp&0xf0;</p><

83、;p>  while(temp!=0xf0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p><b>  temp=P2;</b></p><p>  temp=temp&0xf0;</p>

84、;<p>  while(temp!=0xf0)</p><p><b>  {</b></p><p><b>  temp=P2;</b></p><p>  switch(temp)</p><p><b>  {</b></p><p&

85、gt;  case 0xe7:num=12; // 0鍵</p><p><b>  break; </b></p><p>  case 0xd7:num=13; // '='</p><p><b>  break;</b></p><p>  case 0xb

86、7:num=14; //清零鍵</p><p><b>  break; </b></p><p>  case 0x77:num=15; //'/'</p><p>  break; </p><p><b>  } </b></p>

87、<p>  while(temp!=0xf0)</p><p>  { temp=P2;</p><p>  temp=temp&0xf0;</p><p><b>  } </b></p><p><b>  }</b></p><p>  swit

88、ch(num)</p><p><b>  {</b></p><p><b>  case 12: </b></p><p><b>  {</b></p><p><b>  if(k==1)</b></p><p><b

89、>  {</b></p><p><b>  k=0;</b></p><p>  write_com(0x01);</p><p><b>  }</b></p><p>  if(flag==0)</p><p><b>  a=a*10;&l

90、t;/b></p><p>  else if(flag==1) </p><p><b>  b=b*10;</b></p><p>  write_dat(0x30);</p><p><b>  }</b></p><p><b>  break;<

91、;/b></p><p>  case 13: //按=鍵</p><p><b>  {</b></p><p><b>  k=1;</b></p><p>  if(fuhao==1) //如果符號鍵是+,執(zhí)行+運算</p><p><

92、;b>  {</b></p><p>  write_com(0x80+0x4f);</p><p>  write_com(0x04);</p><p><b>  c=a+b;</b></p><p>  while(c!=0) </p><p><b> 

93、 {</b></p><p>  write_dat(0x30+c%10);</p><p><b>  c=c/10; </b></p><p><b>  }</b></p><p>  write_dat(0x3d);</p><p><b>  

94、fuhao=0;</b></p><p>  a=0;b=0;flag=0;</p><p><b>  }</b></p><p>  if(fuhao==2)//如果符號鍵是-,執(zhí)行-運算</p><p><b>  {</b></p><p>  wri

95、te_com(0x80+0x4f);</p><p>  write_com(0x04);</p><p><b>  if(a>=b)</b></p><p><b>  { </b></p><p><b>  c=a-b;</b></p><p&

96、gt;  while(c!=0)</p><p><b>  {</b></p><p>  write_dat(0x30+c%10);</p><p><b>  c=c/10;</b></p><p>  } </p><p><b>

97、  }</b></p><p>  else if(a<b)</p><p><b>  {</b></p><p><b>  c=b-a;</b></p><p>  while(c!=0)</p><p><b>  {</b>&

98、lt;/p><p>  write_dat(0x30+c%10);</p><p><b>  c=c/10;</b></p><p><b>  }</b></p><p>  write_dat(0x2d);</p><p><b>  }</b><

99、;/p><p>  write_dat(0x3d);</p><p>  a=0;b=0;flag=0;fuhao=0;</p><p><b>  }</b></p><p>  if(fuhao==3) //如果符號鍵是*</p><p><b>  {</b></

100、p><p>  write_com(0x80+0x4f);</p><p>  write_com(0x04);</p><p><b>  c=a*b;</b></p><p>  while(c!=0)</p><p><b>  {</b></p><p

101、>  write_dat(0x30+c%10);</p><p><b>  c=c/10;</b></p><p><b>  }</b></p><p>  write_dat(0x3d); </p><p>  a=0;b=0;flag=0;fuhao=0;</p

102、><p><b>  }</b></p><p>  if(fuhao==4) //如果符號鍵是/</p><p><b>  { </b></p><p><b>  i=0;</b></p><p>  write_com(0x80+0x4f

103、);</p><p>  write_com(0x04);</p><p>  c=(long)(((float)a/b)*1000000); //結(jié)果保留6位小數(shù)</p><p>  while(c!=0)</p><p><b>  {</b></p><p>  write_dat(0x3

104、0+c%10);</p><p><b>  c=c/10;</b></p><p><b>  i++;</b></p><p>  if(i==6) // 顯示完六位小數(shù)后,顯示·</p><p>  write_dat(0x2e); </p>

105、<p><b>  }</b></p><p>  if(a/b<=0)</p><p>  write_dat(0x30);</p><p>  write_dat(0x3d);</p><p>  a=0;b=0;flag=0;fuhao=0;</p><p><b>

106、;  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 14:</b></p><p>  { write_com(0x01);</p><p>  a

107、=0;b=0;flag=0;fuhao=0;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 15:</b></p><p><b>  {</b></p>&l

108、t;p><b>  flag=1;</b></p><p><b>  fuhao=4;</b></p><p>  write_dat(0x30+table1[num]);</p><p><b>  }</b></p><p><b>  break;<

109、;/b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*******led1602*******/</p><p>  void write_com(

110、uchar com)</p><p><b>  {</b></p><p>  rs=0;//選擇寫指令</p><p><b>  rw=0;</b></p><p><b>  P3=com;</b></p><p><b>  e=1;

111、</b></p><p>  delay(5);//無延時不能正常工作</p><p><b>  e=0;</b></p><p><b>  }</b></p><p>  void write_dat(uchar dat)</p><p><b>

112、  {</b></p><p>  rs=1;//選擇寫數(shù)據(jù)</p><p><b>  rw=0;</b></p><p><b>  P3=dat;</b></p><p><b>  e=1;</b></p><p>  delay(5

113、);//無延時不能正常工作</p><p><b>  e=0;</b></p><p><b>  }</b></p><p>  void init() //初始化</p><p><b>  {</b></p><p>  delay(15);&

114、lt;/p><p>  write_com(0x38);</p><p><b>  delay(6);</b></p><p>  write_com(0x38);</p><p><b>  delay(6);</b></p><p>  write_com(0x38);&l

115、t;/p><p>  write_com(0x38);</p><p>  write_com(0x0c); //開顯示,關(guān)光標(biāo)</p><p>  write_com(0x06);//光標(biāo)移動 設(shè)置</p><p>  write_com(0x01);//清屏</p><p><b>  }</b>

116、</p><p>  void main()</p><p><b>  { </b></p><p><b>  init();</b></p><p><b>  while(1)</b></p><p><b>  {</b&g

117、t;</p><p>  keyscan();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  電路圖</b></p><p><b>  3. 原器件清單</b><

溫馨提示

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

評論

0/150

提交評論