

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課 程 設 計</b></p><p> 學 號: </p><p><b> 摘要</b></p><p> 單片機的出現(xiàn)是計算機制造技術高速發(fā)展的產物,它是嵌入式控制系統(tǒng)的核心,如今,它已廣泛的應用到我們生活的各個領域,電子、科技、通信、汽車、工業(yè)等。</p><
2、;p> 本設計是基于51系列單片機來進行的數(shù)字計算器系統(tǒng)設計,可以完成計算器的鍵盤輸入,進行加、減、乘、除六位數(shù)范圍內的基本四則運算,并在LCD上顯示相應的結果。設計電路采用AT89C51單片機為主要控制電路,利用4*4矩陣鍵盤作為計算器的輸入。顯示采用字符LCD靜態(tài)顯示。軟件方面使用C語言編程,并用PROTUES仿真,驗證了設計的合理性。</p><p> 關鍵字:計算器51單片機 矩陣鍵盤
3、 1602液晶顯示器 PROTUES仿真</p><p><b> 目錄</b></p><p><b> 摘要I</b></p><p><b> 第一章 緒論1</b></p><p> 1.1 計算器的背景1</p><p>
4、1.2 計算器設計概況1</p><p> 第二章 方案設計2</p><p> 2.1 設計任務2</p><p> 2.2 方案設計2</p><p> 第三章 硬件模塊介紹3</p><p> 3.1 運算模塊3</p><p> 3.2 單片機概況5</p
5、><p> 第四章 整體設計方案7</p><p> 4.1 復位電路7</p><p> 4.2 時鐘電路7</p><p> 4.3 輸入模塊8</p><p> 4.4 顯示模塊9</p><p> 第五章 程序設計16</p><p>
6、 5.1輸入程序流程圖設計16</p><p> 5.2 LCD顯示程序設計16</p><p> 5.3 主程序的設計17</p><p><b> 小結19</b></p><p><b> 【參考文獻】20</b></p><p><b>
7、 程序附錄:23</b></p><p><b> 第一章 緒論</b></p><p> 1.1 計算器的背景 </p><p> 隨著社會的發(fā)展,科學的進步,人們的生活水平在逐步的提高,尤其是微電子技術的發(fā)展,猶如雨后春筍般的變化。電子產品的更新速度快就不足驚奇了, 單片機的應用已經越來越貼近生活,用單片機來實現(xiàn)一些
8、電子設計也變得容易起來。 </p><p> 近年來,單片機以其體積小、價格廉、面向控制等獨特優(yōu)點,在各種工業(yè)控制、儀器儀表、設備、產品的自動化、智能化方面獲得了廣泛的應用。與此同時,單片機應用系統(tǒng)的可靠性成為人們越來越關注的重要課題。影響可靠性的因素是多方面的,如構成系統(tǒng)的元器件本身的可靠性、系統(tǒng)本身各部分之間的相互耦合因素等。其中系統(tǒng)的抗干擾性能是系統(tǒng)可靠性的重要指標。 </p><p&
9、gt; 1.2 計算器設計概況 </p><p> 本設計采用STC89C51芯片,實現(xiàn)了利用單片機進行了一個簡單計算器設計。允許對用矩陣鍵盤輸入數(shù)據(jù)進行加減乘除運算及LCD 顯示。如果設計對象是更為復雜的計算器系統(tǒng),其實際原理與方法與本設計基本相同。另外,實例所設計的計算器是用1602液晶顯示器顯示的,當然也可以用其他的器件顯示,如LED 數(shù)碼管顯示屏。在此基礎上,還可以編寫更加完善的程序來實現(xiàn)更多的計算功
10、能。設計的關鍵所在,是熟悉單片機的原理與結構,同時還要對整個設計流程有很好的把握,將單片機和其他模塊完整的銜接。</p><p><b> 第二章 方案設計</b></p><p><b> 2.1 設計任務 </b></p><p> ?。?)系統(tǒng)通過4×4的矩陣鍵盤輸入數(shù)字及運算符;</p>
11、<p> (2)系統(tǒng)通過1602液晶顯示器顯示輸入和運算結果;</p><p> (3)可以完成正負10000以內的加減乘除運算,如果超出范圍,</p><p> 則在液晶顯示器上顯示Out of range!!!!;</p><p> (4)進行除法運算時,除數(shù)為零時顯示ERROR!!!。</p><p><b&g
12、t; 2.2 方案設計 </b></p><p> 根據(jù)設計要求,本系統(tǒng)選用STC89C51單片機為主控機。 </p><p> 利用單片機STC89C51設計的計算器具體考慮如下: </p><p> ?。?)使用單片機的P0口和P2.0、P2.1、P2.2控制1602液晶顯示器 </p><p> (2)使用P1口作為
13、計算器矩陣鍵盤的接口 </p><p> (3)使用c語言編程實現(xiàn)所需要的功能 </p><p><b> 系統(tǒng)模塊圖:</b></p><p> 圖2-1 系統(tǒng)模塊圖</p><p> 根據(jù)需要我們可以采用自上而下的程序設計方法,此方法先從主程序開始設計,然后再編制各從屬程序和子程序,層層細化逐步求精,最終完成
14、一個復雜程序的設計。這種方法比較符合人們的日常思維,缺點是一級的程序錯誤會對整個程序產生影響。但是,這種方法設計程序出現(xiàn)錯誤能很方便的指導錯誤出現(xiàn)在哪個函數(shù)或者子函數(shù),檢查起來很方便。</p><p> 第三章 硬件模塊介紹</p><p><b> 3.1 運算模塊 </b></p><p> MCS-51 單片機是在一塊芯片中集成了C
15、PU、RAM、ROM、定時器/計數(shù)器和多功能I/O等一臺計算機所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲器(RAM)、程序存儲器(ROM/EPROM)、并行I/O 口、串行口、定時器/計數(shù)器、中斷系統(tǒng)及特殊功能寄存器(SFR)。單片機是靠程序運行的,并且可以修改。通過不同的程序實現(xiàn)不同的功能,尤其是特殊的獨特的一些功能,通過使用單片機編寫的程序可以實現(xiàn)高智能,高效率以及高可靠性。因此我們采
16、用單片機作為計算器的核心功能部件,可以進行很快地實現(xiàn)運算功能,如圖3-1所示:</p><p> 圖3-1 STC89C51單片機芯片</p><p> 3.2 單片機概況 </p><p> 3.2.1單片機(STC89C51)引腳功能 </p><p> 51系列單片機8031、8051及89C51/89S51均采用40Pin封裝
17、的雙列直接DIP結構。上圖是它們的引腳配置:40個引腳中,正電源和地線兩根,外置石英振蕩器的時鐘線兩根,4組8位共32個I/O口,中斷口線與P3口線復用,如圖3-1所示。</p><p> 3.2.2單片機(STC89C51)引腳功能</p><p> 3.2.2.1 電源引腳</p><p> 3.2.2.2 外接晶振引腳</p><p&
18、gt; XTAL1(19腳)是片內振蕩器的反相放大器輸入端,XTAL2(18腳)則是輸出端。如果晶振為12MHz,時鐘周期就為1/12us。我們使用的STC89C51系列單片機的時鐘范圍約在1MHz~24MHz。</p><p> 3.2.2.3 復位引腳</p><p> RST(9腳)為復位信號輸入端。通常只要保證該引腳持續(xù)2個機器周期的高電平就會使單片機復位。復位后P0-P3口
19、均置1引腳表現(xiàn)為高電平,程序計數(shù)器和特殊功能寄存器SFR全部清零。</p><p> 3.2.2.4 輸入輸出(I/O)引腳</p><p> P0口(32-39腳):當向外部存儲器讀/寫數(shù)據(jù)時,P0口和P2口配合完成低8位地址的傳送后,P0口再傳送8位數(shù)據(jù)。 </p><p> P1口(1-8腳):只具有普通I/O功能。 </p><p&
20、gt; P2口(21-28腳):當向外部存儲器讀/寫數(shù)據(jù)時,P2口用于傳送高8位地址。 </p><p> P3口(10-17腳):P3口除了完成I/O功能這一本職工作,還有許多非常重要的兼職任務,具體請看下表3-1:</p><p> 表3-1 P3口復用表</p><p> 3.2.2.5 其它的控制或復用引腳</p><p>
21、 (1) ALE/PROG(30腳) 地址鎖存信號輸出端/EPROG編程脈沖輸入端。當訪問外部存儲器時,用于將P0口的地址鎖存在外部鎖存其中。 </p><p> (2) PSEN (29腳):片外ROM選通信號。 </p><p> (3) EA/VPP(31腳):內/ 外部ROM選擇端。</p><p> 第四章 整體設計方案</p><
22、;p><b> 4.1 復位電路 </b></p><p> RST為復位信號輸入端。只要保證該引腳持續(xù)2個機器周期的高電平就會使單片機復位。 </p><p> 復位電路如下圖,10K的電阻跟10uF的電容形成一個RC電路,上電后在復位端形成一個高電平,保持時間超過2個機器周期,單片機實現(xiàn)上電復位。當手動按下按鍵式,在復位端也會超過2個周期的高電平,單片
23、機實現(xiàn)手動復位!</p><p><b> 圖4-1 復位電路</b></p><p> 4.2 時鐘電路 </p><p> 設計所用的晶振頻率是12MHz </p><p> 晶振兩端分別接上單片機的晶振接口,并上兩個電容是為了提高時鐘信號的穩(wěn)定性。常用的為30pf的瓷片電容。電路如下圖所示:</p&
24、gt;<p><b> 圖4-2 時鐘電路</b></p><p> 4.3 輸入模塊</p><p> 鍵盤是單片機常用輸入設備,在按鍵數(shù)量較多時,為了節(jié)省I/O口等單片機資源,一般采取掃描的方式來識別到底是哪一個鍵被按下。即通過確定被按下的鍵處在哪一行哪一列來確定該鍵的位置,獲取鍵值以啟動相應的功能程序。</p><p&
25、gt; 4*4矩陣鍵盤的結構如圖4-3。在本例中,矩陣鍵盤的四列依次接到單片機的P1.0~P1.3,四行依次接到單片機的P1.4~P1.7;同時,將列線上拉,通過10K電阻接電源。</p><p><b> 圖4-3 矩陣鍵盤</b></p><p> 查找哪個按鍵被按下的方法為:一個一個地查找。先第一行輸出0,檢查列線是否非全高;否則第二行輸出0,檢查列線是否
26、非全高;否則第三行輸出0,檢查列線是否非全高;如果某行輸出0時,查到列線非全高,則該行有按鍵按下;根據(jù)第幾行線輸出0與第幾列線讀入為0,即可判斷在具體什么位置的按鍵按下。</p><p><b> 4.4 顯示模塊 </b></p><p> 4.4.1 1602液晶顯示器 </p><p> 液晶具體積小、功耗低、顯示操作簡單等優(yōu)點,但
27、致命缺點是溫度范圍很窄。本系統(tǒng)使用的是1602液晶顯示器(LCD)。1602液晶為5V電壓驅動,帶背光,可顯示兩行,每行16個字符,不能顯示漢字,內置含128個字符的ASCII字符集字庫。</p><p> 圖4-4 1602字符型液晶顯示器實物</p><p> 4.4.2 芯片簡介 </p><p> 4.4.2.1 接口信號說明(表4-1如下)</
28、p><p> 表4-1 LCD引腳介紹</p><p> 4.4.2.2 主要技術參數(shù)(表4-2如下)</p><p> 表4-2 主要技術參數(shù)</p><p> 圖4-5 1602LCD尺寸圖</p><p> 4.4.2.3 1602LCD的指令說明及時序</p><p> 1602
29、液晶模塊內部的控制器共有11條控制指令,如表4-3所示:</p><p> 表4-3 控制命令表</p><p> 1602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現(xiàn)的。(說明:1為高電平、0為低電平)</p><p> 指令1:清顯示,指令碼01H,光標復位到地址00H位置。</p><p> 指令2:光標復位,光標
30、返回到地址00H。</p><p> 指令3:光標和顯示模式設置 I/D:光標移動方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。</p><p> 指令4:顯示開關控制。 D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示 C:控制光標的開與關,高電平表示有光標,低電平表示無光標 B:控制光標是否閃爍,高電平閃爍,低電平不閃爍
31、。</p><p> 指令5:光標或顯示移位 S/C:高電平時移動顯示的文字,低電平時移動光標。</p><p> 指令6:功能設置命令 DL:高電平時為4位總線,低電平時為8位總線 N:低電平時為單行顯示,高電平時雙行顯示 F: 低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符。</p><p> 指令7:字符發(fā)生器RAM地址設置。</p&
32、gt;<p> 指令8:DDRAM地址設置。</p><p> 指令9:讀忙信號和光標地址 BF:為忙標志位,高電平表示忙,此時模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。</p><p><b> 指令10:寫數(shù)據(jù)。</b></p><p><b> 指令11:讀數(shù)據(jù)。</b></p>
33、;<p> 與HD44780相兼容的芯片時序表如下:</p><p> 表4-4基本操作時序表</p><p> 讀寫操作時序如圖4-6和4-7所示:</p><p> 圖4-6 讀操作時序</p><p> 圖4-7 寫操作時序</p><p> 4.4.2.4 1602LCD的RAM地址映
34、射及標準字庫表</p><p> 液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令之前一定要確認模塊的忙標志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖4-8是1602的內部顯示地址。</p><p> 圖4-8 1602LCD內部顯示地址</p><p> 例如第二行第一個字符的地址是40H,那么是否
35、直接寫入40H就可以將光標定位在第二行第一個字符的位置呢?這樣不行,因為寫入顯示地址時要求最高位D7恒定為高電平1所以實際寫入的數(shù)據(jù)應該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。</p><p> 在對液晶模塊的初始化中要先設置其顯示模式,在液晶模塊顯示字符時光標是自動右移的,無需人工干預。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。</p>
36、<p> 1602液晶模塊內部的字符發(fā)生存儲器(CGROM)已經存儲了160個不同的點陣字符圖形,如圖4-9所示,這些字符有:阿拉伯數(shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。</p><p> 圖4-9 1602液晶顯示器字庫&l
37、t;/p><p> 單片機系統(tǒng)與液晶接口如下圖所示:</p><p> 圖4-10 液晶顯示器接口</p><p><b> 第五章 程序設計</b></p><p> 5.1輸入程序流程圖設計 </p><p> 為了實現(xiàn)鍵盤的數(shù)據(jù)輸入功能和命令處理功能,每個鍵都有其處理子程序,為此每個
38、鍵都對應一個碼——鍵碼。為了得到被按鍵的鍵碼,現(xiàn)使用行掃描法識別按鍵。列掃描信號進行讀入行的信號判斷該列是否有列的輸出——是則進行按照行列計算鍵盤的值,查表取得鍵碼并返回——若否則進行再次掃描。其程序框圖(圖5-1)如下:</p><p> 圖5-1 鍵盤輸入程序流程圖</p><p> 5.2 LCD顯示程序設計 </p><p> 根據(jù)LCD1602的工作
39、原理,考慮到本設計只需要顯示計算式和計算結果,程序中采用了三個子程序就完成了LCD1602的顯示功能。這三個子程序分別是:忙狀態(tài)檢測程序、寫命令程序和寫數(shù)據(jù)程序,通過調用三個子程序就可以實現(xiàn)LCD1602的工作模式設置以及數(shù)據(jù)的顯示</p><p> 5.3 主程序的設計</p><p> 首先初始化參數(shù),送LCD顯示“0”。然后掃描鍵盤看是否有鍵輸入,若有,讀取鍵碼。判斷鍵碼是數(shù)字鍵
40、、清零鍵還是功能鍵(“+”“-”“*”“/”“=” ),是數(shù)值鍵則送LCD顯示并保存數(shù)值,是清零鍵則做清零處理,是功能鍵則又判斷是“=”還是運算鍵,若是“=”則計算最后結果并送LED顯示,若是運算鍵則保存相應運算鍵定義的數(shù)值,以便后續(xù)計算。</p><p> 圖5-2 主程序流程圖</p><p><b> 小結</b></p><p>
41、 課程設計是培養(yǎng)我們綜合運用所學知識,發(fā)現(xiàn)、提出、分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對我們實際工作能力的具體訓練和考察過程。隨著科學技術發(fā)展的日新日異,單片機已經成為當今計算機應用中空前活躍的領域, 在生活中可以說得是無處不在。因此作為計算機專業(yè)的學生來說掌握單片機的開發(fā)技術是十分重要的。</p><p> 本次課程設計我選定的題目是簡易計算器的設計,看似簡單的設計,在實際設計過程中還是不那么簡單的
42、,雖然本次設計還存在一定的不足之處:1、不能進行負數(shù)的運算;2、不能進行連續(xù)運算;3、雖然能進行連續(xù)輸入運算符的更新覆蓋,但是任然會顯示所有輸入;4、必須手動清屏。但是本下設計的過程中,我學到了很多。首先,是對單片機為核心的硬件電路有了一定的了解和熟悉,其次,本次設計采用了C語言編程,使我對結構化程序設計有了新的認識,最后,本次設計使用了PROTEUS仿真,使我對單片機仿真有了一定的了解,為我以后的單片機設計莫定了基礎。</p&g
43、t;<p><b> 【參考文獻】</b></p><p> [1]《例說51單片機(C語言版)》張義和、王敏男等 人民郵電出版社</p><p> [2]《單片機原理與接口技術》(第3版)李朝青編著 北京航空航天大學出版社</p><p> [3]《單片機原理與應用實例仿真》(第2版)李泉溪主編 北京航空航天大學出
44、版社</p><p> [4]《電工學電子技術》(第6版)秦曾煌主編 高等教育出版社</p><p> [5]《51單片機C語言教程——入門、提高、開發(fā)、拓展全攻略》(2009年12月)郭天祥主編 電子工業(yè)出版 </p><p><b> 程序附錄:</b></p><p> #include <RE
45、GX52.H></p><p><b> //定義引腳</b></p><p> #define DATA_BUS P0//LCD數(shù)據(jù)總線 </p><p> #define RS P2_0//LCD的三條控制總線</p><p> #define RW P2_1 </p><p>
46、 #define E P2_2</p><p> #define key P1//按鍵使用的引腳</p><p><b> //定義數(shù)據(jù)類型</b></p><p> #define uchar unsigned char//無符號字符型</p><p> #define uint unsigned int/
47、/無符號整型</p><p><b> //申明函數(shù)</b></p><p> void check_busy(void);//LCD讀忙碌函數(shù)</p><p> void write_command(uchar com);//LCD寫命令函數(shù)</p><p> void write_data(uchar dat
48、e);//LCD寫數(shù)據(jù)函數(shù)</p><p> void LCD_init(void);//LCD初始化函數(shù)</p><p> void display(uchar*);//LCD顯示字符串函數(shù)</p><p> void delay(uint);//延時函數(shù)(ms)</p><p> char Check_Key(void);//按鍵
49、掃描函數(shù)</p><p> void start(void);//LCD開始工作顯示函數(shù)</p><p> void shuru();//主循環(huán)函數(shù)</p><p> void init();//初始化參數(shù)</p><p> signed long calculate(signed long,signed long,uchar);//
50、計算子函數(shù)</p><p> signed long get_Num(signed long,uchar);//獲得輸入字符的數(shù)據(jù)大小</p><p><b> //申明變量</b></p><p> uchar val,flag1='0',flag2='0',flag3='0';//申明標
51、識符</p><p> signed long firstNum,lastNum,result;//申明中間計算數(shù)</p><p> uchar error[]="ERROR!!!";//錯誤時顯示字符串</p><p> uchar over[]="Out of range!!!!";//超出范圍顯示字符串</p
52、><p> uchar start1[]="design for";//啟動時顯示字符串</p><p> uchar start2[]="children under 3";//啟動時顯示字符串</p><p><b> //主函數(shù)</b></p><p> void mai
53、n(void)</p><p><b> {</b></p><p> key=0;//初始化鍵盤掃描口</p><p><b> start();</b></p><p> LCD_init();</p><p><b> while(1)</b&
54、gt;</p><p><b> {</b></p><p><b> shuru();</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //循環(huán)主函
55、數(shù) </b></p><p> void shuru()</p><p><b> {</b></p><p> Check_Key();//鍵盤掃描</p><p> if(flag1=='1')//讀到鍵flag1置1</p><p><b>
56、{</b></p><p> val=Check_Key();//獲得鍵值</p><p> write_data(val);//顯示獲得鍵值</p><p> if(val<='9'&&val>='0')//獲得0-9之間的數(shù)</p><p><b>
57、 {</b></p><p> if(flag2=='0')//獲得第一個數(shù)</p><p><b> {</b></p><p> firstNum=get_Num(firstNum,val);//計算第一個數(shù)大小</p><p> if(firstNum>10000||fi
58、rstNum<-10000)//判斷第一個數(shù)是否超出范圍</p><p><b> {</b></p><p> LCD_init();//LCD初始化</p><p> display(over);//顯示超出范圍字符串</p><p><b> return;</b></p&
59、gt;<p><b> }</b></p><p><b> }</b></p><p> if(flag2=='1')//獲得第二個數(shù)</p><p><b> {</b></p><p> lastNum=get_Num(las
60、tNum,val);//獲得第二個數(shù)的大小</p><p> if(lastNum>10000||lastNum<-10000)//判斷第二個數(shù)是否超出范圍</p><p><b> {</b></p><p> LCD_init();//LCD初始化</p><p> display(over);/
61、/顯示超出范圍字符串</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(val
62、>'9'||val<'0')//獲得非數(shù)字字符</p><p><b> {</b></p><p> flag2='1';//flag2置1,表示下次輸入的為第二個數(shù)</p><p> switch(val)//判斷輸入的計算符號,并記錄方便之后計算</p>&l
63、t;p><b> {</b></p><p> case '+':flag3='1';break;//flag3標志運算符</p><p> case '-':flag3='2';break;</p><p> case '*':flag3='
64、3';break;</p><p> case '/':flag3='4';break;</p><p> default:break;</p><p><b> }</b></p><p><b> }</b></p><p&g
65、t; if(val=='c')//輸入清零</p><p><b> {</b></p><p> LCD_init();//LCD初始化</p><p> init();//初始化參數(shù)</p><p><b> }</b></p><p> if
66、(val=='=')//輸入等號</p><p><b> {</b></p><p> result=calculate(firstNum,lastNum,flag3);//調用計算函數(shù)計算結果</p><p> firstNum=result;//將結果賦給firstNum</p><p>
67、write_command(0xc0);//修改LCD顯示位置(左下角開始),顯示方式(從右到左顯示)</p><p> write_command(0x04);</p><p> write_command(0xcf);</p><p> if(result<0)//負數(shù)顯示</p><p><b> {</b
68、></p><p> result=-result;//取反得到正數(shù)</p><p> while(result!=0)//從低位到高位顯示</p><p><b> {</b></p><p><b> int a=0;</b></p><p> a=res
69、ult%10;</p><p> write_data(a+'0');</p><p> result=result/10;</p><p><b> }</b></p><p> write_data('-');//顯示負號</p><p><b&g
70、t; }</b></p><p> else if(result>0)//正數(shù)顯示</p><p><b> {</b></p><p> while(result!=0)//從低位到高位顯示</p><p><b> {</b></p><p>
71、<b> int a=0;</b></p><p> a=result%10;</p><p> write_data(a+'0');</p><p> result=result/10;</p><p><b> }</b></p><p><
72、;b> }</b></p><p><b> else//顯示零</b></p><p> write_data('0');</p><p> write_command(0x0c);//修改LCD顯示方式(從左到右顯示),顯示位置(右上角開始)</p><p> write_
73、command(0x06);</p><p> write_command(0x80); </p><p> init();//初始化參數(shù)</p><p><b> }</b></p><p> flag1='0';//為下次讀鍵做準備</p><p><b>
74、; }</b></p><p><b> }</b></p><p><b> //初始化參數(shù)</b></p><p> void init()</p><p><b> {</b></p><p> flag1='0
75、39;;//標志是否讀到鍵</p><p> flag2='0';//標志讀到的是第幾個運算數(shù)</p><p> flag3='0';//標志讀到的是哪一個運算符</p><p> val='0';//存儲讀道的鍵值</p><p> firstNum=0;//輸入的第一個運算數(shù)<
76、/p><p> lastNum=0;//輸入的第一個運算數(shù)</p><p> result=0;//運算的結果</p><p><b> }</b></p><p><b> //計算子函數(shù)</b></p><p> signed long calculate(sig
77、ned long firstNum,signed long lastNum,uchar flag3)</p><p><b> {</b></p><p> signed long a=0;</p><p> switch(flag3)</p><p><b> {</b></p&g
78、t;<p> case '1':a=firstNum+lastNum;break;//加法運算</p><p> case '2':a=firstNum-lastNum;break;//減法運算</p><p> case '3':a=firstNum*lastNum;break;//乘法運算</p><
79、;p><b> case '4':</b></p><p> if(lastNum==0)//除數(shù)為零錯誤</p><p><b> {</b></p><p> LCD_init();</p><p> display(error);</p><
80、p><b> return 0;</b></p><p><b> }</b></p><p><b> else</b></p><p> a=firstNum/lastNum;//除法運算</p><p><b> break;</b>
81、</p><p> default:a=firstNum;break;//為等號時直接輸出第一個數(shù)</p><p><b> }</b></p><p> return a;//返回計算結果</p><p><b> }</b></p><p> //用于顯示一個
82、字符串</p><p> void display(uchar aa[])</p><p><b> {</b></p><p><b> int i=0;</b></p><p> while(aa[i]!='\0')</p><p><b&g
83、t; {</b></p><p> if(i==16)//長度超過16時換行</p><p> write_command(0xc0); </p><p> write_data(aa[i++]);</p><p><b> }</b></p><p><b>
84、; }</b></p><p> //延時程序(約j毫秒)</p><p> void delay(uint j)</p><p><b> { </b></p><p> uchar i = 60;</p><p> for(; j>0; j--)</p>
85、;<p><b> { </b></p><p> while(--i);</p><p><b> i = 59;</b></p><p> while(--i);</p><p><b> i = 60;</b></p><p&g
86、t;<b> }</b></p><p><b> }</b></p><p> //檢驗LCD是否忙碌</p><p> void check_busy(void)</p><p><b> { </b></p><p><b>
87、 do</b></p><p><b> { </b></p><p> DATA_BUS = 0xff;</p><p><b> E = 0;</b></p><p><b> RS = 0; </b></p><p><b
88、> RW = 1;</b></p><p><b> E = 1;</b></p><p><b> delay(5);</b></p><p> } while(DATA_BUS & 0x80);</p><p><b> E = 0;</b&g
89、t;</p><p><b> }</b></p><p> //向LCD寫入一個命令</p><p> void write_command(uchar com)</p><p><b> { </b></p><p> check_busy();</p&
90、gt;<p><b> E = 0;</b></p><p><b> RS = 0;</b></p><p><b> RW = 0;</b></p><p> DATA_BUS = com;</p><p><b> E = 1;</
91、b></p><p><b> delay(5);</b></p><p><b> E = 0;</b></p><p><b> delay(1);</b></p><p><b> }</b></p><p>
92、 //向LCD寫入一個數(shù)據(jù)</p><p> void write_data(uchar date)</p><p><b> { </b></p><p> check_busy();</p><p><b> E = 0;</b></p><p><b>
93、; RS = 1;</b></p><p><b> RW = 0;</b></p><p> DATA_BUS = date;</p><p><b> E = 1;</b></p><p><b> delay(5);</b></p>&
94、lt;p><b> E = 0;</b></p><p> delay(1); </p><p><b> }</b></p><p><b> //初始化LCD</b></p><p> void LCD_init(void)</p><
95、;p><b> { </b></p><p> write_command(0x38);//16x2顯示</p><p> write_command(0x0f);//開顯示,開光標,開顯示 </p><p> write_command(0x06);//地址指針自加一,光標自加一</p><p> wr
96、ite_command(0x01);//清屏</p><p> write_command(0xcf);//設置光標位置右下角</p><p> write_data('0');//顯示數(shù)字0</p><p> write_command(0x80);//設置光標位置左上角</p><p><b> dela
97、y(1);</b></p><p><b> }</b></p><p><b> //鍵盤掃描</b></p><p> char Check_Key(void)</p><p><b> {</b></p><p> char
98、key_Map[]={'+','-','*','/','=','3','6','9','0','2','5','8','c','1','4','7'};</p><
99、p> unsigned char row,col,tmp1,tmp2,key_val;</p><p> tmp1 = 0x10;//tmp1用來設置P1口的輸出,取反后使P1.4~P1.7中有一個為0</p><p> for(row=0;row<4;row++)// 行檢測</p><p><b> {</b></
100、p><p> key = 0x0f;//先將p1.4~P1.7置高</p><p> key =~tmp1;//使P1.4~p1.7中有一個為0</p><p> tmp1*=2;//tmp1左移一位</p><p> if ((key & 0x0f) < 0x0f)//檢測P1.0~P1.3中是否有一位為0,只要有,則說明
101、此行有鍵按下,進入列檢測</p><p><b> { </b></p><p> tmp2 = 0x01;//tmp2用于檢測出哪一列為0</p><p> for(col =0;col<4;col++)//列檢測</p><p><b> { </b></p>&
102、lt;p> if((key & tmp2)==0x00)//該列如果為低電平則可以判定為該列</p><p><b> { </b></p><p> key_val =key_Map[row*4+col];//獲取鍵值,識別按鍵;key_Map為按鍵的定義表</p><p> flag1='1';//標志
103、獲得了一個字符</p><p> while((key & 0x0f) < 0x0f);</p><p> delay(750);</p><p> if((key & 0x0f) < 0x0f);</p><p> return key_val;//退出循環(huán)</p><p><
104、;b> }</b></p><p> tmp2*=2;//tmp2左移一位</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> return k
105、ey_val;//返回獲得鍵值</p><p><b> }</b></p><p> //獲得輸入字符的數(shù)據(jù)大小 </p><p> signed long get_Num(signed long Num,uchar val)</p><p><b> {</b></p>&
106、lt;p><b> long a;</b></p><p> a=Num*10+(val-'0');</p><p> return a;</p><p><b> }</b></p><p> //LCD開始工作顯示函數(shù)</p><p>
107、 void start()</p><p><b> {</b></p><p> write_command(0x38);//16x2顯示</p><p> write_command(0x0f);//開顯示,開光標,開顯示 </p><p> write_command(0x06);//地址指針自加一,光標自
108、加一</p><p> write_command(0x01);//清屏</p><p> write_command(0x80+0x03);//調整第一行字符顯示位置</p><p> display(start1);//顯示第一行字符</p><p> write_command(0xc0);//調整第二行字符顯示</p&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計-- 單片機原理及應用
- 單片機原理及應用課程設計
- 單片機原理及應用課程設計
- 單片機手機鍵盤-單片機原理及應用課程設計
- 單片機課程設計--單片機串行通訊
- 單片機原理及應用課程設計--基于單片機的電子時鐘設計
- 《單片機原理及應用》課程設計—單片機電子琴設計
- 單片機課程設計--單片機io口的應用
- 單片機秒表單片機課程設計
- 單片機課程設計---單片機數(shù)字時鐘
- 單片機原理及系統(tǒng)課程設計--基于單片機的電子鬧鐘設計
- 單片機原理及系統(tǒng)課程設計
- 單片機原理及系統(tǒng)課程設計
- 單片機課程設計-單片機課程設計---電子時鐘
- 單片機原理及應用課程設計(溫度測量)
- lcd單片機原理課程設計
- 單片機課程設計--單片機控制步進電機
- 單片機課程設計-單片機控制步進電機
- 單片機課程設計---單片機籃球計分器
- 單片機課程設計報告---單片機數(shù)字時鐘
評論
0/150
提交評論