目 錄
摘 要……………………………………………………………………………2
引 言……………………………………………………………………………3
- 系統(tǒng)整體概述 ………………………………………………………4
- 硬件設(shè)計……………………………………………………………6
- 軟件設(shè)計 ……………………………………………………………9
- 調(diào)試與分析…………………………………………………………13
- 制作感受 …………………………………………………………14
附錄……………………………………………………………………………15
摘 要近年來隨著科技的飛速發(fā)展,單片機的應(yīng)用正在不斷深入,同時帶動傳統(tǒng)控制檢測技術(shù)日益更新。在實時檢測和自動控制的單片機應(yīng)用系統(tǒng)中,單片機往往作為一個核心部件來使用,但僅單片機方面的知識是不夠的,還應(yīng)根據(jù)具體硬件結(jié)構(gòu)、軟硬件結(jié)合,來加以完善。
計算器在人們的日常生活中是比較常見的電子產(chǎn)品之一。可是它還在發(fā)展之中,以后必將出現(xiàn)功能更加強大的計算機,基于這樣的理念,本次設(shè)計是用AT89C51單片機、LCD液晶顯示器、控制按鍵等為元件來設(shè)計的計算器。利用此設(shè)計熟悉單片機微控制器及C語言編程,對其片資源及各個I/O端口的功能和基本用途的了解。掌握Microsoft Visual C++ 6.0及Keil軟件應(yīng)用程序開發(fā)環(huán)境,常用的LCD顯示器的使用方法和一般鍵盤的使用方法。
引言
當(dāng)今社會,隨著人們物質(zhì)生活的不斷提高,電子產(chǎn)品已經(jīng)走進了家家戶戶,無論是生活或?qū)W習(xí),還是娛樂和消遣幾乎樣樣都離不開電子產(chǎn)品,大型復(fù)雜的計算能力是人腦所不能勝任的,而且比較容易出錯。計算器作為一種快速通用的計算工具方便了用戶的使用。計算器可謂是我們最親密的電子伙伴之一。計算器一般由運算器、控制器、存儲器、鍵盤、顯示器、電源和一些可選外圍設(shè)備及電子配件通過人工或機器設(shè)備組成。鍵盤是計算器的輸入部件,一般采用接觸式或傳感式。為減小計算器的尺寸,一鍵常常有多種功能。顯示器是計算器的輸出部件,有發(fā)光二極管顯示器和液晶顯示器等。除顯示計算結(jié)果外,還常有溢出指示、錯誤指示等。
人們利用計算器代替了許多復(fù)雜計算,包括加減乘除和其他運算。尤其是小型計算器,它攜帶方便,在生活中用起來方便快捷,成為了財政、學(xué)習(xí)、生意上都青睞的必需品。它的需求廣泛,在計算器的發(fā)展上存在很大的空間和市場意義。單片機在我國的各行各業(yè)得到了廣泛使用,單片機的出現(xiàn)是計算機制造技術(shù)高速發(fā)展的產(chǎn)物,它是嵌入式控制系統(tǒng)的核心。如今,它已經(jīng)廣泛應(yīng)用到我們生活中的各個領(lǐng)域,用單片機可以很方便的實現(xiàn)計算器的設(shè)計。
眾所周知單片機是一種集成在電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計時器等功能集成到一塊硅片上構(gòu)成的一個小而完善的計算機系統(tǒng)。單片機由于其微小的體積和極低的成本,廣泛的應(yīng)用于家用電器、工業(yè)控制等領(lǐng)域中。在工業(yè)生產(chǎn)中。單片微型計算機是微型計算機的一個重要分支,也是頗具生命力的機種。單片微型計算機簡稱單片機,特別適用于控制領(lǐng)域,故又稱為微控制器。
第一章 系統(tǒng)整體概述
1.1 設(shè)計目的應(yīng)用《單片機應(yīng)用基礎(chǔ)》、《計算機應(yīng)用基礎(chǔ)》等所學(xué)相關(guān)知識及查閱資料,完成簡易計算器的設(shè)計,以達到理論與實踐更好的結(jié)合、進一步提高綜合運用所學(xué)知識和設(shè)計的能力的目的。
通過本次設(shè)計的訓(xùn)練,可以使我在基本思路和基本方法上對基于MCS-51單片機的嵌入式系統(tǒng)設(shè)計有一個比較感性的認(rèn)識,并具備一定程度的設(shè)計能力。
主要完成如下方面的設(shè)計任務(wù):
1、簡要闡述單片機技術(shù)發(fā)展的國內(nèi)外現(xiàn)狀及LED動態(tài)顯示和矩陣鍵盤基本原理;
2、掌握MCS-51系列某種產(chǎn)品(例如8051)的最小電路及外圍擴展電路的設(shè)計方法;
3、了解單片機數(shù)據(jù)轉(zhuǎn)換功能及工作過程;
4、完成主要功能模塊的硬件電路設(shè)計及必要的參數(shù)確定.
1.2 計算器設(shè)計總體思想根據(jù)功能和指示要求,本系統(tǒng)選用以51單片機為主控機。通過擴展必要的外圍接口電路,實現(xiàn)對計算器的設(shè)計。
具體設(shè)計如下:
1、由于要設(shè)計的是簡單的計算器,可以進行四則運算,為了得到教好的顯示效果,采用LCD顯示數(shù)據(jù)和結(jié)果。
2、另外鍵盤包括數(shù)字鍵(0-9)、符號鍵(+、-、*、/)、清除鍵和等號鍵,故只需要16個按鍵即可,設(shè)計中采用集成的計算機鍵盤。
3、執(zhí)行程序:開機顯示零,等待鍵入數(shù)值,當(dāng)鍵入數(shù)字,通過LCD顯示出來,當(dāng)鍵入+、-、*、/運算符,計算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲,并等待再次鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號就會在LCD上輸出運算結(jié)果。
4、錯誤提示:當(dāng)單片機執(zhí)行程序中有錯誤時,會在LCD上顯示相應(yīng)的提示,如:當(dāng)輸入的數(shù)值或計算器得到的結(jié)果大于計算器的顯示范圍時,計算器會在LCD上提示溢出;當(dāng)除數(shù)為0時,計算器會在LCD上提示錯誤。
1.3系統(tǒng)的組成
計算器設(shè)計硬件電路采用三部分電路模塊構(gòu)成,第一部分是鍵盤模塊電路,采用4*4矩陣式鍵盤作為輸入電路;第二部分是LCD1602液晶顯示模塊;第三部分是以51單片機作為控制核心。軟件程序主要由三部分組成:主程序、按鍵掃描程序和LCD1602顯示程序。
1.001.jpg (659 Bytes, 下載次數(shù): 97)
下載附件
2017-5-14 03:26 上傳
圖片在51hei附件中
圖 系統(tǒng)組成及總體框圖
本系統(tǒng)就是充分利用了8051芯片的I/O引腳。系統(tǒng)以采用MCS-51系列單片機Intel8051為中心器件來設(shè)計計算器控制器,實現(xiàn)了能根據(jù)實際輸入值顯示并存儲的功能,計算程序則是參照教材。
本計算器是以MCS-51系列8051單片機為核心構(gòu)成的簡易計算器系統(tǒng)。該系統(tǒng)通過單片機控制,實現(xiàn)對4*4鍵盤掃描進行實時的按鍵檢測,并把檢測數(shù)據(jù)存儲下來。整個計算器系統(tǒng)的工作過程為:首先存儲單元初始化,顯示初始值和鍵盤掃描,判斷按鍵位置,查表得出按鍵值,單片機則對數(shù)據(jù)進行儲存與相應(yīng)處理轉(zhuǎn)換,之后送入LED顯示器動態(tài)顯示。整個系統(tǒng)可分為三個主要功能模塊:功能模塊一,實時鍵盤掃描;功能模塊二,數(shù)據(jù)轉(zhuǎn)換成顯示器顯示;功能模塊三,顯示器動態(tài)顯示。
第二章 硬件系統(tǒng)設(shè)計硬件系統(tǒng)是指構(gòu)成微機系統(tǒng)的實體和裝置,通常由運算器、控制器、存儲器、輸入接口電路和輸入設(shè)備、輸出接口電路和輸出設(shè)備等組成。單片機實質(zhì)上是一個硬件的芯片,在實際應(yīng)用中,通常很難直接和被控對象進行電氣連接,必須外加各種擴展接口電路、外部設(shè)備、被控對象等硬件和軟件,才能構(gòu)成一個單片機應(yīng)用系統(tǒng)。本設(shè)計選用以AT89S51單片機為主控單元。顯示部分:采用LCD靜態(tài)顯示。按鍵部分,采用4*4鍵盤。 硬件電路原理圖如圖2.1所示:
1.009.jpg (34.38 KB, 下載次數(shù): 142)
下載附件
2017-5-14 03:26 上傳
圖2.1 硬件電路原理圖
2.1 鍵盤接口電路計算機輸入數(shù)字和其他功能按鍵時要用到很多按鍵,在這種情況下,編程會很簡單,但是會占用大量的I/O口資源,因此在很多情況下都不采用這樣的方式,而是采用矩陣鍵盤的方式。矩陣鍵盤采用四條I/O線作為行線,四條I/O線作為列線組成鍵盤,在行線和列線的每個交叉點上設(shè)置一個按鍵。這樣鍵盤上按鍵的數(shù)量就為4*4個。這樣行列式鍵盤結(jié)構(gòu)能有效的提高單片機系統(tǒng)中I/O口的利用率。
計算器的鍵盤布局如圖2.2所示:一般有16個鍵組成,在單片機中正好有一個P端口實現(xiàn)16個按鍵功能,這種形式在單片機系統(tǒng)中最常用。
1.010.jpg (20.95 KB, 下載次數(shù): 108)
下載附件
2017-5-14 03:26 上傳
圖2.2 矩陣鍵盤內(nèi)部電路
2.2 LCD顯示模塊本設(shè)計采用LCD液晶顯示器來顯示輸出數(shù)據(jù)。LCD的特性有:1、+5V電壓,對比可調(diào)度;2、內(nèi)含復(fù)位電路;3、提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能;4、有80字節(jié)顯示數(shù)據(jù)存儲器DDRAM;5、內(nèi)建有160個5X7點陣的字型的字符發(fā)生器CGROM;6、8個可由用戶自定義的5X7的字符發(fā)生器CGRAM。
本設(shè)計通過D0-D7引腳向LCD寫指令字或?qū)憯?shù)據(jù)以使LCD實現(xiàn)不同的功能或顯示相應(yīng)的數(shù)據(jù)。其接口電路如圖2.3所示。
1.011.jpg (9.73 KB, 下載次數(shù): 97)
下載附件
2017-5-14 03:26 上傳
圖2.3 LCD接口電路
LCD的引腳說明如表2.1所示:
表2.1 LCD的引腳說明
2.3 運算模塊MCS-51單片機是在一塊芯片中集成了CPU、RAM、ROM、定時器/計數(shù)器和多功能I/O等計算機所需要的基本功能部件。如果按功能劃分,它由以下功能部件組成,即微處理器(CPU),數(shù)據(jù)存儲器(RAM),程序存儲器(ROM/EPROM),并行I/O口,串行口,定時器/計數(shù)器,中斷系統(tǒng)及特殊功能寄存器(SFR)。單片機是靠程序運行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的一些功能,通過使用單片機編寫的程序可以實現(xiàn)高智能、高效率以及高可靠性,因此采用單片機作為計算器的主要功能部件,可以很快的實現(xiàn)運算功能。
運算模塊由鍵盤和顯示屏組成。單片機通過按鍵來實現(xiàn)輸入數(shù)據(jù)和操作方式的控制,在運算過程中,對所設(shè)的數(shù)據(jù)進行四則運算時,要先確定選用的是哪一個運算符,若是+或*,則要判斷結(jié)果是否會溢出,溢出則顯示錯誤提示,沒有溢出則顯示運算結(jié)果,若是/,則要判斷除數(shù)是否為零,為零時顯示錯誤提示,不為零顯示運算結(jié)果。
第三章 軟件設(shè)計
3.1 語言的特點及選擇本設(shè)計是硬件電路和軟件編程相結(jié)合的設(shè)計方案,選擇合適的編程語言是一個重要的環(huán)節(jié)。在單片機的應(yīng)用系統(tǒng)程序設(shè)計時,常用的是匯編語言和C語言。機硬件,程序可讀性和可移植性比較差。而C語言雖然執(zhí)行效率沒有匯編語言高,但語言簡潔,使用方便,靈活,運算豐富,表達化類型多樣化,數(shù)據(jù)結(jié)構(gòu)類型豐富,具有結(jié)構(gòu)化的控制語句,程序設(shè)計自由度大,有很好的可重用性,可移植性等特點。
由于現(xiàn)在單片機的發(fā)展已經(jīng)達到了很高的水平,內(nèi)部的各種資源相當(dāng)?shù)呢S富,CPU的處理速度非常的快。用C語言來控制單片機無疑是一個理想的選擇。所以在本設(shè)計中采用C語言編寫軟件程序。主程序的設(shè)計詳見附錄三。
3.2 鍵掃程序設(shè)計鍵掃程序的過程為:開始時,先判斷是否有鍵閉合,無鍵閉合時,返回繼續(xù)判斷,有鍵閉合時,先去抖動,然后確定是否有鍵按下,若無鍵按下,則返回繼續(xù)判斷是否有鍵閉合,若有鍵按下,則判斷鍵號,然后釋放,若釋放按鍵完畢,則返回,若沒有釋放按鍵,則返回繼續(xù)釋放。其流程圖如圖3.1所示。
1.012.jpg (25.48 KB, 下載次數(shù): 113)
下載附件
2017-5-14 03:26 上傳
圖3.1 鍵掃程序流程圖
3.3 算術(shù)運算程序設(shè)計算術(shù)運算程序的過程為:先判斷輸入的運算符是+、-、*、/ 中的哪一個,若是+或-,則要判斷運算結(jié)果是否溢出,溢出則顯示錯誤信息,沒溢出就顯示運算結(jié)果,若是/,則要先判斷除數(shù)是否為零,為零就顯示錯誤信息,不為零則顯示運算結(jié)果,若是-,則直接顯示運算結(jié)果。其流程圖如圖3.2所示。
1.013.jpg (29.9 KB, 下載次數(shù): 108)
下載附件
2017-5-14 03:26 上傳
圖3.2 算術(shù)運算程序設(shè)計流程圖
3.4 顯示程序設(shè)計顯示程序的過程為:顯示開始時,先進行LCD的初始化,判斷是否顯示漢字或ACSII碼或圖形,若不顯示,則返回,若顯示的是漢字或ACSII碼,則進行相應(yīng)功能的設(shè)置,然后送地址和數(shù)據(jù),再判斷是否顯示完,顯示完則返回,沒有顯示完則繼續(xù)送地址,若顯示的是圖形,則先進行相應(yīng)功能的設(shè)置,再送行地址和列地址,然后送數(shù)據(jù),最后判斷是否顯示完,顯示完則返回,沒有顯示完則繼續(xù)送行地址和列地址。其流程圖如圖3.3所示。
1.014.jpg (39.54 KB, 下載次數(shù): 113)
下載附件
2017-5-14 03:26 上傳
圖3.3 顯示程序流程圖
第四章 調(diào)試與分析
4.1 硬件調(diào)試常見故障:
1、邏輯錯誤:它是由設(shè)計錯誤或加工過程中的工藝性錯誤所造成的。這類錯誤包括錯線、開路、短路等。
2、元器件失效:有兩方面的原因:一是器件本身已損壞或性能不符合要求;二是組裝錯誤造成元件失效,如電解電容、集成電路安裝方向錯誤等。
3、可靠性差:因其可靠性差的原因很多,如金屬化孔、接插件接觸不良會造成系統(tǒng)時好時壞,經(jīng)不起振動;走線和布局不合理也會引起系統(tǒng)可靠性差。
4、電源故障:若樣機由電源故障,則加電后很容易造成器件損壞。電源故障包括電壓值不符合設(shè)計要求,電源引線和插座不對,功率不足,負(fù)載能力差等。
調(diào)試方法:包括多級調(diào)試和聯(lián)機調(diào)試。在調(diào)試過程中要針對可能出現(xiàn)的故障認(rèn)真分析,直至檢查出原因并排除。
本次硬件調(diào)試過程中,對所出現(xiàn)的問題進行了認(rèn)真的分析和改正,最后能夠很好的達到設(shè)計要求的效果。
4.2 軟件調(diào)試軟件調(diào)試分為以下四個階段:1、 編寫程序并查錯;2、在C語言的編譯系統(tǒng)中編譯源程序3、對程序進行編譯連接,并及時發(fā)現(xiàn)程序中存在的錯誤;4、改正錯誤。
在本次調(diào)試中出現(xiàn)的問題有:
1、在程序中有的函數(shù)名未定義;
2、在抄錄程序時,少錄入一些字符,如:“;”、“{”、“-”等符號,而出現(xiàn)錯誤;
3、有一些函數(shù)名錄入時少寫一個字母或順序顛倒;
4、沒有注意函數(shù)名的調(diào)用及定義;
5、芯片引腳定義出錯而導(dǎo)致沒有實驗現(xiàn)象。
在軟件調(diào)試過程中,對出現(xiàn)的錯誤進行了認(rèn)真的分析和修改,多次調(diào)試成功后,能夠很好的達到既定的設(shè)計效果。
第五章 制作感受通過這個作品的設(shè)計,收獲頗多,當(dāng)我開始準(zhǔn)備做單片機作品設(shè)計的時候,設(shè)計什么都是我十分困惑的,無意中室友找我借計算器去考試,靈感就來了,沒錯就設(shè)計計算器了,于是便搜集各種關(guān)于計算器的相關(guān)資料。開始感覺設(shè)計出來應(yīng)該會很難,不過,經(jīng)過不斷地努力之后,了解計算器的工作原理,設(shè)計計算器的電路原理圖和實物圖,然后便到網(wǎng)上買需要的電子元器件了,經(jīng)過一些時日各種東西都已準(zhǔn)備齊全,說干就干,按照原理圖一步步進行焊接。做起來越來越來勁,感覺很有趣的樣子,都說興趣是最好的老師,果然沒錯。
當(dāng)我剛剛做完這個作品第一次進行功能運行的時候,沒有成功,當(dāng)時心里有些無奈,經(jīng)過幾天的布線焊接最終卻沒成功,有點點小失落。當(dāng)然不是每個人都能一次就能做成的,便進行各種檢查調(diào)試,經(jīng)過幾番周折最后勉強能實現(xiàn)功能了,但是還有些不盡人意,不過當(dāng)時已有一種成功的喜悅感了。再經(jīng)過不斷地進行修改完善,終于達到了我想要的效果,這時的我感覺自己棒棒噠,自己也能做出計算器了。這個過程中除了學(xué)到知識以外,還感受到了堅持努力最終就會取得自己想要的成績。
附錄
附錄一:計算器proteus仿真圖
1.015.jpg (64.63 KB, 下載次數(shù): 144)
下載附件
2017-5-14 03:26 上傳
附錄二:元器件清單
1 | 10uf | 直插電解電容 | 1 |
2 | 30P | 直插瓷片電容 | 2 |
3 | 10K | 9腳排阻 | 1 |
4 | LCD1602 | LCD1602液晶顯示器 | 1 |
5 | POWER | DC電源插座 | 1 |
6 | 2.2k | 色環(huán)電阻 | 1 |
7 | 10K | 2 |
8 | SW-PB | 按鍵6X6X5MM | 17 |
9 | SWITCH | 自鎖開關(guān) | 1 |
10 | STC89C51/52 | 51單片機 | 1 |
11 | 12MHZ | 晶振 | 1 |
12 | 導(dǎo)線 | XXcm | 1 |
13 | 焊錫 | XXcm | 1 |
14 | USB轉(zhuǎn)DC3.5mm電源線 | 系統(tǒng)供電 | 1 |
15 | 9*15萬用板 |
| 1 |
16 | 單片機插座 | 40腳IC座 | 1 |
17 | DC電源頭 | DC插頭 3.5-1.35MM | 1 |
18 | LCD1602插座 | 16P排母 | 1 |
19 | LCD1602引出腳 | 16P排針 | 1 |
附錄三:源程序
- /*
- 接盤按鍵說明:
- --------------------------------------------------
- | 1 | 2 | 3 | + |
- - - - - - - - - - - - - -
- | 4 | 5 | 6 | - |
- - - - - - - - - - - - - -
- | 7 | 8 | 9 | * |
- - - - - - - - - - - - - -
- | C | 0 | = | / |
- --------------------------------------------------*/
- //操作簡介
- // 按第一個數(shù),再按'+-*/',再按'='顯示出結(jié)果,然后按C清屏
- // 加最大9999+9999=19998
- // 減最大9999-0 =9999
- // 乘最大9999*9999=99980001
- // 除 1/9=0.1111 保留小數(shù)點后4位
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- //--------LCD1602-------------------
- //P00-07==== D0-7
- sbit rs=P2^5; //指令or數(shù)據(jù)
- sbit wela=P2^6; //讀or寫
- sbit lcden=P2^7; //使能信號
- //--------LCD1602-------------------
- //--------KEY-----------------------
- //P1口
- //--------KEY-----------------------
- uchar code table[]= " ";
-
- long int data_a,data_b; //第一個數(shù)和第二個數(shù)
- long int data_c; //計算結(jié)果
-
- uchar dispaly[10]; //顯示緩沖
-
- //************************************************************************/
- // 描述: 延時t us函數(shù)
- //************************************************************************/
- void LCD_Delay_us(unsigned int t)
- {
- while(t--); //t=0,退出
- }
- //************************************************************************/
- // 描述: 延時t ms函數(shù)
- //************************************************************************/
- void LCD_Delay_ms(unsigned int t)
- {
- unsigned int i,j;
- for(i=0;i<t;i++) //執(zhí)行t次循環(huán)
- for(j=0;j<113;j++) //執(zhí)行113次循環(huán)
- ;
- }
- //************************************************************************/
- // 描述: 1602液晶寫指令
- //************************************************************************/
- void write_com(uchar com) //1602液晶寫指令
- {
- rs=0; //寫指令
- lcden=0; //使能1602
- P0=com; //寫入指令com
- LCD_Delay_ms(1); //延時1ms
- lcden=1; //使能1602
- LCD_Delay_ms(2); //延時2ms
- lcden=0; //使能1602
- }
- //************************************************************************/
- // 描述:1602液晶寫數(shù)據(jù)
- //************************************************************************/
- void write_date(uchar date) //1602液晶寫數(shù)據(jù)
- {
- rs=1; //寫數(shù)據(jù)
- lcden=0; //使能1602
- P0=date; //寫入數(shù)據(jù)date
- LCD_Delay_ms(1); //延時1ms
- lcden=1; //使能1602
- LCD_Delay_ms(2); //延時2ms
- lcden=0; //使能1602
- }
- //************************************************************************/
- // 描述:指定x,y寫入字符函數(shù)
- //************************************************************************/
- void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0){write_com(0x80 + x);} //第一行
- else{write_com(0xc0 + x);} //第二行
- write_date( Data); //寫入數(shù)據(jù)
- }
- //指定x,y寫入字符串函數(shù)
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0){write_com(0x80 + x);} //第一行
- else{write_com(0xC0 + x);} //第二行
- while (*s) //
- {write_date( *s); s++;} //寫入數(shù)據(jù)
- }
- //************************************************************************/
- // 描述:初始化液晶,及畫面初始化
- //************************************************************************/
- void init_lcd(void) //初始化液晶,及畫面初始化
- {
- wela=0; //寫液晶
- lcden=0; //使能1602
- write_com(0x38); //8 位總線,雙行顯示,5X7 的點陣字符
- LCD_Delay_us(100); //延時100us
- write_com(0x0c); //開顯示,無光標(biāo),光標(biāo)不閃爍
- write_com(0x06); //光標(biāo)右移動
- write_com(0x01); //清屏
- write_com(0x80); //DDRAM 地址歸0
- }
- //************************************************************************/
- // 描述: 反轉(zhuǎn)法鍵盤掃描
- //************************************************************************/
- short keycheckdown() /* 反轉(zhuǎn)法鍵盤掃描 */
- {
-
- short temp1,temp2,temp,a=0xff;
- P1=0xf0; /* 輸入行值(或列值) */
- LCD_Delay_ms(20); /* 延時 */
- temp1=P1; /* 讀列值(或行值) */
- P1=0xff;
- LCD_Delay_ms(20); /* 延時 */
- P1=0x0f; /* 輸入列值(或行值) */
- LCD_Delay_ms(20); /* 延時 */
- temp2=P1; /* 讀行值(或列值) */
- P1=0xff;
- temp=(temp1&0xf0)|(temp2&0xf); /* 將兩次讀入數(shù)據(jù)組合 */
- switch(temp) /* 通過讀入數(shù)據(jù)組合判斷按鍵位置 */
- {
-
-
- case 0x77 :a=0x0d;break;// 按鍵/
- case 0x7b :a=0x0e; break;// 按鍵=
- case 0x7d :a=0; break;// 按鍵0
- case 0x7e :a=0x0f; break;// 按鍵CE
-
- case 0xb7 :a=0x0c;break;// 按鍵*
- case 0xbb :a=0x9;break; // 按鍵9
- case 0xbd :a=0x8;break; // 按鍵8
- case 0xbe :a=0x7;break; // 按鍵7
-
- case 0xd7 :a=0x0b;break;// 按鍵-
- case 0xdb :a=0x6;break; // 按鍵6
- case 0xdd :a=0x5;break; // 按鍵5
- case 0xde :a=0x4;break; // 按鍵4
-
- case 0xe7 :a=0x0a; break;// 按鍵+
- case 0xeb :a=3;break; // 按鍵3
- case 0xed :a=2;break; // 按鍵2
- case 0xee :a=1;break; // 按鍵1
-
- default :a=0xff;
- }
- return a; /* 返回按鍵值 */
- }
- void display_a() //顯示數(shù)據(jù)a
- {
- dispaly[3]=data_a%10000/1000; //千
- dispaly[2]=data_a%1000/100; //百
- dispaly[1]=data_a%100/10; //十
- dispaly[0]=data_a%10; //個
-
- write_com(0x80+0); //顯示數(shù)據(jù)a
- if(data_a>999){ write_date('0'+dispaly[3]);} //顯示千位
- if(data_a>99){ write_date('0'+dispaly[2]);} //顯示百位
- if(data_a>9){ write_date('0'+dispaly[1]);} //顯示十位
- write_date('0'+dispaly[0]); //顯示個位
- }
-
- void display_b() //顯示數(shù)據(jù)b
- {
- write_com(0x80+7); //第一行
- dispaly[3]=data_b%10000/1000; //千
- dispaly[2]=data_b%1000/100; //百
- dispaly[1]=data_b%100/10; //十
- dispaly[0]=data_b%10; //個
-
- if(data_b>999){ write_date('0'+dispaly[3]); } //顯示千位
- if(data_b>99) { write_date('0'+dispaly[2]); } //顯示百位
- if(data_b>9) { write_date('0'+dispaly[1]); } //顯示十位
- write_date('0'+dispaly[0]); //顯示個位
- }
-
- //計算結(jié)果
- void display_c(x)
- {
-
- if(data_c<100000000&&data_c>-1)//溢出時顯示錯誤
- {
-
- dispaly[8]=data_c%1000000000/100000000; //萬萬
- dispaly[7]=data_c%100000000/10000000; //千萬
- dispaly[6]=data_c%10000000/1000000; //百萬
- dispaly[5]=data_c%1000000/100000; //十萬
- dispaly[4]=data_c%100000/10000; //萬
- dispaly[3]=data_c%10000/1000; //千
- dispaly[2]=data_c%1000/100; //百
- dispaly[1]=data_c%100/10; //十
- dispaly[0]=data_c%10; //個
- write_com(0x80+6+0x40); //第一行
- if(x==4)
- {
- if(data_c>99999999) { write_date('0'+dispaly[8]);} //顯示萬萬
- if(data_c>9999999) { write_date('0'+dispaly[7]);} //千萬
- if(data_c>999999) { write_date('0'+dispaly[6]);} //百萬
- if(data_c>99999) { write_date('0'+dispaly[5]);} //十萬
- write_date('0'+dispaly[4]); //萬
- write_date('.');
- write_date('0'+dispaly[3]); //千
- write_date('0'+dispaly[2]); //百
- write_date('0'+dispaly[1]); //十
- write_date('0'+dispaly[0]); //個
- }
- else{
- if(data_c>99999999) { write_date('0'+dispaly[8]);} //顯示萬萬
- if(data_c>9999999) { write_date('0'+dispaly[7]);} //千萬
- if(data_c>999999) { write_date('0'+dispaly[6]);} //百萬
- if(data_c>99999) { write_date('0'+dispaly[5]);} //十萬
- if(data_c>9999) { write_date('0'+dispaly[4]);} //萬
- if(data_c>999) { write_date('0'+dispaly[3]);} //千
- if(data_c>99) { write_date('0'+dispaly[2]);} //百
- if(data_c>9) { write_date('0'+dispaly[1]);} //十
- write_date('0'+dispaly[0]); //個
- }
- }
- else //溢出時顯示錯誤
- {
- write_com(0x80+11+0x40); //第一行
- write_date('E'); //顯示 E
- write_date('r'); //顯示R
- write_date('r'); //顯示R
- write_date('o'); //顯示O
- write_date('r'); //顯示E
- }
- }
-
- void eql(uchar x)//加減乘除運算
- {
- switch(x) /*功能鍵選擇*/
- {
- case 1:data_c=data_a+data_b;break; //加 /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */
- case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///減
- else{data_c=data_b-data_a;W_lcd(5,1,'-');} //負(fù)數(shù)符號
- break;
- case 3:data_c=(data_a*data_b);break; /* * S=3 *///乘
- case 4:if(data_b==0){LCD_Write_String(0,1,"Error !");}else{data_c=(data_a*10000)/data_b;}break; /* / S=4 *///除//溢出時顯示錯誤
- case 0:break;
- }
-
- }
-
- void main()
- {
- uchar key=0xff; //鍵值初始化
- uchar n=0; //第1個數(shù)可以按1-4次
- uchar m=5; //第2個數(shù)可以按1-4次
- uchar x=0;
- data_a=0; //前一個數(shù)
- data_b=0; //后一個數(shù)
- data_c=0; //結(jié)果
- init_lcd(); //1602液晶初始化
- display_a();
- while(1)
- {
- key=keycheckdown(); /*動態(tài)掃描鍵盤,返回按鍵對應(yīng)值,賦給j key=0到f */
- if(0xff!=key) /*若返回值有效,進入內(nèi)部處理程序*/
- {
- if(key<10)
- {
- if(n<4){data_a=data_a*10+key;m=5;display_a();}n++; //首先輸入第一個數(shù)
- if(m<4){data_b=data_b*10+key;n=5;display_b();}m++; //必須按了+-*/才能輸入第二個數(shù)
- }
- else
- { switch(key) /*功能鍵選擇*/
- {
- case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加 /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */
- case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break; /* - S=2 *///減
- case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break; /* * S=3 *///乘
- case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break; /* / S=4 *///除
- case 0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break;
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
完整論文下載(word格式 可編輯):
單片機作品之計算器設(shè)計報告.doc
(622.26 KB, 下載次數(shù): 299)
2017-5-13 13:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5