單片機(jī)課程設(shè)計(jì) 計(jì)算器_第1頁(yè)
單片機(jī)課程設(shè)計(jì) 計(jì)算器_第2頁(yè)
單片機(jī)課程設(shè)計(jì) 計(jì)算器_第3頁(yè)
單片機(jī)課程設(shè)計(jì) 計(jì)算器_第4頁(yè)
單片機(jī)課程設(shè)計(jì) 計(jì)算器_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

課程設(shè)計(jì)說(shuō)明書學(xué)院名專業(yè)班學(xué)生學(xué)學(xué)生姓學(xué)生成指導(dǎo)教至格式說(shuō)明(打印版格式,手寫版不做要求)表課程設(shè)計(jì)任務(wù)書一、課程設(shè)計(jì)的任務(wù)和基本要求(一)1題,根據(jù)所選課題的具體設(shè)計(jì)要求來(lái)填寫此欄)1.系統(tǒng)通過(guò)4x4的矩陣鍵盤輸入數(shù)字及運(yùn)算符。2.可以進(jìn)行4位十進(jìn)制數(shù)以內(nèi)的加法運(yùn)算,如果計(jì)算結(jié)果超過(guò)4位十進(jìn)制數(shù),則屏幕顯示。3.可以進(jìn)行加法以外的計(jì)算乘、除、減)。4.創(chuàng)新部分:使用LCD1602液晶顯示屏進(jìn)行顯示,有開(kāi)機(jī)歡迎界面,計(jì)算數(shù)據(jù)與結(jié)果分兩行顯示,支持小數(shù)運(yùn)算。(二)基本要求1.有硬件結(jié)構(gòu)圖、電路圖及文字說(shuō)明;2.有程序設(shè)計(jì)的分析、思路說(shuō)明;3.有程序流程框圖、程序代碼及注釋說(shuō)明;4.完成系統(tǒng)調(diào)試(硬件系統(tǒng)可以借助實(shí)驗(yàn)裝置實(shí)現(xiàn),也可在Proteus5.有程序運(yùn)行結(jié)果的截屏圖片。1二、進(jìn)度安排第9周,10.30~11.510.30題目分析,文獻(xiàn)查閱10.31方案比較,確定設(shè)計(jì)方案10.31~11.1硬件電路設(shè)計(jì)11.2~11.4程序設(shè)計(jì),程序調(diào)試,系統(tǒng)聯(lián)調(diào),系統(tǒng)改進(jìn)11.5課程設(shè)計(jì)說(shuō)明書撰寫三、參考資料或參考文獻(xiàn)1.林立,張俊亮.單片機(jī)原理及應(yīng)用——基于Proteus和KeilC[M].北京:電子工業(yè)出版社,20132.張毅剛,彭喜元.單片機(jī)原理與應(yīng)用設(shè)計(jì)[M].北京:電子工業(yè)出版社,20083.馬忠梅.單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)(第5[M].北京:北京航空航天大學(xué)出版社,20134.樓然苗、李光飛.51系列單片機(jī)設(shè)計(jì)實(shí)例[M].北京:北京航空航天大學(xué)出版社,20032年月日3目錄設(shè)計(jì)論證111硬件設(shè)計(jì)2.............................................................................................................................22軟件設(shè)計(jì)77.............................................................................................................................9.............................................................................................................................設(shè)計(jì)小結(jié)附錄Ⅰ第一章設(shè)計(jì)論證1.1設(shè)計(jì)分析在方案設(shè)計(jì)過(guò)程中,我列出了兩種不同的設(shè)計(jì)方案,分別對(duì)應(yīng)于顯示模塊和單片機(jī)內(nèi)部運(yùn)算。顯示模塊在我的設(shè)計(jì)中有兩種不同的顯示方式,分別為數(shù)碼管顯示以及液晶屏顯示。LCD有眾多的接口,以及指令,因此在軟件上要比數(shù)碼管復(fù)雜。數(shù)碼管顯示的缺點(diǎn)也比較明顯,就是需要占用過(guò)多的單片機(jī)輸出接口,同時(shí),LCD使用也更加舒適。LCD1602液晶顯示芯片作為顯示模塊。若只支持整數(shù)運(yùn)算,程序設(shè)計(jì)勢(shì)必更加簡(jiǎn)單易懂,但是出于實(shí)用性的考慮,我最終決定了使計(jì)算器支持浮點(diǎn)數(shù)運(yùn)算功能。同時(shí),這也能更好地鍛煉我的編程思維能力。1.2設(shè)計(jì)方案按照系統(tǒng)設(shè)計(jì)的功能的要求,初步確定設(shè)計(jì)系統(tǒng)由主控模塊、顯示模塊、鍵盤掃描接口電路共四個(gè)模塊組成。主控芯片使用8051系列的AT89C52單片機(jī),其中帶有非易失性Flash程序存儲(chǔ)器,它是一種高性能、低功耗的8位CMOS微處理芯片,市場(chǎng)應(yīng)用最多。顯示模塊采用LCD1602液晶顯示器為主體構(gòu)成。鍵盤電路采用4x4矩陣鍵盤電路。整個(gè)單片機(jī)的接口電路:P0用于顯示輸出或LCD1602信號(hào)輸入,P1口用于鍵盤掃描輸入,P2口用于LCD1602的控制信號(hào)輸出。為了驅(qū)動(dòng)系統(tǒng)的各個(gè)模塊正常協(xié)調(diào)工作,在軟件方面我設(shè)計(jì)了四大模塊,分別為顯示、鍵盤、運(yùn)算、綜合模塊,通過(guò)綜合模塊的協(xié)調(diào)來(lái)使其它三大模塊正常運(yùn)行,使計(jì)算器能正確運(yùn)算得出正確結(jié)果。1顯示模塊系統(tǒng)的主體部分由輸入、運(yùn)算、輸出模塊所組成,對(duì)應(yīng)于圖2.1中有,輸入模塊為鍵盤掃描輸入,輸出模塊為L(zhǎng)CD1602顯示,運(yùn)算模塊為單片機(jī)。在系統(tǒng)上電后,單片機(jī)初始化,開(kāi)始運(yùn)行內(nèi)部程序,在程序運(yùn)行過(guò)程中,通過(guò)軟件功能來(lái)實(shí)現(xiàn)按下鍵盤上特)顯示。在運(yùn)算過(guò)程中顯示運(yùn)算數(shù)據(jù)及符號(hào),運(yùn)算完成后顯示運(yùn)算結(jié)果。路和晶振電路。圖2RESPACK-81D0D1D2D3D4D5D6D719183938373635343332+5V92122232425262728P2.0/A8P2.1/A9293031RSEP00P01P02P03P04P05P06P07123456781011121314151617AT89C52圖2.2.2鍵盤接口電路計(jì)算器所需按鍵有:數(shù)字鍵:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’。功能鍵:’+’,’-‘,’*’,’/’,’=’,’C(清零、小數(shù)點(diǎn))’共計(jì)16個(gè)按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行和四列的8個(gè)公共端分別接P116個(gè)按鍵進(jìn)行編碼,從而得到鍵盤的口地址,對(duì)比P1口的掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個(gè)鍵按下,從而完成鍵盤的功能。在Proteus仿真中,我直接使用元件庫(kù)所有的KEYPAD-SMALLCALC鍵盤,這種鍵盤直接實(shí)現(xiàn)了4*4鍵盤的功能,方便使用。如下圖2.4所示。P1運(yùn)算等工作。30=ON+C12345600PP圖2.2.3LCD1602顯示電路LCD1602簡(jiǎn)介:1602液晶也叫1602字符型液晶,它是一種專門用來(lái)顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位之間有一個(gè)點(diǎn)距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒芎芎玫仫@示圖形(用自定義CGRAM,顯示效果也不好)。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。1602采用標(biāo)準(zhǔn)的16腳接口,其中:第1引腳:GND為電源地第2引腳:VCC接5V電源正極第3比度最高(對(duì)比度過(guò)高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過(guò)一個(gè)10K的電位器調(diào)整對(duì)4比度)。第410時(shí)選擇指令寄存器。第5引腳:RW為讀寫信號(hào)線,高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫操作。第6引腳:E(或EN)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令。第7~14為8位雙向數(shù)據(jù)端。第15~16腳:空腳或背燈電源。第15引腳背光正極,第16引腳背光負(fù)極。特性3.3V或5V工作電壓,對(duì)比度可調(diào)內(nèi)含復(fù)位電路提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器DDRAM內(nèi)建有192個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM8個(gè)可由用戶自定義的5X7的字符發(fā)生器CGRAM特征應(yīng)用微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧,常用在袖珍式儀表和低功耗應(yīng)用系統(tǒng)中。操作控制注:關(guān)于E=H脈沖——開(kāi)始時(shí)初始化E為0,然后置E為1。圖5采用LCD1602顯示器對(duì)計(jì)算過(guò)程、結(jié)果以及提示信息進(jìn)行顯示,在仿真電路中,由于Proteus中并沒(méi)有LCD1602顯示芯片,故采用功能相似的LM016L進(jìn)行替代,其中LM016L的D0~D7三個(gè)輸入輸出端口接至單片機(jī)的P0.0~P0.7口,用來(lái)對(duì)顯示屏輸出顯示、輸出控制指令以及獲取狀態(tài)信息。LCD1單片機(jī)的P2.5~P2.7分別與LM016L的RS、RW、E端口相連,用來(lái)對(duì)顯示芯片進(jìn)行LM016L控制。以下為L(zhǎng)CD顯示電路的仿真接線圖(圖2.6)。DSE12345611圖6如圖3.1所示,系統(tǒng)啟動(dòng)后,執(zhí)行LCD初始化程序,然后調(diào)用LCD顯示程序,在屏幕上輸出歡迎信息。接下來(lái)調(diào)用鍵盤掃描處理程序,等待按鍵按下,按下任意鍵后執(zhí)行LCD清屏程序,并再次調(diào)用鍵盤掃描處理程序,等待用戶輸入數(shù)據(jù),若用戶按下數(shù)字鍵NN處理N顯示1N圖7本次設(shè)計(jì)采用模塊化設(shè)計(jì)思想,包括主程序和初始化子程序、延時(shí)子程序、輸出數(shù)子程序、換算第一個(gè)數(shù)子程序、運(yùn)算子程序、顯示結(jié)果子程序等子程序。運(yùn)行程序后,然后檢測(cè)是否有按鍵按下,如果沒(méi)有,繼續(xù)檢測(cè),如果按下,則判斷是否是加減乘除鍵被按下,如果是加減乘除被按下,則顯示相應(yīng)的字符并換算出字符前輸入的數(shù)據(jù)和字符然后檢測(cè)是否有清屏鍵按下,如果有則清屏,相應(yīng)的流程圖如圖3.1所示。一,則將輸入的數(shù)字送入第一個(gè)操作數(shù)緩存區(qū),并且清空所有響應(yīng)位。否則送入第二個(gè)操作數(shù)緩存區(qū)。其次對(duì)功能鍵的程序段進(jìn)行相應(yīng)的設(shè)計(jì)。第一次被按下,則置相應(yīng)的標(biāo)志位為一,并且將運(yùn)算鍵響應(yīng)標(biāo)志位置一,清空第二個(gè)操作數(shù)的緩存區(qū),為輸入操作數(shù)做準(zhǔn)備,如果是第二次按下則先調(diào)用運(yùn)算操作子程序,執(zhí)行上次按下的運(yùn)算鍵的運(yùn)算,置相應(yīng)的標(biāo)志位為一,并且將運(yùn)算鍵響應(yīng)標(biāo)志位置一,清空第二個(gè)操作數(shù)的緩存區(qū),為輸入操作數(shù)做準(zhǔn)備。程序上的具體實(shí)現(xiàn):在單片機(jī)上電后,執(zhí)行兩個(gè)函數(shù)LCD_dsp_string(4,0,"Welcome!")以及LCD_dsp_string(1,1,"ZCY'sCaculator")輸出歡迎信息初始化keyscan()函數(shù)判斷是否有按鍵輸入,若有則讀取按鍵,否則循環(huán)掃描,直到有按鍵按下。在獲取按鍵后,判斷按鍵是否為數(shù)字,若是,則執(zhí)行cacul(a)函數(shù),將獲取的數(shù)字保存為數(shù),然后執(zhí)行LCD單個(gè)字符顯示函數(shù)LCD_dsp_char(x,y,dat)。若按鍵不是數(shù)字,則判斷是flag標(biāo)志位置結(jié)果顯示在屏幕上,然后執(zhí)行keyscan()函數(shù),等待按下任意鍵,按下任意鍵后,再次執(zhí)行LCD數(shù)點(diǎn),并再次調(diào)用keyscan()函數(shù),獲取下一個(gè)按鍵,若不是第一次按下,則再次執(zhí)行LCD初始化程序。8YN顯YN符圖如圖3.2所示,當(dāng)主程序調(diào)用了LCD顯示程序后,首先判斷LCD是否處于忙碌狀態(tài),若是,則等待,若不是,則開(kāi)始設(shè)置顯示位置,然后判斷顯示的是單個(gè)字符還是字符串,分別實(shí)現(xiàn)對(duì)單個(gè)字符的輸出以及對(duì)字符串的輸出。之所以對(duì)單字符和字符串設(shè)置不同的顯示函數(shù),是為了實(shí)現(xiàn)程序?qū)纹瑱C(jī)資源的最優(yōu)利用,因?yàn)閱巫址徽紦?jù)一個(gè)字節(jié)的存儲(chǔ)區(qū),而字符串則至少占用兩個(gè)字節(jié)。在顯示完成后,返回主程序,繼續(xù)執(zhí)行下一步。9unsignedcharaddress;if(y==0)address=0xc0+x;write_com(address);//調(diào)用LCD顯示位置設(shè)置函數(shù),設(shè)置顯示位置//寫入待顯示數(shù)據(jù),調(diào)用LCD寫數(shù)據(jù)函數(shù)3.2.2鍵盤掃描處理子程序NY圖待,判斷P1口的值是否變化,若變化,根據(jù)變化后的值,來(lái)判斷按下的鍵值為多少;若P1口的值未發(fā)生變化,則循環(huán)掃描P1口的值,直到有按鍵按下導(dǎo)致P1口的值發(fā)生變化。在掃描到按鍵值后,將按鍵值保存在全局變量n中,以便其他函數(shù)使用、處理該值。在我編寫的程序中,例如下列程序段,我定義了一個(gè)臨時(shí)變量temp來(lái)比較該值與給定值,來(lái)判斷是否有鍵按下從而導(dǎo)致P1口的值發(fā)生變化。voidkey_scan(void)//鍵盤掃描處理子程序{unsignedchartemp;//定義臨時(shí)變量temp保存P1的值//為P1賦值,選中第一行//P1發(fā)生變化P1=0xfe;if(P1!=0xfe){delay(200);if(P1!=0xfe){//延時(shí)200us//再次判斷(消抖)temp=P1&0xf0;//判斷是哪一列switch(temp){case0xe0:n='c';break;//第一列case0xd0:n='0';break;//第二列case0xb0:n='=';break;//第三列case0x70:n='+';break;//第四列}}while(P1!=0xfe);//等待,直到按鍵松掉}……}113.2.3運(yùn)算子程序YNNNNYNswitch(fuhao)case'+':a=a+b;break;case'-':a=a-b;break;case'*':a=a*b;break;case'/':a=a/b;break;}//加//減//乘//除//計(jì)算if(a>9999)//判斷結(jié)果是否超過(guò)四位數(shù){sprintf(temp,"%s","Error");LCD_dsp_string(0,1,temp);//若結(jié)果超過(guò)四位數(shù)則輸出錯(cuò)誤信息n=17;do{key_scan();}while(n==17);write_com(0x01);a=b=0;//等待按鍵//清屏//操作數(shù)清零//操作符清空//第一個(gè)操作數(shù)fuhao=0;flag=0;i=0;j=0;dh=0;//等號(hào)清空xsd=0;//小數(shù)點(diǎn)清空f(shuō)h=0;//將各個(gè)標(biāo)志位恢復(fù)初始化}……}13第四章系統(tǒng)調(diào)試與分析4.1調(diào)試過(guò)程與結(jié)果Proteus作為軟件編寫編譯軟件,通過(guò)兩者的協(xié)調(diào),來(lái)實(shí)現(xiàn)仿真模擬。在Keil中編寫并編譯好程序后,導(dǎo)入到Proteus中,然后開(kāi)啟仿真,使單片機(jī)運(yùn)行,LCD上顯示出提示信息,如圖4.1所示。按下任意鍵后LCD清屏,如圖4.2所示。LCD1LM016LSDEDEVVVWSRRES01234567DDDDDDDD456123456WSRRE圖圖9999+1然而,我的輸出卻是一個(gè)錯(cuò)誤的計(jì)算結(jié)果,如圖4.3所示,經(jīng)過(guò)檢查后,我發(fā)現(xiàn)了程序中的錯(cuò)誤,是操作數(shù)的定義出現(xiàn)了問(wèn)題,我定義的操作數(shù)是無(wú)符號(hào)字符型,所以導(dǎo)致在計(jì)算過(guò)程中發(fā)生了溢出,最后生成了錯(cuò)誤的計(jì)算結(jié)果。然后我修改了程序,將操作數(shù)的定義改為了單精度浮點(diǎn)型,然后再次運(yùn)行。LCD1LCD1123456123456圖圖14進(jìn)行第二次運(yùn)算。4.4所示。經(jīng)過(guò)修改,結(jié)果已經(jīng)正確。最后,我猜測(cè),在我改進(jìn)程序之前,由于操作數(shù)的數(shù)據(jù)類型弄錯(cuò)了,所以可能導(dǎo)致其他運(yùn)算的結(jié)果可能也是錯(cuò)誤的。進(jìn)行第三次運(yùn)算。輸入第一個(gè)操作數(shù),我輸入的是1.25,如圖4.5所示,同時(shí),在我的設(shè)計(jì)中,將清零鍵與小數(shù)點(diǎn)鍵設(shè)置成了同一個(gè)鍵,以滿足4*4鍵盤要求。在同一個(gè)操作數(shù)中按下兩次ON/C鍵的話,會(huì)使屏幕清屏,數(shù)據(jù)清零,如圖4.2所示。然后輸入操作符,我輸入的是乘號(hào),如圖4.5所示。然后輸入第二個(gè)操作數(shù),我輸入的是352.7,如圖4.5所示,輸入等號(hào)后,在LCD的第二行輸出了計(jì)算結(jié)果,經(jīng)過(guò)驗(yàn)算,發(fā)現(xiàn)結(jié)果正確。圖RESPACK-8P03P02P01P00+5V4561230=+123456789C12344P5P6P7P000015如圖4.6所示,矩陣鍵盤的8個(gè)端口接至P1口,在按下按鍵后,按鍵對(duì)應(yīng)的行列端口均變?yōu)榈碗娖剑纱思纯膳袛喑霭聪碌氖悄膫€(gè)按鍵。如圖4.7所示,為上拉電阻,在51單片機(jī)中,P0口開(kāi)漏端口,因此需要外接上拉電阻來(lái)接負(fù)載,這樣才能正常的進(jìn)行輸入輸出的高低電平變化。4.2結(jié)果分析保證了計(jì)算結(jié)果不會(huì)超出四位數(shù),滿足了設(shè)計(jì)要求。16第五章設(shè)計(jì)小結(jié)課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn)、提出、分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程。隨著科學(xué)技術(shù)發(fā)展的日新日異,單片機(jī)已經(jīng)成為當(dāng)今計(jì)算機(jī)應(yīng)用中空前活躍的領(lǐng)域,在生活中可以說(shuō)要的。我的題目是4位加法計(jì)算器,對(duì)于我們這些實(shí)踐中的新手來(lái)說(shuō),這是一次考驗(yàn)。怎么才能找到課堂所學(xué)與實(shí)際應(yīng)用的最佳結(jié)合點(diǎn)?怎樣讓自己的業(yè)余更接近專業(yè)?怎樣讓自己的計(jì)劃更具有序性,而不會(huì)忙無(wú)一用?這都是我們所要考慮和努力的。經(jīng)過(guò)查找資料,編寫程序,加深了對(duì)單片機(jī)的了解與認(rèn)識(shí)。經(jīng)過(guò)本次的實(shí)驗(yàn)設(shè)計(jì)學(xué)習(xí),又一次深刻感受到了51單片機(jī)雖然已經(jīng)過(guò)去幾十年,現(xiàn)在也不斷地收到16位、32位低價(jià)單片機(jī)的沖擊,但仍然是一款性能優(yōu)越的單片機(jī),單習(xí)好其他高級(jí)單片機(jī)的決心和信心。本次實(shí)驗(yàn),讓我收獲很多,感謝同學(xué)的幫助,不僅加深了知識(shí)方面,更加鍛煉了動(dòng)手能力,相信以后遇到這方面問(wèn)題不再會(huì)不知所措,讓我把知識(shí)和實(shí)踐結(jié)合到一起,通過(guò)這次實(shí)踐,我了解自己的不足,C語(yǔ)言掌握的不夠,使我更加了解以后該在哪個(gè)方面補(bǔ)充的自己的不足,總體來(lái)說(shuō)本次課程設(shè)計(jì)是成功的,使我了解到更多課本上沒(méi)有的知識(shí),最后再次感謝所有幫助過(guò)我的老師和同學(xué)們。17附錄1.計(jì)算器.c#include<reg51.h>#include<stdio.h>#include<stdlib.h>unsignedcharn;floatidataa,b;//操作數(shù)1,操作數(shù)2//鍵盤掃描externvoidkey_scan(void);externvoidinit();//LCD初始化externvoidLCD_dsp_string(unsignedcharX,unsignedcharY,unsignedchar*s);//字符串顯示externvoidLCD_dsp_char(unsignedx,unsignedchary,unsignedchardat);//字符顯示externvoidwrite_com(unsignedcharcom);voidmain(){charidatatemp[16];chari=0,j=0,fuhao;//臨時(shí)存儲(chǔ)區(qū)//i,j分別為temp與LCD的數(shù)據(jù)指針bitflag=0,dh=0,fh=0,xsd=0;//flag=0:操作數(shù)1,flag=1:操作數(shù)2;dh=1時(shí)表示已輸入等號(hào);fh負(fù)號(hào);xsd小數(shù)點(diǎn)init();//小數(shù)點(diǎn)LCD_dsp_string(4,0,"Welcome!");LCD_dsp_string(1,1,"ZCY'sCaculator");//輸出歡迎信息do{key_scan();}while(n==17);write_com(0x01);while(1)//等待按鍵//清屏{18key_scan();//等待按鍵if((dh==1)&(flag==1)&(n!=17))//一次計(jì)算完畢后執(zhí)行{write_com(0x01);//清屏LCD_dsp_string(0,0,temp);//輸出上次計(jì)算的結(jié)果j=0;i=0;flag=0;fh=0;while(temp[i++]!='\0')j++;//將temp數(shù)據(jù)指針移向后一個(gè)空位,將LCD顯示指針移向下一個(gè)空位}if((i==0)&(n=='-')&(fh==0))//如果輸入的第一個(gè)數(shù)是負(fù)數(shù)則執(zhí)行{fh=1;//表示有負(fù)號(hào)//保存負(fù)號(hào)temp[0]='-';i++;LCD_dsp_char(j++,0,n);//輸出減號(hào)if(flag==0)continue;}if(((n>='0')&(n<='9')|((n=='c')&(xsd==0)))&(dh==0)){if(n=='c'){n='.';xsd=1;//防止再次按下c后繼續(xù)出現(xiàn)小數(shù)點(diǎn)}temp[i++]=n;//保存輸入的數(shù)字LCD_dsp_char(j++,0,n);//顯示并將光標(biāo)移至下一位(光標(biāo)未顯示)19}if(((n=='+')|(n=='-')|(n=='*')|(n=='/'))&((flag==0)|(dh==1)))//輸入完第一個(gè)操作數(shù)之后或者完成一次計(jì)算之后按下運(yùn)算符按鍵時(shí)執(zhí)行{flag=1;fuhao=n;temp[i]='\0';a=atof(temp);i=0;//之后輸入的操作數(shù)是第二個(gè)操作數(shù)//表示為字符串//轉(zhuǎn)換為數(shù)據(jù)dh=0;xsd=0;//之后第二個(gè)操作數(shù)中可以添加一個(gè)小數(shù)點(diǎn)switch(n){case'+':LCD_dsp_char(j++,0,n);break;case'-':LCD_dsp_char(j++,0,n);fh=0;break;case'*':LCD_dsp_char(j++,0,n);break;case'/':LCD_dsp_char(j++,0,n);break;//顯示運(yùn)算符}}if((n=='=')&(flag==1))//已輸入完第二個(gè)操作數(shù)并按下等號(hào){dh=1;temp[i]='\0';b=atof(temp);i=0;xsd=0;LCD_dsp_char(j,0,'=');switch(fuhao){//顯示等號(hào)20case'+':a=a+b;break;case'-':a=a-b;break;case'*':a=a*b;break;case'/':a=a/b;break;}//計(jì)算if(a>9999){sprintf(temp,"%s","Error");//若計(jì)算結(jié)果超過(guò)四位數(shù)則輸出錯(cuò)誤信息LCD_dsp_string(0,1,temp);n=17;do{key_scan();}while(n==17);write_com(0x01);a=b=0;//等待按鍵//清屏fuhao=0;flag=0;i=0;j=0;dh=0;xsd=0;fh=0;//恢復(fù)初始化}else{sprintf(temp,"%g",a);//輸出計(jì)算結(jié)果LCD_dsp_string(0,1,temp);}21}if(n=='c'){//按下清除鍵//清屏write_com(0x01);a=b=0;fuhao=0;flag=0;i=0;j=0;dh=0;xsd=0;fh=0;//恢復(fù)初始化}}}2.LCD1602.c#include<reg51.h>sbitlcden=P2^7;//讀寫控制輸入端//讀寫控制端sbitrw=P2^6;sbitrs=P2^5;//指令、數(shù)據(jù)選擇端//LCD內(nèi)部忙標(biāo)志//延時(shí)函數(shù)sbitbusy=P0^7;voiddelay(unsignedintm){unsignedintn;for(n=0;n<=m;n++);}voidcheck()//判斷LCD是否忙碌{do{22P0=0xff;rs=0;rw=1;lcden=0;delay(100);lcden=1;}while(busy==1);//當(dāng)busy=1,即LCD忙時(shí),等待}voidwrite_com(unsignedcharcom)//寫顯示命令{P0=com;rs=0;rw=0;lcden=0;check();lcden=1;}voidwrite_data(unsignedchardate)//寫顯示數(shù)據(jù){P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}voidinit(){//初始化LCDwrite_com(0x38);write_com(0x0c);//16x2行顯示,5x7點(diǎn)陣,8位數(shù)據(jù)接口//開(kāi)顯示,光標(biāo)不顯示、不閃爍23write_com(0x06);write_com(0x80);write_com(0x01);//光標(biāo)自增,畫面不動(dòng)//選擇第一行//清屏}voidLCD_set_xy(unsignedcharx,unsignedchary)//設(shè)置LCD顯示的位置{unsignedcharaddress;if(y==0)//y=0為第一行address=0x80+x;else//x=0為一行的第一個(gè)//設(shè)置數(shù)據(jù)指針位置//第二行address=0xc0+x;write_com(address);}voidLCD_dsp_char(unsignedx,unsignedchary,unsignedc

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論