![電子設(shè)計-基于STC89C52RC單片機(jī)的簡易計算器設(shè)計_第1頁](http://file.renrendoc.com/FileRoot1/2020-2/21/3d064862-ff8e-493c-88ad-7bf20cd60f0c/3d064862-ff8e-493c-88ad-7bf20cd60f0c1.gif)
![電子設(shè)計-基于STC89C52RC單片機(jī)的簡易計算器設(shè)計_第2頁](http://file.renrendoc.com/FileRoot1/2020-2/21/3d064862-ff8e-493c-88ad-7bf20cd60f0c/3d064862-ff8e-493c-88ad-7bf20cd60f0c2.gif)
![電子設(shè)計-基于STC89C52RC單片機(jī)的簡易計算器設(shè)計_第3頁](http://file.renrendoc.com/FileRoot1/2020-2/21/3d064862-ff8e-493c-88ad-7bf20cd60f0c/3d064862-ff8e-493c-88ad-7bf20cd60f0c3.gif)
![電子設(shè)計-基于STC89C52RC單片機(jī)的簡易計算器設(shè)計_第4頁](http://file.renrendoc.com/FileRoot1/2020-2/21/3d064862-ff8e-493c-88ad-7bf20cd60f0c/3d064862-ff8e-493c-88ad-7bf20cd60f0c4.gif)
![電子設(shè)計-基于STC89C52RC單片機(jī)的簡易計算器設(shè)計_第5頁](http://file.renrendoc.com/FileRoot1/2020-2/21/3d064862-ff8e-493c-88ad-7bf20cd60f0c/3d064862-ff8e-493c-88ad-7bf20cd60f0c5.gif)
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
.電子設(shè)計實驗名稱:基于STC89C52RC單片機(jī)的簡易計算器設(shè)計 姓 名: _學(xué) 號:指導(dǎo)老師: 目錄一、可行性研究.3二、設(shè)計方案簡述.4 2.1、功能介紹.4基本功能.4擴(kuò)展功能.4 2.2、總體設(shè)計方案.5總體設(shè)計思路.5方案論證與比較.6系統(tǒng)組成.7三、詳細(xì)設(shè)計.12 1.各個模塊設(shè)計.12 輸入模塊:鍵盤掃描.13 運(yùn)算模塊:單片機(jī)控制.14 顯示模塊:LCD1602顯示.15 2.硬件電路設(shè)計.16 硬件連接.16 3.元件的介紹17 STC89C52單片機(jī)組成.17 復(fù)位和復(fù)位電路.18 LCD1602顯示器.19 4.PCB設(shè)計以及結(jié)果顯示.225、 總結(jié)24附錄主要程序代碼.25一、設(shè)可行性分析:1.2.1 經(jīng)濟(jì)可行性由于只是實驗性質(zhì)的編程,所以在設(shè)計和開發(fā)都不需要過多的經(jīng)費(fèi),但是系統(tǒng)投入運(yùn)行以后,硬件維護(hù)和損耗所造成的耗費(fèi)是必須的,但是數(shù)目也不會很大。所以經(jīng)過初步分析,經(jīng)濟(jì)上基本上是可行的1.2.2技術(shù)可行性在技術(shù)方面,因為都學(xué)習(xí)了C語言,硬件課程設(shè)計等課程,對于開發(fā)語言c語言也有一定的掌控能力,應(yīng)該能夠完成相應(yīng)的任務(wù)。1.2.3 運(yùn)行可行性該成果簡單易操作,非常容易使用。1.2.4 法律可行性由于我們需要完成的功能相對簡單,沒有太多涉及到很專業(yè)方面的內(nèi)容,更沒有計劃將系統(tǒng)利用到商業(yè)用途,所以不存在侵權(quán)或者版權(quán)糾紛方面的問題。1.2.5結(jié)論該系統(tǒng)的軟硬件都比較容易理解和實現(xiàn),所以,具有實現(xiàn)一計算器的可行性。二、設(shè)計方案簡述2.1功能概述系統(tǒng)基本功能:(1)由于設(shè)計的計算器要進(jìn)行四則運(yùn)算,為了得到較好的顯示效果,經(jīng)綜合分析后,最后采用LCD 顯示數(shù)據(jù)和結(jié)果。(2)采用鍵盤輸入方式,鍵盤包括數(shù)字鍵(09)、符號鍵(+、-、)、清除鍵(onc)和等號鍵(=),故只需要16 個按鍵即可,設(shè)計中采用集成的計算鍵盤。(3)在執(zhí)行過程中,開機(jī)顯示零,等待鍵入數(shù)值,當(dāng)鍵入數(shù)字,通過LCD顯示出來,當(dāng)鍵入+、-、*、/運(yùn)算符,計算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲,并等待再次鍵入數(shù)值,當(dāng)再鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號就會在LCD上輸出運(yùn)算結(jié)果。(4)錯誤提示:當(dāng)計算器執(zhí)行過程中有錯誤時,會在LCD上顯示相應(yīng)的提示,如:當(dāng)輸入的數(shù)值或計算得到的結(jié)果大于計算器的表示范圍時,計算器會在LCD上提示overflow;當(dāng)除數(shù)為0時,計算器會在LCD上提示error。擴(kuò)展功能:加上括號的混合運(yùn)算2.2總體設(shè)計思路本設(shè)計主要采用以下基本模塊來實現(xiàn):控制器模塊,輸入模塊,輸出模塊和電源模塊。通過對控制器進(jìn)行編程。使其對輸入模塊的信號進(jìn)行處理計算,然后通過輸出模塊反饋給使用者以計算結(jié)果。STC89C52單片機(jī)4*4鍵盤LCD顯示 晶振電路復(fù)位電路線路原理框圖方案論證與比較控制部分的設(shè)計方案論證與選擇根據(jù)設(shè)計要求,控制器主要用于紅外信號的接收和辨認(rèn)、控制步進(jìn)電機(jī)的動作,控制顯示步進(jìn)電機(jī)的轉(zhuǎn)速等。對于控制器的選擇有以下三種方案。方案一:采用計算器專用芯片實現(xiàn)。用計算器專用芯片進(jìn)行設(shè)計并編程實現(xiàn)。這種設(shè)計方案計算效率高、速度快、而且成本也相對較低,是廠家做計算器的最佳方案。但是本人對計算器專用芯片掌握的不夠,還不足以實現(xiàn)設(shè)計計算器,所以這個方案不可去。 方案二:采用FPGA(現(xiàn)場可編程門陣列)作為系統(tǒng)的控制器。FPGA將所有器件集成到一塊芯片上,體積小,節(jié)省空間,提高了穩(wěn)定性;直接面向用戶,具有極大的靈活性和通用性,使用方便,硬件測試和實現(xiàn)快捷,開發(fā)效率高,工作可靠性好。可以實現(xiàn)各種復(fù)雜的邏輯功能,規(guī)模大,密度高,采用并行的輸入輸出方式,系統(tǒng)處理速度高,適合作為大規(guī)模實時系統(tǒng)的控制核心。由FPGA內(nèi)部編程實現(xiàn)計算器功能,本設(shè)計對數(shù)據(jù)處理速度的要求不是很高,F(xiàn)PGA的高速處理的優(yōu)勢得不到充分的體現(xiàn),由于其集成度高,使其成本偏高,同時由于芯片的引腳較多,實物電路板布線復(fù)雜,加重了電路設(shè)計和實際焊接的工作。并且FPGA的價格相對較高,性價比太低。 方案三、用單片機(jī)實現(xiàn)。由于單片機(jī)集成了運(yùn)算器電路、控制電路、存儲器、中斷系統(tǒng)、定時器/計數(shù)器以及輸入/輸出口電路等,所以用單片機(jī)設(shè)計控制電路省去了很多分立元器件。由于單片機(jī)是可編程芯片,并且它可以運(yùn)用C語言編寫,對于一些復(fù)雜的計算功能,可以調(diào)用C語言庫函數(shù)。使編寫程序變得非常簡單。所以該課題用單片機(jī)實現(xiàn),不僅功能易于實現(xiàn),而且精確度高,穩(wěn)定性好,抗干擾能力強(qiáng)。并且由于其成本低、體積小、技術(shù)成熟和功耗小等優(yōu)點,且技術(shù)比較成熟。性價比也相當(dāng)高。更重要的是本人經(jīng)過幾年的學(xué)習(xí),對單片機(jī)已有深刻的理解,并且可以靈活運(yùn)用。綜上所述,并通過各個方面綜合比較為達(dá)到最佳效果。我們采用方案三利用單片機(jī)控制器。顯示電路的設(shè)計方案論證與選擇方案一:數(shù)碼管顯示方案。數(shù)碼管顯示使用兩個四位一體動態(tài)數(shù)碼管顯示方案,此設(shè)計電路如圖所示。采用動態(tài)數(shù)碼管顯示,具有程序簡單, 對外界環(huán)境要求低,易于維護(hù),同時其精度比較高,精確可靠,操作簡單。顯示直觀的特點。但只能顯示數(shù)字和一些代碼,不能顯示漢字及一些常用的符號,且硬件設(shè)計比較復(fù)雜。方案二;LCD1602顯示器所謂1602是指顯示的內(nèi)容為16*2,即可以顯示兩行,每行16個字符。目前字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程序可以很方便地應(yīng)用于大部分的字符型液晶。字符型LCD1602通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣,引腳定義如下表所示: HD44780內(nèi)置了DDRAM、CGROM和CGRAM。 DDRAM就是顯示數(shù)據(jù)RAM,用來寄存待顯示的字符代碼。共80個字節(jié),其地址和屏幕的對應(yīng)關(guān)系如下表: HD44780的指令集1.清屏指令 功能: 清除液晶顯示器,即將DDRAM的內(nèi)容全部填入空白的ASCII碼20H; 光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方; 將地址計數(shù)器(AC)的值設(shè)為0。 2.光標(biāo)歸位指令 功能: 把光標(biāo)撤回到顯示器的左上方; 把地址計數(shù)器(AC)的值設(shè)置為0; 保持DDRAM的內(nèi)容不變 3.進(jìn)入模式設(shè)置指令 功能:設(shè)定每次定入1位數(shù)據(jù)后光標(biāo)的移位方向,并且設(shè)定每次寫入的一個字符是否移動。參數(shù)設(shè)定的情況如下所示: 位名設(shè)置 I/D 0=寫入新數(shù)據(jù)后光標(biāo)左移 1=寫入新數(shù)據(jù)后光標(biāo)右移 S0=寫入新數(shù)據(jù)后顯示屏不移動 1=寫入新數(shù)據(jù)后顯示屏整體右移1個字 4.顯示開關(guān)控制指令 功能:控制顯示器開/關(guān)、光標(biāo)顯示/關(guān)閉以及光標(biāo)是否閃爍。參數(shù)設(shè)定的情況如下: 位名設(shè)置 D0=顯示功能關(guān) 1=顯示功能開 C0=無光標(biāo) 1=有光標(biāo) B0=光標(biāo)閃爍 1=光標(biāo)不閃爍 5.設(shè)定顯示屏或光標(biāo)移動方向指令 功能:使光標(biāo)移位或使整個顯示屏幕移位。參數(shù)設(shè)定的情況如下: S/C R/L設(shè)定情況 0 0光標(biāo)左移1格,且AC值減1 0 1光標(biāo)右移1格,且AC值加1 1 0顯示器上字符全部左移一格,但光標(biāo)不動 1 1顯示器上字符全部右移一格,但光標(biāo)不動 6.功能設(shè)定指令 功能:設(shè)定數(shù)據(jù)總線位數(shù)、顯示的行數(shù)及字型。參數(shù)設(shè)定的情況如下: 位名設(shè)置 DL 0=數(shù)據(jù)總線為4位 1=數(shù)據(jù)總線為8位 N 0=顯示1行 1=顯示2行 F0=57點陣/每字符 1=510點陣/每字符 7.設(shè)定CGRAM地址指令 功能:設(shè)定下一個要存入數(shù)據(jù)的CGRAM的地址。 8.設(shè)定DDRAM地址指令 功能:設(shè)定下一個要存入數(shù)據(jù)的CGRAM的地址。 (注意這里我們送地址的時候應(yīng)該是0x80+Address,這也是前面說到寫地址命令的時候要加上0x80的原因) 9.讀取忙信號或AC地址指令 功能: 讀取忙碌信號BF的內(nèi)容,BF=1表示液晶顯示器忙,暫時無法接收單片機(jī)送來的數(shù)據(jù)或指令; 當(dāng)BF=0時,液晶顯示器可以接收單片機(jī)送來的數(shù)據(jù)或指令; 讀取地址計數(shù)器(AC)的內(nèi)容。 10.數(shù)據(jù)寫入DDRAM或CGRAM指令一覽 功能: 將字符碼寫入DDRAM,以使液晶顯示屏顯示出相對應(yīng)的字符; 將使用者自己設(shè)計的圖形存入CGRAM。 11.從CGRAM或DDRAM讀出數(shù)據(jù)的指令一覽 功能:讀取DDRAM或CGRAM中的內(nèi)容。 基本操作時序: 讀狀態(tài) 輸入:RS=L,RW=H,E=H 輸出:DB0DB7=狀態(tài)字 寫指令 輸入:RS=L,RW=L,E=下降沿脈沖,DB0DB7=指令碼 輸出:無 讀數(shù)據(jù) 輸入:RS=H,RW=H,E=H 輸出:DB0DB7=數(shù)據(jù) 寫數(shù)據(jù) 輸入:RS=H,RW=L,E=下降沿脈沖,DB0DB7=數(shù)據(jù) 輸出:無 2.2.2.3、鍵盤設(shè)計方案與選擇方案一:獨立鍵盤。獨立鍵盤為一端接地,另一端接I/O口,并且要接上拉電阻。這種鍵盤的硬件都很容易實現(xiàn),但每一個按鍵就要用一個I/O口,適合本次設(shè)計。方案二:通過PS2協(xié)義,用鍵盤同單片機(jī)相接,從而實現(xiàn)單片機(jī)與鍵盤通信。其電路如圖所示。現(xiàn)在PC機(jī)廣泛采用的PS/2接口為miniDIN 6引腳的連接器。1數(shù)據(jù)線(DATA);未用;3電源地(GND);4電源(+5 V);5時鐘(CLK);6未用。由此圖可知,使用鍵盤硬件結(jié)構(gòu)比較簡單,但鍵盤的體積太大,所以此系統(tǒng)不采用此方案。方案三:自制編碼鍵盤。編碼鍵盤的電路如圖所示,這種鍵盤有編程簡單,占用資源少,但其硬件比較復(fù)雜,要用很多的二極管,不是很理想。 方案四:4*4矩陣式鍵盤。其電路圖如圖所示,這種鍵盤的硬件簡單,使用的I/O口也不多,而且這種鍵盤的編程方法已很成熟。本次設(shè)計也可以采用這種矩陣式鍵盤。其電路圖如圖主體設(shè)計部分:(1)、系統(tǒng)模塊圖:(2)、算術(shù)運(yùn)算程序流程圖:(3)、系統(tǒng)總流程圖:(4)、硬件設(shè)計:(一)、總體硬件設(shè)計:本設(shè)計選用AT89C51單片機(jī)為主控單元; 顯示部分:采用LCD靜態(tài)顯示;按鍵部分:采用4*4鍵盤;用MM74C922為4*4鍵盤掃描IC,讀取輸入的鍵值。總體設(shè)計效果如下圖:(二)、單片機(jī)接口電路說明:1、手動上電復(fù)位電路:當(dāng)VCC上電時,C充電,在10K電阻上出現(xiàn)電壓,使得單片機(jī)復(fù)位;幾個毫秒后,C充滿,10K電阻上電流降為0,電壓也為0,使得單片機(jī)進(jìn)入工作狀態(tài)。工作期間,按下S,C放電。S松手,C又充電,在10K電阻上出現(xiàn)電壓,使得單片機(jī)復(fù)位。幾個毫秒后,單片機(jī)進(jìn)入工作狀態(tài)。 2、內(nèi)部時鐘模式電路:當(dāng)單片機(jī)工作于內(nèi)部時鐘模式的時候,只需在XTAL1和XTAL2引腳連接一個晶體振蕩器或者陶瓷振蕩器,并接兩個電容后接地即可,在使用時對于電容的選擇有一定的要求:當(dāng)外接晶體振蕩器的時候,電容值一般選擇C1=C2=30+10pF或30-10pF;當(dāng)外接陶瓷振蕩器的時候,電容值一般選擇C1=C2=40+10pF或40-10pF;3、 STC89C52介紹:STC89C52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗電路,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,三個16 位 定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口。另外 STC89X52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個中斷或硬件復(fù)位為止。最高運(yùn)作頻率35Mhz,6T/12T可選。和atmel的對比STC89C52RC單片機(jī):8K字節(jié)程序存儲空間;512字節(jié)數(shù)據(jù)存儲空間;內(nèi)帶4K字節(jié)EEPROM存儲空間;可直接使用串口下載;AT89S52單片機(jī):8K字節(jié)程序存儲空間;256字節(jié)數(shù)據(jù)存儲空間;沒有內(nèi)帶EEPROM存儲空間; 4、 LCD1602介紹:1602采用標(biāo)準(zhǔn)的16腳接口,其中:第1腳:VSS為電源地第2腳:VDD接5V電源正極第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度)。第4腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。第5腳:RW為讀寫信號線,高電平(1)時進(jìn)行讀操作,低電平(0)時進(jìn)行寫操作。第6腳:E(或EN)端為使能(enable)端。第714腳:D0D7為8位雙向數(shù)據(jù)端。第1516腳:空腳或背燈電源。15腳背光正極,16腳背光負(fù)極602LCD的特性n+5V電壓,對比度可調(diào)n內(nèi)含復(fù)位電路n提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能n有80字節(jié)顯示數(shù)據(jù)存儲器DDRAMn內(nèi)建有192個5X7點陣的字型的字符發(fā)生器CGROMn8個可由用戶自定義的5X7的字符發(fā)生器CGRAM讀的時候,先讀左邊那列,再讀上面那行,如:感嘆號!的ASCII為0x21,字母B的ASCII為0x42(前面加0x表示十六進(jìn)制)1602通過D0D7的8位數(shù)據(jù)端傳輸數(shù)據(jù)和指令。顯示模式設(shè)置: (初始化)0011 0000 0x38 設(shè)置162顯示,57點陣,8位數(shù)據(jù)接口;顯示開關(guān)及光標(biāo)設(shè)置: (初始化)0000 1DCB D顯示(1有效)、C光標(biāo)顯示(1有效)、B光標(biāo)閃爍(1有效)0000 01NS N=1(讀或?qū)懸粋€字符后地址指針加1 &光標(biāo)加1),N=0(讀或?qū)懸粋€字符后地址指針減1 &光標(biāo)減1),S=1 且 N=1 (當(dāng)寫一個字符后,整屏顯示左移)s=0 當(dāng)寫一個字符后,整屏顯示不移動數(shù)據(jù)指針設(shè)置:數(shù)據(jù)首地址為80H,所以數(shù)據(jù)地址為80H+地址碼(0-27H,40-67H)其他設(shè)置:01H(顯示清屏,數(shù)據(jù)指針=0,所有顯示=0);02H(顯示回車,數(shù)據(jù)指針=0)。(三)、鍵盤接口電路:計算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨立按鍵的方式,在這種情況下,編程會很簡單,但是會占用大量的I/O 口資源,因此在很多情況下都不采用這種方式,而是采用矩陣鍵盤的方案。矩陣鍵盤采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤,在行線和列線的每個交叉點上設(shè)置一個按鍵。這樣鍵盤上按鍵的個數(shù)就為44個。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中I/O 口的利用率。矩陣鍵盤的工作原理:計算器的鍵盤布局如圖1所示:一般有16個鍵組成,在單片機(jī)中正好可以用一個P口實現(xiàn)16個按鍵功能,這種形式在單片機(jī)系統(tǒng)中也最常用。圖 1 矩陣鍵盤布局圖矩陣鍵盤內(nèi)部電路圖如圖2所示: (四)、LCD顯示模塊:本設(shè)計采用LCD液晶顯示器來顯示輸出數(shù)據(jù)。通過D0-D7引腳向LCD寫指令字或?qū)憯?shù)據(jù)以使LCD實現(xiàn)不同的功能或顯示相應(yīng)數(shù)據(jù)。圖5 LCD 模塊(五)運(yùn)算模塊(單片機(jī)控制):MCS-51 單片機(jī)是在一塊芯片中集成了CPU、RAM、ROM、定時器/計數(shù)器和多功能I/O等一臺計算機(jī)所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲器(RAM)、程序存儲器(ROM/EPROM)、并行I/O 口、串行口、定時器/計數(shù)器、中斷系統(tǒng)及特殊功能寄存器(SFR)。單片機(jī)是靠程序運(yùn)行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨特的一些功能,通過使用單片機(jī)編寫的程序可以實現(xiàn)高智能,高效率,以及高可靠性!因此我們采用單片機(jī)作為計算器的主要功能部件,可以很快地實現(xiàn)運(yùn)算功能。PCB設(shè)計:1、實驗現(xiàn)象、數(shù)據(jù)記錄數(shù)碼顯示及運(yùn)算最多九位顯示及運(yùn)算當(dāng)超出時溢出顯示五、總結(jié)在實驗中遇到了這樣那樣的問題,軟件的編輯中使得c語言的應(yīng)用更加熟練;在硬件的實現(xiàn)中又出現(xiàn)了軟件和硬件不統(tǒng)一的問題,本實驗我做了兩次,第一次的時候STC89C52單片機(jī)的P2口的P2.0P2.7分別對應(yīng)連接到LCD1602的D7D0口,這就使得在寫程序的時候需要把所有讀寫的數(shù)據(jù)以及地址都按位取反,改寫程序比較復(fù)雜,最終調(diào)試失敗,又改變了硬件電路。最終成功; 本次設(shè)計不管在軟件,或是在硬件方面都讓我受益匪淺,讓我所學(xué)的知識得以應(yīng)用到實踐,經(jīng)過這次創(chuàng)新性實驗,也令我看到了很多的不足,在實驗中的一些程序不能夠及時編輯正確,需要很長時間的設(shè)計。硬件中我對單片機(jī)實驗板上的很多硬件不是很清楚,使得在下載程序后,又進(jìn)行了很長時間的調(diào)整。六、主要程序代碼Key.C #include #define uchar unsigned char #define uint unsigned int #define KEYDATA P1 uchar key; uchar dis_buff; void Delay1(uint x) uint i,j; for(i=0;ix;i+) for(j=0;j4)|0xf0); if(temp=1)key=0; else if(temp=2)key=1; else if(temp=4)key=2; else if(temp=8)key=3; else key=16; KEYDATA=0x0f; Delay1(1); temp=KEYDATA; temp=temp&0x0f; temp=(temp|0xf0); if(temp=1)key+=12; else if(temp=2)key+=8; else if(temp=4)key+=4; else if(temp=8)key+=0; else key=16; if(key16) dis_buff=key; return dis_buff; uchar KeyDown(void) uchar keyFlag; uchar temp; KEYDATA=0xf0; if(KEYDATA!=0xf0) temp=KEYDATA; Delay1(200); if(temp=KEYDATA) keyFlag=1; else keyFlag=0; else keyFlag=0; return keyFlag; 1602. C #include #include #define uchar unsigned char #define uint unsigned int sbit rs=P25; sbit rw=P26; sbit e=P27; sbit bf=P07; void delay1ms(void) uchar i,j; for(i=0;i10;i+) for(j=0;j33;j+) ; void delay(uchar n) uchar i; for(i=0;in;i+) delay1ms(); uchar BusyTest(void) bit result1; rs=0; rw=1; e=1; _nop_(); _nop_(); _nop_(); _nop_(); result1=bf; e=0; return result1; void WriteCommand(uchar command) while(BusyTest()=1); rs=0; rw=0; e=0; _nop_(); _nop_();P0=command;_nop_();e=1;_nop_();e=0;void WriteAddress(uchar addr) WriteCommand(addr|0x80); void WriteData(uchar d)while(BusyTest()=1);rs=1;rw=0;e=0;_nop_();P0=d;e=1;_nop_();e=0;void LcdInit(void)delay(15);WriteCommand(0x38);delay(5);WriteCommand(0x38);delay(5); WriteCommand(0x38);delay(5);WriteCommand(0x06);delay(5);WriteCommand(0x01);delay(5);WriteCommand(0x0c);delay(5);WriteCommand(0x0e);delay(5);Main.c#include#define uchar unsigned char#define uint unsigned intuchar position=0x00;uchar string30;/存放輸入的表達(dá)式uchar code warn=ERROR;uchar code num=q,7,4,1,0,8,5,2,=,9,6,3,s,k,c,j;uchar Curtime7=50,15,13,7,5,1,8;uchar opr15; /操作符int opt15; /操作數(shù)uchar iopt,iopr; /記錄操作數(shù)和操作符數(shù)組的下標(biāo)bit flag=0; /標(biāo)記是否輸入“(”操作符 循環(huán)嵌套long result=0; uchar pp; /記錄表達(dá)式的字符位置bit equal=0; /標(biāo)記是否開始計算int op=0;/用來記錄合成的數(shù)值bit normal=1;/用來記錄是否正常,正常就進(jìn)行運(yùn)算,否則停止運(yùn)算uchar operate;/用來標(biāo)記操作數(shù)和操作符的堆棧bit equalFlag=0;/用來標(biāo)記等號是否按下,按下之后為1相當(dāng)于清屏uchar shift=0; /shift鍵 sbit m1=P37; sbit m2=P36;sbit m3=P35; /用來標(biāo)識shift鍵是否按下,按下則滅uchar pzp=0;/用來保存修改狀態(tài)下等號的位置uchar WriteAddress(uchar addr);uchar WriteData(uchar d);uchar WriteCommand(uchar command);void LcdInit();uchar KeyDown(void);uchar KeyScan(void);void Init(void) int i; position=0x00; for(i=0;i30;i+) stringi=a; flag=0; pp=0; equal=0; normal=1; shift=0; opr0=0; iopt=0; iopr=0; pzp=0; op=0;void DisplayNumble(long numble) /顯示結(jié)果,把結(jié)果轉(zhuǎn)換為字符串形式在輸出 uchar numx8=a,a,a,a,a,a,a,a; uchar i=1,j=0x42; LcdInit(); WriteCommand(0x0c);/關(guān)光標(biāo)顯示 WriteAddress(0x40);WriteData(=); if(numble0) numxi=numble%10; i+; numble=numble/10; i=i-1; while(numxi!=a) WriteAddress(j+); WriteData(numxi+0x30); i-; void DisplayError(void) /顯示錯誤uchar i;i=0;normal=0;while(warni!=0)WriteAddress(0x40+i);WriteData(warni);i+;void Calculate(void)/計算int m;switch(opriopr%10)case 0:flag=1;break;case 1:m=opt-iopt+opt-iopt;optiopt+=m;break;case 2:m=optiopt-2-optiopt-1;iopt=iopt-2;optiopt+=m; break;case 3:m=opt-iopt*opt-iopt;optiopt+=m;break;case 4:m=optiopt-2/optiopt-1;if(optiopt-1=0)DisplayError();elseiopt=iopt-2;optiopt+=m; break; void InsertOpr(uchar operate)reentrantif(operate/10opriopr/10|operate=10)opr+iopr=operate;elseif(iopr!=0)Calculate();if(operate=15)iopr-;if(flag=0)InsertOpr(operate);elseflag=0; /用來使遞歸結(jié)束elseif(iopr=0)iopr+=1;opriopr=operate;uchar KeyChar(void)uchar ch; uchar n=KeyScan();if(shift!=2)switch(n) case 0:if(shift=0)ch=q; /q表示清除else ch=w;break; /w表示修改case 12:shift=(shift+1)%3;ch=m;break;case 13:if(shift=0)ch=(;else ch=);break;case 14:if(shift=0)ch=*;else ch=/;break;case 15:if(shift=0)ch=+;else ch=-;break;default:ch=numn;break;else ch=t;return ch;void WriteNum(uchar num,uchar add) /顯示數(shù)字WriteAddress(add);WriteData(num/10+0x30);WriteAddress(add+1);WriteData(num%10+0x30);void Display()WriteNum(Curtime6,0x00);WriteAddress(0x02);WriteData(-);WriteNum(Curtime4,0x03);WriteAddress(0x05);WriteData(-);WriteNum(Curtime3,0x06);WriteAddress(0x09);WriteData(D);WriteAddress(0x0a);WriteData(a);WriteAddress(0x0b);WriteData(y);WriteNum(Curtime5,0x0d);WriteNum(Curtime2,0x44);WriteAddress(0x46);WriteData(:);WriteNum(Curtime1,0x47);WriteAddress(0x49);WriteData(:);WriteNum(Curtime0,0x4a);void main(void)Init();LcdInit();while(1)switch(shift)case 0:m1=1;m2=0;m3=0;break;case 1:m1=0;m2=1;m3=0;break;case 2:m1=0;m2=0;m3=1;break;if(shift!=2) if(KeyDown()=1)uchar ch;ch=KeyChar();if(ch!=t) if(ch!=)/為按下鍵記錄表達(dá)式if(equalFlag=1) /進(jìn)行過運(yùn)算之后,再運(yùn)算則初始化Init();LcdInit();equalFlag=0;if(ch!=m&ch!=q&ch!=w) /m模式選擇、q清除鍵,w修改鍵stringpp+=ch; if(pp-pzp=1) pzp=pp;WriteAddress(position);position+=1;if(position=15)WriteCommand(0x07);Write
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教師考試申請書
- 執(zhí)行異議申請書 范本
- 貧困補(bǔ)助申請書
- 協(xié)會申請書范文
- 校園文化的內(nèi)涵與育人功能
- 銷售升職申請書范文
- 電子商務(wù)平臺的法律責(zé)任與規(guī)范管理
- 2025年度智慧交通工程力工勞務(wù)分包合作協(xié)議
- 2025年度信息科技企業(yè)高級文員聘用合同范本
- 2025年度國際貿(mào)易保險合同與理賠服務(wù)協(xié)議
- 2023-2024學(xué)年浙江省杭州市小學(xué)語文六年級上冊期末深度自測試題
- GB/T 19868.2-2005基于焊接經(jīng)驗的工藝評定
- 第一章:智能控制概論-課件
- 蘭州牛肉面攻略課件
- 機(jī)房巡檢記錄表
- 警燈、警報器使用證申請表
- (中職)電梯維護(hù)與保養(yǎng)項目九 電梯曳引系統(tǒng)的維護(hù)與保養(yǎng)教學(xué)課件
- 中國科學(xué)院率先行動計劃組織實施方案
- 園林規(guī)劃設(shè)計16_任務(wù)三-交通廣場綠地設(shè)計
- 節(jié)制閘工程施工組織設(shè)計方案
- 《新媒體廣告設(shè)計》—教學(xué)教案
評論
0/150
提交評論