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