




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、電子信息工程專(zhuān)業(yè)綜合課程設(shè)計(jì)任務(wù)書(shū)設(shè)計(jì)題目基于單片機(jī)的多功能計(jì)算器設(shè)計(jì)設(shè)計(jì)類(lèi)型應(yīng)用型導(dǎo)師姓名林澤坤史俊主要內(nèi)容及目標(biāo)使用at89c51單片機(jī)設(shè)計(jì)一個(gè)多功能計(jì)算器,主要用到矩陣鍵盤(pán),led數(shù)碼管顯示數(shù)據(jù)。要求進(jìn)行硬件、軟件系統(tǒng)設(shè)計(jì)。該計(jì)算器可以實(shí)現(xiàn)基本的計(jì)算還可以實(shí)現(xiàn)計(jì)時(shí)和倒計(jì)時(shí)的功能。要求:(1)6位數(shù)范圍內(nèi)的計(jì)算顯示(2)要有錯(cuò)誤提示具有的設(shè)計(jì)條件需要購(gòu)買(mǎi)單片機(jī)、數(shù)據(jù)緩沖器、開(kāi)關(guān)等電子元件一批。大約20元。計(jì)劃學(xué)生數(shù)及任務(wù)計(jì)劃需要3人計(jì)劃設(shè)計(jì)進(jìn)程1、從接題開(kāi)始收集資料、準(zhǔn)備設(shè)計(jì)2、第1周 畫(huà)出設(shè)計(jì)框圖,制定設(shè)計(jì)方案3、第2周 畫(huà)出電路原理圖,編寫(xiě)軟件程序;進(jìn)行實(shí)驗(yàn)、電路調(diào)試和完善,同時(shí)編寫(xiě)設(shè)
2、計(jì)報(bào)告參考文獻(xiàn)(1)跟我學(xué)用單片機(jī)肖洪兵 第2版 北京:北京航空航天大學(xué)出版社, 2008.8(2)單片機(jī)高級(jí)教程何立民 第1版北京:北京航空航天大學(xué)出版社,2006.6(3)單片機(jī)基礎(chǔ) 李廣第 第1版北京:北京航空航天大學(xué)出版社,1999.8 摘要:?jiǎn)纹瑱C(jī)的出現(xiàn)是計(jì)算機(jī)制造技術(shù)高速發(fā)展的產(chǎn)物,它是嵌入式控制系統(tǒng)的核心,如今,它已廣泛的應(yīng)用到我們生活中的各個(gè)領(lǐng)域,電子、科技、通信、汽車(chē)、工業(yè)等。我們這次設(shè)計(jì)的多功能科學(xué)計(jì)算器也是利用at89c51單片機(jī)制作而成。該計(jì)算器設(shè)計(jì)是采用c語(yǔ)言編寫(xiě),實(shí)現(xiàn)了六位數(shù)范圍內(nèi)的加、減、乘、除基本的四則運(yùn)算,此外該計(jì)算器除了具備基本的計(jì)算功能以外還具有計(jì)時(shí)和倒計(jì)
3、時(shí)的功能,也就是說(shuō)該計(jì)算器具有兩個(gè)工作模式,計(jì)算模式和計(jì)時(shí)模式,而計(jì)時(shí)模式里又包含正計(jì)時(shí)和倒計(jì)時(shí)的功能,這樣一個(gè)簡(jiǎn)易的計(jì)算器實(shí)現(xiàn)了多功能,比較實(shí)用和方便。該設(shè)計(jì)電路是采用at89c51單片機(jī)為主要控制電路,然后使用74ls245緩沖驅(qū)動(dòng)電路驅(qū)動(dòng)六位led數(shù)碼管顯示數(shù)據(jù),利用加上44矩陣鍵盤(pán)完成電路的實(shí)際操作。電路比較簡(jiǎn)單,但是很實(shí)用方便。關(guān)鍵字:at89c51 多功能 74ls245 led 矩陣鍵盤(pán)目錄1.方案論證與選擇51.1輸入模塊51.2顯示模塊:62.其他硬件電路模塊功能介紹:72.1驅(qū)動(dòng)模塊72.2主控制模塊82.3操作模塊93.軟件設(shè)計(jì)103.1主功能計(jì)算器部分103.2計(jì)時(shí)和倒
4、計(jì)時(shí)部分103.3功能按鍵103.4軟件流程圖104硬件設(shè)計(jì)124.1電路工作框圖124.2 硬件電路圖1343引腳鎖定135.電路測(cè)試結(jié)果135.1代碼提示信息135.2模式轉(zhuǎn)換電路圖145.3錯(cuò)誤提示電路圖155.4正常計(jì)算結(jié)果顯示圖156.該設(shè)計(jì)電路的改進(jìn)思想167.小結(jié)168.參考文獻(xiàn)17附錄(程序清單)17基于單片機(jī)的多功能計(jì)算器設(shè)計(jì)1.方案論證與選擇1.1輸入模塊方案一:采用獨(dú)立式按鍵作為輸入模塊,其特點(diǎn):直接用i/o口構(gòu)成單個(gè)按鍵電路,接口電路配置靈活、按鍵識(shí)別和軟件結(jié)構(gòu)簡(jiǎn)單,但是當(dāng)鍵數(shù)較多時(shí),占用i/o口較多,比較浪費(fèi)資源;其原理圖如圖1所示: 圖1 獨(dú)立的功能按鍵方案二:采用
5、矩陣式鍵盤(pán)作為輸入電路,其特點(diǎn):電路和軟件稍復(fù)雜,但相比之下,當(dāng)鍵數(shù)越多時(shí)越節(jié)約i/o口,比較節(jié)省資源。其原理圖如圖2所示: 圖2 矩陣鍵盤(pán)輸入本設(shè)計(jì)使用鍵盤(pán)輸入預(yù)置用于計(jì)算或計(jì)時(shí),按鍵較多。若采用獨(dú)立按鍵,需頻繁按鍵,為軟件設(shè)計(jì)增加負(fù)擔(dān),且操作界面不友好。若采用矩陣式按鍵,可以方便地輸入一個(gè)數(shù)值,使操作界面更具人性化,節(jié)約了寶貴的i/o口資源。通過(guò)對(duì)比,故采用方案二作為系統(tǒng)輸入模塊。1.2顯示模塊:方案一:用lcd顯示,要用lcd顯示,需要學(xué)習(xí)其專(zhuān)用的驅(qū)動(dòng)控制芯片,比如hd61203,軟件實(shí)現(xiàn)較為復(fù)雜,且lcd的價(jià)格昂貴。方案二:采用led數(shù)碼管串行靜態(tài)顯示,雖然其顯示亮度高,但是如果顯示器
6、的位數(shù)較多,需要增加鎖存器,故而靜態(tài)顯示占用i/o口線較多,cpu的開(kāi)銷(xiāo)較大。方案三:采用led數(shù)碼管并行動(dòng)態(tài)顯示,顯示亮度不及靜態(tài)顯示,但電路簡(jiǎn)單,適合于顯示位數(shù)較多的情況。表1 用led顯示器顯示十六位進(jìn)制數(shù)的字形代碼在下圖表示:字型共陽(yáng)極代碼共陰極代碼字型共陽(yáng)極代碼共陰極代碼0coh3fh990h6fh1f9h06ha88h77h2a4h5bhb83h7ch3b0h4fhcc6h39h499h66hda1h5eh592h6dhe86h79h682h7dhf8eh71h7f8h07h滅ffh00h880h7fh綜上所述,采用方案三并行動(dòng)態(tài)顯示是本設(shè)計(jì)最佳顯示方案。led數(shù)碼管顯示器由6個(gè)發(fā)
7、光二極管組成,因此也稱(chēng)之為6段led顯示器,其排列形狀如上。注:該設(shè)計(jì)電路中的6段led數(shù)碼顯示器是共陽(yáng)極的。2.其他硬件電路模塊功能介紹:2.1驅(qū)動(dòng)模塊該設(shè)計(jì)的驅(qū)動(dòng)電路是由74ls245來(lái)驅(qū)動(dòng)的。74ls245是我們常用的芯片,用來(lái)驅(qū)動(dòng)led或者其他的設(shè)備,它是8路同相三態(tài)雙向總線收發(fā)器,可雙向傳輸數(shù)據(jù)。74ls245還具有雙向三態(tài)功能,既可以輸出,也可以輸入數(shù)據(jù)。當(dāng)8051單片機(jī)的p0口總線負(fù)載達(dá)到或超過(guò)p0最大負(fù)載能力時(shí),必須接入74ls245等總線驅(qū)動(dòng)器。當(dāng)片選端/ce低電平有效時(shí),ab/ba=“0”,信號(hào)由 b 向 a 傳輸;(接收)ab/ba =“1”,信號(hào)由 a 向 b 傳輸;(
8、發(fā)送)當(dāng)/ce為高電平時(shí),a、b均為高阻態(tài)。由于p2口始終輸出地址的高8位,接口時(shí)74ls245的三態(tài)控制端/1g和/2g接地,p2口與驅(qū)動(dòng)器輸入線對(duì)應(yīng)相連。p0口與74ls245輸入端相連,/ce端接地,保證數(shù)據(jù)現(xiàn)暢通。8051的/rd和/psen相與后接dir,使得/rd或/psen有效時(shí),74ls245輸入(p0.idi),其它時(shí)間處于輸出(p0.idi)。2.2主控制模塊該設(shè)計(jì)的核心控制電路是at89c51單片機(jī)。at89c51是一種帶4k字節(jié)閃爍可編程可擦除只讀存儲(chǔ)器(fperomfalsh programmable and erasable read only memory)的低電
9、壓,高性能cmos 8位微處理器,俗稱(chēng)單片機(jī)。其引腳圖以及工作原理如下:現(xiàn)簡(jiǎn)要介紹各引腳的功能。.主電源引腳:vss-(20腳):地線vcc-(40腳):+5v電源.外接晶振或外部振蕩器引腳:xtal1-(19腳):當(dāng)采用芯片內(nèi)部時(shí)鐘信號(hào)時(shí),接外部晶振的一個(gè)引腳;當(dāng)采用外部時(shí)鐘信號(hào)時(shí),此腳應(yīng)接地。xtal1-(18腳):當(dāng)采用芯片內(nèi)部時(shí)鐘信號(hào)時(shí),接外部晶振的一個(gè)引腳;當(dāng)采用外部時(shí)鐘信號(hào)時(shí),外部信號(hào)由此腳輸入。.控制、選通或電源復(fù)用引腳:rst/vp0-(9腳):復(fù)位信號(hào)輸入;vcc掉電后,此腳可接上備用電源,在低功耗條件下保持內(nèi)部ram中的數(shù)據(jù)。ale/prog-(30腳):ale即允許地址鎖
10、存信號(hào)輸出,當(dāng)單片機(jī)訪問(wèn)外部存儲(chǔ)器時(shí)該腳的輸出信號(hào)用于鎖存p0的低8位地址,其輸出的頻率為時(shí)鐘振蕩頻率的1/6。prog為編程脈沖輸入端,當(dāng)選用8751單片機(jī)時(shí),由此腳輸入編程脈沖。/psen-(29腳):訪問(wèn)外部程序存儲(chǔ)器選通信號(hào),低電平有效,用于實(shí)現(xiàn)外部程序存儲(chǔ)器的讀操作。/ea-(31腳):ea為訪問(wèn)內(nèi)部或外部程序存儲(chǔ)器選擇信號(hào),ea=0,單片機(jī)只訪問(wèn)外部程序存儲(chǔ)器,故對(duì)8031此腳只能接地;ea1,單片機(jī)訪問(wèn)內(nèi)部程序存儲(chǔ)器,固對(duì)8051和8751此腳應(yīng)接高電平,但若程序指針pc值超過(guò)4kb(offfh)范圍,單片機(jī)將自動(dòng)訪問(wèn)外部程序存儲(chǔ)器。.多功能i/o引:p0口-(3239腳):p0
11、數(shù)據(jù)/地址復(fù)用總線端口。p1口-(18腳):p1靜態(tài)通用端口。p2口-(2128腳):p2動(dòng)態(tài)端口。p3口-(1017腳):p3雙功能靜態(tài)端口。除作i/o端口外,它還提供特殊的第二功能,其具體含義為:p3.0-(10腳)rxd:串行數(shù)據(jù)接收端。p3.1-(11腳)txd:串行數(shù)據(jù)發(fā)送端。p3.2-(12腳)int0:外部中斷0請(qǐng)求端,低電平有效。p3.3-(13腳)int1:外部中斷1請(qǐng)求端,低電平有效。p3.4-(14腳)t0:定時(shí)器/計(jì)數(shù)器0計(jì)數(shù)輸入端。p3.5-(15腳)t1:定時(shí)器/計(jì)數(shù)器1計(jì)數(shù)輸入端。p3.6-(16腳)wr:外部數(shù)據(jù)存儲(chǔ)器寫(xiě)選通,低電平有效。p3.7-(17腳)rd
12、:外部數(shù)據(jù)存儲(chǔ)器讀選通,低電平有效 2.3操作模塊該計(jì)算器的實(shí)際操作模塊如下圖所示:3.軟件設(shè)計(jì) 本作品實(shí)現(xiàn)的功能全部是由c語(yǔ)言程序編寫(xiě)實(shí)現(xiàn)。通過(guò)程序的編寫(xiě)使簡(jiǎn)單的器件實(shí)現(xiàn)豐富的功能。3.1主功能計(jì)算器部分使用雙精度類(lèi)型來(lái)存放計(jì)算器的兩個(gè)輸入數(shù)值和最后的計(jì)算結(jié)果,最大接收的輸入位數(shù)為6位,超出6位顯示報(bào)錯(cuò),并且需要清屏,然后重新輸入。該計(jì)算器只能實(shí)現(xiàn)正整數(shù)范圍內(nèi)的四則運(yùn)算。3.2計(jì)時(shí)和倒計(jì)時(shí)部分出于學(xué)習(xí)的目的,計(jì)時(shí)和倒計(jì)時(shí)采用定時(shí)器來(lái)實(shí)現(xiàn)的。雖然有點(diǎn)誤差但誤差不大基本達(dá)到要求。此外,該計(jì)算器還設(shè)有四個(gè)功能按鍵,可以輸入相應(yīng)的按鍵對(duì)應(yīng)的鍵值,進(jìn)行模式轉(zhuǎn)換或數(shù)據(jù)更改。3.3功能按鍵一開(kāi)始默認(rèn)的模式
13、是計(jì)算模式即矩陣鍵盤(pán)執(zhí)行計(jì)算模式下的功能。按功能鍵“on/c”切換到計(jì)時(shí)模式;在計(jì)時(shí)模式下按“=”功能鍵又可切換到計(jì)算模式;在計(jì)時(shí)模式下按“=”功能鍵后再按功能鍵“on/c”又可切換到倒計(jì)時(shí)模式。3.4軟件流程圖 開(kāi)始 計(jì)算器初始化是否為計(jì)算模式是否為計(jì)時(shí)模式是否為倒計(jì)時(shí)模式結(jié)束ynoynoyno執(zhí)行該模式下的操作執(zhí)行該模式下的操作執(zhí)行該模式下的操作4硬件設(shè)計(jì)4.1電路工作框圖 74ls245驅(qū)動(dòng)電路at89c51主控制電路矩陣鍵盤(pán)控制電路led顯示電路4.2 硬件電路圖43引腳鎖定p0口接驅(qū)動(dòng)器74ls245;p1口接顯示器led的段選;p2口接4*4矩陣鍵盤(pán);p3口接外部中斷0;5.電路測(cè)
14、試結(jié)果5.1代碼提示信息由于該電路可以實(shí)現(xiàn)計(jì)算、計(jì)時(shí)以及倒計(jì)時(shí)三種功能,因此,會(huì)有相應(yīng)的模式轉(zhuǎn)換提示代碼信息;此外,由于該設(shè)計(jì)電路存在設(shè)計(jì)功能有限,所以會(huì)有相應(yīng)的錯(cuò)誤提示信息,主要如下:相關(guān)顯示代碼:報(bào)告代號(hào)顯示含義1: -eor-1被除數(shù)等于0;2: -eor-2被減數(shù)小于減數(shù);3: chag-1表明從計(jì)算器模式切換到計(jì)時(shí)模式;4: chag-0表明從計(jì)時(shí)器模式切換到計(jì)算器模式;5: -pause暫停;7: -stop- 停止;8: oppose切換到倒計(jì)時(shí)模式;9: -eor-9超出可顯示的最大值。5.2模式轉(zhuǎn)換電路圖5.3錯(cuò)誤提示電路圖5.4正常計(jì)算結(jié)果顯示圖6.該設(shè)計(jì)電路的改進(jìn)思想出于
15、我們水平有限,雖然我們?cè)O(shè)計(jì)的這個(gè)計(jì)算器具有計(jì)算和計(jì)時(shí)的多功能,但是還有很多不足,例如,該計(jì)算器只能實(shí)現(xiàn)正整數(shù)的加減乘除運(yùn)算,無(wú)法實(shí)現(xiàn)小數(shù)以及負(fù)數(shù)的運(yùn)算。所以可以將該設(shè)計(jì)電路進(jìn)行擴(kuò)展,真正設(shè)計(jì)為一個(gè)多功能的科學(xué)計(jì)算器。7.小結(jié)不知不覺(jué),兩個(gè)星期的單片機(jī)實(shí)踐課程學(xué)習(xí)就結(jié)束了,在一開(kāi)始看這本書(shū)時(shí),只對(duì)這門(mén)課程有了大致的了解,但只是理論上的理解,對(duì)如何應(yīng)用卻很是模糊,有些東西還是模棱兩可,不是很明白,所以一開(kāi)始進(jìn)入實(shí)驗(yàn)室進(jìn)行設(shè)計(jì)操作時(shí),我是一頭霧水,不知道到底該怎么辦好,尤其是在程序編譯時(shí),程序經(jīng)常有錯(cuò)誤,讓我們很是頭疼郁悶,可沒(méi)辦法只好耐心慢慢找錯(cuò)誤,有時(shí)真得都快失去耐心了,可是還是不能放棄,于是我
16、們小組就在一起慢慢討論,邊看書(shū)邊做,或者請(qǐng)教老師和同學(xué),上課沒(méi)完成,課后我們還是會(huì)重新再做,直到得出正確結(jié)論,雖然花了不少時(shí)間,但至少讓我們學(xué)會(huì)了很多。這是在軟件中遇到的問(wèn)題,此外在買(mǎi)器材時(shí)也遇到一些問(wèn)題。如,本來(lái)是要去買(mǎi)我們?cè)仍O(shè)定的標(biāo)準(zhǔn)型號(hào)的器材,但是在買(mǎi)器材的過(guò)程中發(fā)現(xiàn),有些器材買(mǎi)不到,此時(shí)我們只好重新查閱資料,找具有相應(yīng)功能的元器件代替,但必須要嚴(yán)格相近,否則,會(huì)影響電路的功能。在焊接電路的時(shí)候,由于有些器件太小了如:貼片電容、貼片電阻等,所以難免會(huì)焊接錯(cuò)誤,此時(shí)我們必須不停的調(diào)試找出錯(cuò)誤,否則會(huì)導(dǎo)致整個(gè)電路的損壞。雖然,在一開(kāi)始接到這個(gè)設(shè)計(jì)任務(wù)時(shí),我們感覺(jué)挺有壓力的,擔(dān)心做不好,但是
17、團(tuán)隊(duì)的力量是不可小覷的,我們小組三人互相鼓勵(lì)學(xué)習(xí),所以我們?cè)谟懻撝幸徊讲竭M(jìn)步,最終完成了任務(wù)。當(dāng)然,我們學(xué)到的只是一些最為基礎(chǔ)的東西,還有很多東西還得深入學(xué)習(xí),進(jìn)一步加強(qiáng)??傊谶@次單片機(jī)學(xué)習(xí)中我們受益匪淺。這不僅增強(qiáng)了我們對(duì)單片機(jī)設(shè)計(jì)的興趣,更增強(qiáng)了自己的動(dòng)手能力,這要感謝老師的指導(dǎo)和同學(xué)的幫助! 電子行業(yè)是一門(mén)發(fā)展相當(dāng)迅速的行業(yè),每天都會(huì)有新的產(chǎn)品和應(yīng)用需求,所以,在學(xué)好書(shū)本知識(shí)的同時(shí)還要時(shí)時(shí)關(guān)注相關(guān)領(lǐng)域的最新動(dòng)態(tài),學(xué)會(huì)自主分析解決目前技術(shù)中存在的問(wèn)題。作為一名電子信息類(lèi)專(zhuān)業(yè)的學(xué)生,我們目前學(xué)習(xí)最好的方法就是多實(shí)踐,多設(shè)計(jì),為將來(lái)的工作作好準(zhǔn)備。8.參考文獻(xiàn)(1)跟我學(xué)用單片機(jī)肖洪兵 第2
18、版 北京:北京航空航天大學(xué)出版社, 2008.8(2)單片機(jī)高級(jí)教程何立民 第1版北京:北京航空航天大學(xué)出版社,2006.6(3)單片機(jī)基礎(chǔ) 李廣第 第1版北京:北京航空航天大學(xué)出版社,1999.8 附錄(程序清單)/*:計(jì)算器處理主程序,根據(jù)計(jì)算器的輸入狀態(tài)分派不同的函數(shù)對(duì)按鍵進(jìn)行處理。 /*:當(dāng)b_workmode=0是,若有鍵按下則調(diào)用此函數(shù)對(duì)鍵碼進(jìn)行處理。 頭文件及宏定義#include calready.h*全局變量*extern unsigned long ul_number; /lce顯示數(shù)據(jù),lcd實(shí)時(shí)顯示該數(shù)字。/extern bit b_workmode; /0-計(jì)算器模式
19、; /1-計(jì)時(shí)模式。 /定義在keyprocess.c中。unsigned char uc_modechange=0;extern bit b_lcdclean;extern unsigned char uc_reportsymbol;unsigned long ul_numberone=0; /第一個(gè)數(shù)unsigned long ul_numbertwo=0; /第二個(gè)數(shù)unsigned char uc_operator=0; /運(yùn)算符unsigned long ul_result=0; /運(yùn)算結(jié)果unsigned char uc_numpointer=1; /計(jì)算狀態(tài)/*計(jì)算器處理主函數(shù)*
20、/void vcalculator(unsigned char uckeycode)if(uckeycode=41) /判斷按鍵是不是no/c。if(uc_numpointer=1)/如果是no/c鍵則判斷手機(jī)否是狀態(tài)一。if(uc_modechange=2) /如果是狀態(tài)一則看uc_modechange是不是2。uc_modechange=0;/如果是2則計(jì)時(shí)器模式。b_workmode=1;uc_reportsymbol=3; /閃爍顯示:-chag-1。表明正在切換狀態(tài)。b_lcdclean=1;elseuc_modechange+; /如果uc_modechange不是2則加一。ul_
21、numberone=0;/清除所有數(shù)據(jù),將所有數(shù)據(jù)恢復(fù)到狀態(tài)一。ul_numbertwo=0;ul_number=0;uc_numpointer=1;elseul_numberone=0;/清除所有數(shù)據(jù),將所有數(shù)據(jù)恢復(fù)到狀態(tài)一。ul_numbertwo=0;ul_number=0;uc_numpointer=1;else/如果不是“no/c”鍵,首先將uc_modechange清零。uc_modechange=0;/switch(uc_numpointer)case 1:vcalreadyone(uckeycode); /進(jìn)入狀態(tài)一。break;case 2:vcalreadytwo(ucke
22、ycode); /進(jìn)入狀態(tài)二。break;case 3:vcalreadythree(uckeycode); /進(jìn)入狀態(tài)三。break;default:break;:計(jì)算器案件初始處理及運(yùn)算。/:在計(jì)算器模式下,對(duì)按鍵進(jìn)行響應(yīng),如清零,計(jì)算結(jié)果等/ /: -eor-1:被除數(shù)等于0;/ -eor-2:被減數(shù)小于減數(shù);/ -eor-9:超出可顯示的最大值。/*頭文件及宏定義*/*全局變量*/ extern unsigned long ul_number;extern unsigned long ul_numberone;extern unsigned long ul_numbertwo;exte
23、rn unsigned char uc_operator;extern unsigned long ul_result;extern unsigned char uc_numpointer;extern bit b_lcdclean;extern unsigned char uc_reportsymbol;bit b_zero=0;/狀態(tài)一0輸入檢測(cè),若有0輸入則置一。/*計(jì)算結(jié)果*/void vgetresult()switch(uc_operator)/*除法運(yùn)算*/case 14:if(ul_numbertwo!=0)ul_result=ul_numberone/ul_numbertwo
24、;else ul_result=0; uc_reportsymbol=1; /當(dāng)被除數(shù)等于0時(shí)顯示錯(cuò)誤代碼eor-1/b_lcdclean=1;break;/*乘法運(yùn)算*/case 24:if(ul_numberone*ul_numbertwo)999999)ul_result=0;uc_reportsymbol=9;b_lcdclean=1;/當(dāng)結(jié)果超出顯示范圍時(shí)顯示錯(cuò)誤代碼eor-9/elseul_result=ul_numberone*ul_numbertwo;break;/*減法運(yùn)算*/case 34:if(ul_numberoneul_numbertwo)ul_result=ul_n
25、umberone-ul_numbertwo;else ul_result=0;uc_reportsymbol=2; /當(dāng)被減數(shù)小于減數(shù)時(shí)顯示錯(cuò)誤代碼eor-2/b_lcdclean=1;break;/*加法運(yùn)算*/case 44:if(ul_numberone+ul_numbertwo)999999)ul_result=0;uc_reportsymbol=9;b_lcdclean=1;/當(dāng)結(jié)果超出顯示范圍時(shí)顯示錯(cuò)誤代碼eor-9/else ul_result=ul_numberone+ul_numbertwo;break;default:break;ul_number=ul_result;ul
26、_numberone=0; /恢復(fù)計(jì)算前初始狀態(tài)。ul_numbertwo=0;uc_numpointer=1;b_zero=0;/*狀態(tài)一預(yù)處理*/*將1位數(shù)字壓入第一個(gè)數(shù)字中*/void vpushone(unsigned char ucpushnum)if(ul_numberone100000)/如果數(shù)字小于6位則壓入數(shù)字,否則不執(zhí)行。ul_numberone=ul_numberone*10+ucpushnum;ul_number=ul_numberone;/*狀態(tài)一按鍵處理函數(shù)*/void vcalreadyone(unsigned char uckeycode)switch(ucke
27、ycode)/如果由數(shù)字輸入,則壓入數(shù)字一。case 11: vpushone(7);break;/7case 12: vpushone(8);break;/8case 13: vpushone(9);break;/9case 21: vpushone(4);break;/4case 22: vpushone(5);break;/5case 23: vpushone(6);break;/6case 31: vpushone(1);break;/1case 32: vpushone(2);break;/2case 33: vpushone(3);break;/3case 42: vpushone
28、(0);b_zero=1;break;/0,當(dāng)壓入數(shù)字為0時(shí),置0檢測(cè)標(biāo)志。default:/if(b_zero=0&ul_numberone=0)/如果是運(yùn)算符,則首先判斷是否有0輸入。 /如果沒(méi)有0輸入,然而數(shù)字1是0,ul_numberone=ul_result;/說(shuō)明是繼續(xù)上一次運(yùn)算,將上一次運(yùn)算結(jié)束switch(uckeycode)/賦給第一個(gè)數(shù),進(jìn)行連續(xù)運(yùn)算。case 14: uc_operator=14;uc_numpointer=2;break;/case 24: uc_operator=24;uc_numpointer=2;break;/*case 34: uc_operat
29、or=34;uc_numpointer=2;break;/-case 44: uc_operator=44;uc_numpointer=2;break;/+default: break;elseswitch(uckeycode) /如果有0輸入,則說(shuō)明是全新計(jì)算,正常進(jìn)行。/case 14: uc_operator=14;uc_numpointer=2;break;/case 24: uc_operator=24;uc_numpointer=2;break;/*case 34: uc_operator=34;uc_numpointer=2;break;/-case 44: uc_operato
30、r=44;uc_numpointer=2;break;/+default: break;break;/*狀態(tài)二預(yù)處理*/void vpushtwo(unsigned char ucpushnum)if(ul_numbertwo100000)/如果數(shù)字小于6位則壓入數(shù)字,否則不執(zhí)行。ul_numbertwo=ul_numbertwo*10+ucpushnum;ul_number=ul_numbertwo;/void vcalreadytwo(unsigned char uckeycode)switch(uckeycode)/狀態(tài)二下如果有數(shù)字輸入則將數(shù)字壓入數(shù)字二,轉(zhuǎn)到狀態(tài)三。case 11:
31、vpushtwo(7);uc_numpointer=3;break;/7case 12: vpushtwo(8);uc_numpointer=3;break;/8case 13: vpushtwo(9);uc_numpointer=3;break;/9case 21: vpushtwo(4);uc_numpointer=3;break;/4case 22: vpushtwo(5);uc_numpointer=3;break;/5case 23: vpushtwo(6);uc_numpointer=3;break;/6case 31: vpushtwo(1);uc_numpointer=3;br
32、eak;/1case 32: vpushtwo(2);uc_numpointer=3;break;/2case 33: vpushtwo(3);uc_numpointer=3;break;/3case 42: vpushtwo(0);uc_numpointer=3;break;/0 /如果有運(yùn)算符輸入則將運(yùn)算符鍵碼存儲(chǔ)在uc_operator中。case 14: uc_operator=14;break; /case 24: uc_operator=24;break; /*case 34: uc_operator=34;break; /-case 44: uc_operator=44;brea
33、k; /+default: break;/*狀態(tài)三預(yù)處理*/void vcalcontinue(unsigned char uckeycode)vgetresult();ul_numberone=ul_result;uc_operator=uckeycode;uc_numpointer=2;/void vcalreadythree(unsigned char uckeycode)switch(uckeycode) /狀態(tài)三下如果有數(shù)字輸入,則壓入數(shù)字二。case 11: vpushtwo(7);break;/7case 12: vpushtwo(8);break;/8case 13: vpus
34、htwo(9);break;/9case 21: vpushtwo(4);break;/4case 22: vpushtwo(5);break;/5case 23: vpushtwo(6);break;/6case 31: vpushtwo(1);break;/1case 32: vpushtwo(2);break;/2case 33: vpushtwo(3);break;/3case 42: vpushtwo(0);break;/0 /如果有“=”號(hào)輸入則計(jì)算結(jié)果。case 43: vgetresult();break;/= /如果有運(yùn)算符輸入則執(zhí)行繼續(xù)運(yùn)算。case 14: vcalcon
35、tinue(14);break;/case 24: vcalcontinue(24);break;/*case 34: vcalcontinue(34);break;/-case 44: vcalcontinue(44);break;/+default: break;/:按鍵處理子函數(shù)/:當(dāng)有外部中斷0時(shí)調(diào)用此函數(shù),獲得鍵碼,進(jìn)行相應(yīng)處理。/*頭文件及宏定義*/#include timer.h/*全局變量*/extern bit b_keyshock; /鍵盤(pán)防抖動(dòng)標(biāo)志位。/bit b_workmode=0; /0-計(jì)算器模式; /1-計(jì)時(shí)模式。/*按鍵處理函數(shù)主函數(shù)* */* */* voi
36、d vkeyprocess(unsigned char uckeycodetemp)if(b_workmode=1)vtimer(uckeycodetemp);/當(dāng)工作模式為計(jì)時(shí)模式時(shí)調(diào)用計(jì)時(shí)器處理函數(shù)。else vcalculator(uckeycodetemp); /當(dāng)工作模式為計(jì)算器模式時(shí)調(diào)用計(jì)算器處理函數(shù)。/*/*/*:鍵盤(pán)掃描子程序 */*:當(dāng)有外部中斷0時(shí)調(diào)用此函數(shù),使用列掃描的方式獲取鍵碼,鍵碼由2位數(shù)字組成。高位為行號(hào) */*低位為列號(hào)。 */*/*/*/* */* *頭文件及宏定義* */* */*#include #define scanport p2 /44鍵盤(pán)掃描端口,
37、低4位是行線,高4位是列線。 /采用逐列掃描的方法,無(wú)按鍵時(shí),低4位輸出1,高4位輸出0。 /當(dāng)有按鍵時(shí),高4位輸出掃描電位,低4位輸入掃描結(jié)果。/*/* */* *全局變量* */* */*unsigned char uca_linescan4=0xef,0xdf,0xbf,0x7f;/列線掃描電壓,分為第1,2,3,4根列線 /為低電平,其他為高電平。/*/* */* *函數(shù)實(shí)現(xiàn)* */* */*unsigned char uckeyscan()unsigned char uctemp=0; /掃描狀態(tài)暫存。unsigned char ucrow=0,ucline=0; /行號(hào),列號(hào)。for(ucline=0;ucline4;ucline+)/列掃描scanport=uca_linescanucline; /輸出掃描電位。uctemp=scanport&0x0f; /輸入掃描電位,并屏蔽高4位。if(uctemp!=0x0f) /判斷該列是否有按鍵按下。switch(uctemp)case 0x0e: ucrow=10;break; /如果有,則判斷行號(hào)。case 0x0d: ucrow=20;break;case 0x0b: ucrow=30;break;ca
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 通信工程光纖傳輸系統(tǒng)試題集
- 辦公室接待來(lái)賓登記表
- 攝影工作室拍攝風(fēng)格更改免責(zé)協(xié)議
- 體育場(chǎng)館運(yùn)營(yíng)與維護(hù)服務(wù)合同
- 治療協(xié)議服務(wù)合同
- 黑龍江省佳木斯市富錦市2024-2025學(xué)年九年級(jí)上學(xué)期期末生物學(xué)試題(含答案)
- 財(cái)務(wù)會(huì)計(jì)準(zhǔn)則下的財(cái)務(wù)報(bào)表編制試題
- 滑雪培訓(xùn)服務(wù)合同
- 幼兒園小班故事表演活動(dòng)解讀
- 公司新年?duì)I銷(xiāo)策略規(guī)劃與執(zhí)行方案設(shè)計(jì)
- 2024.8.1十七個(gè)崗位安全操作規(guī)程手冊(cè)(值得借鑒)
- 電影《白日夢(mèng)想家》課件
- 深度學(xué)習(xí)及自動(dòng)駕駛應(yīng)用 課件 第1章 汽車(chē)自動(dòng)駕駛技術(shù)概述
- 汽車(chē)4S點(diǎn)隱患排查治理體系(清單及排查表)
- UV數(shù)碼噴印墨水市場(chǎng)分析
- 記憶有方 過(guò)目不忘 課件
- 無(wú)人機(jī)應(yīng)用與基礎(chǔ)操控入門(mén)課件
- 2024年全國(guó)職業(yè)院校技能大賽中職組(短視頻制作賽項(xiàng))考試題庫(kù)-下(多選、判斷題)
- 口腔病歷管理制度內(nèi)容
- 三一燈塔工廠解決方案
- 四川省會(huì)計(jì)師事務(wù)所服務(wù)收費(fèi)標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論