版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 《單片機(jī)原理及接口技術(shù)》課程設(shè)計(jì)</p><p> 題目: 簡(jiǎn)易計(jì)算器設(shè)計(jì) </p><p> 班 級(jí): 電子1547 </p><p> 姓 名: </p>
2、<p> 學(xué) 號(hào): </p><p> 指導(dǎo)教師: </p><p> 時(shí) 間: 2013年12月 </p><p><b> 目錄</b></p><p> 一、選題的背景和意義-------
3、------------1</p><p> 1.1選題的背景-------------------------------------1</p><p> 1.2選題的意義-------------------------------------1</p><p> 二、總體設(shè)計(jì)-------------------------------1</p&g
4、t;<p> 2.1設(shè)計(jì)任務(wù)---------------------------------------1</p><p> 2.2方案選擇---------------------------------------1</p><p> 三、硬件設(shè)計(jì)-------------------------------2</p><p> 3.1
5、元器件名稱--------------------------------------------------------2</p><p> 3.2 計(jì)算器按鍵介紹--------------------------------------------------2</p><p> 3.3硬件系統(tǒng)框圖、單元電路--------------------------3</p>
6、;<p> 四、軟件設(shè)計(jì)-------------------------------3</p><p> 4.1 軟件調(diào)試步驟-----------------------------------------------------3</p><p> 4.2軟件設(shè)計(jì)流程圖------------------------------------------------
7、---4</p><p> 五、結(jié)束語(yǔ)------------------------------------5</p><p> 六、參考文獻(xiàn)--------------------------------5</p><p> 七、附錄---------------------------------------6</p><p>&
8、lt;b> 一、背景和意義</b></p><p> 1.1、選題的背景:</p><p> 當(dāng)今時(shí)代,是一個(gè)新技術(shù)層出不窮的時(shí)代。在電子領(lǐng)域,尤其是自動(dòng)化智能控制領(lǐng)域,傳統(tǒng)的分立元件或數(shù)字邏輯電路構(gòu)成的控制系統(tǒng)正以前所未見(jiàn)的速度被單片機(jī)智能控制系統(tǒng)所取代。單片機(jī)具有體積小、功能強(qiáng)、成本低、應(yīng)用面廣等優(yōu)點(diǎn),可以說(shuō),智能控制與自動(dòng)控制的核心就是單片機(jī)。目前,一個(gè)學(xué)習(xí)與
9、應(yīng)用單片機(jī)的高潮正在工廠、學(xué)校及企事業(yè)單位大規(guī)模地興起。過(guò)去習(xí)慣于傳統(tǒng)電子領(lǐng)域的工程師、技術(shù)員正面臨著全新的挑戰(zhàn),如不能在較短時(shí)間內(nèi)學(xué)會(huì)單片機(jī),勢(shì)必會(huì)被時(shí)代所遺棄,只有勇敢地面對(duì)現(xiàn)實(shí),挑戰(zhàn)自我,加強(qiáng)學(xué)習(xí),爭(zhēng)取在較短的時(shí)間內(nèi)將單片機(jī)技術(shù)融會(huì)貫通,才能跟上時(shí)代的步伐。</p><p> 1.2、選題的意義:</p><p> 單片機(jī)課程設(shè)計(jì)是單片機(jī)原理課程的實(shí)踐性環(huán)節(jié)。是在我們學(xué)習(xí)了《單片
10、機(jī)原理》等課程的基礎(chǔ)上進(jìn)行的綜合性訓(xùn)練,我們組這次訓(xùn)練的課題是基于單片機(jī)簡(jiǎn)易計(jì)算器。此次進(jìn)行的綜合性訓(xùn)練,不僅培養(yǎng)了我如何合理運(yùn)用課本中所學(xué)到的理論知識(shí)與實(shí)踐緊密結(jié)合,獨(dú)立解決實(shí)際問(wèn)題的能力。</p><p><b> 二、總體設(shè)計(jì)</b></p><p> 本設(shè)計(jì)主要是依據(jù)單片機(jī)的原理來(lái)進(jìn)行簡(jiǎn)易計(jì)算器的設(shè)計(jì),設(shè)計(jì)采用了80C51單片機(jī)作為計(jì)算器的主控制器,LM0
11、20 L作為顯示器,4×4 keypad-smallcalc鍵盤作為輸入按鍵,通過(guò)軟硬件相結(jié)合,來(lái)實(shí)現(xiàn)整數(shù)的“加”、“減”、“乘”、“除”運(yùn)算。</p><p><b> 2.1設(shè)計(jì)任務(wù) </b></p><p> 本設(shè)計(jì)主要通過(guò)單片機(jī)的原理和應(yīng)用,以電子技術(shù)基礎(chǔ)的基本理論為指導(dǎo),利用Protues仿真軟件和Keil編程軟件來(lái)設(shè)計(jì)簡(jiǎn)易計(jì)算器。&
12、lt;/p><p> 其主要設(shè)計(jì)要求有: </p><p> 1、對(duì)計(jì)算器硬件系統(tǒng)的設(shè)計(jì); </p><p> 2、運(yùn)用keil進(jìn)行計(jì)算器軟件系統(tǒng)的設(shè)計(jì); </p><p> 3、在protues仿真平臺(tái)上,對(duì)軟件進(jìn)行調(diào)試及仿真; </p><
13、p> 4、軟硬件結(jié)合之后,進(jìn)行整體電路的調(diào)試與測(cè)試。</p><p><b> 2.2 方案選擇</b></p><p><b> ?。?)方案一 </b></p><p> 根據(jù)功能和指標(biāo)要求,本系統(tǒng)選用MCS-51系列單片機(jī)AT89C51為主控機(jī)。通過(guò)擴(kuò)展必要的外圍接口電路,實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。計(jì)
14、算器電路包括三個(gè)部分:顯示電路、4*4鍵掃描電路、單片機(jī)微控制電路。用七段數(shù)碼管作為顯示電路,矩陣鍵盤作為輸入電路。</p><p><b> ?。?)方案二 </b></p><p> 根據(jù)計(jì)算器的功能要求,選擇AT89C51為主控機(jī),通過(guò)擴(kuò)展必要的外圍接/口電路,實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。外部主要由4*4矩陣鍵盤和一個(gè)液晶顯示屏構(gòu)成,內(nèi)部由一塊AT89C51
15、單片機(jī)構(gòu)成。計(jì)算器電路包括四個(gè)部分:選用LCD作為顯示部分,矩陣鍵盤作為輸入部分,運(yùn)算模塊,單片機(jī)控制部分。</p><p><b> 最終選擇方案二。</b></p><p><b> 三、硬件設(shè)計(jì)</b></p><p><b> 3.1 元器件名稱</b></p><p
16、> (1)80C51.BUS</p><p><b> (2)74LS00</b></p><p> (3)74LS373</p><p><b> (4)6264</b></p><p><b> (5)7407</b></p><p>
17、; (6)KEYPAD-SMALLCALC</p><p> 3.2 計(jì)算器按鍵介紹</p><p> 計(jì)算器所需按鍵有:數(shù)字鍵:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’ 功能鍵:’+’, ’-‘ , ’*’, ’/ ’ ,
18、60;’ = ’, ’ C( 清零)’ 共計(jì)16個(gè)按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行和四列的8個(gè)公共端分別接P1.0~P1.7,這樣掃描P1口就可以完成對(duì)矩陣鍵盤的掃描,通過(guò)對(duì)16個(gè)按鍵進(jìn)行編碼,從而得到鍵盤的口地址,對(duì)比P1口的掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個(gè)鍵按下,從而完成鍵盤掃描的功能。鍵盤電路設(shè)計(jì) 鍵盤輸入采用4*4的矩陣鍵盤。4
19、*4鍵盤分別與PC0~PC7相連。PC0~PC3作為輸入口(回送線),PC4~PC7作為輸出口(掃描線)。16個(gè)按鍵分別用于控制數(shù)字“0~9”以及數(shù)學(xué)運(yùn)算符號(hào)“+、-、*、/”。</p><p> 3.3硬件系統(tǒng)框圖、單元電路</p><p><b> 軟件設(shè)計(jì)</b></p><p> 4.1 軟件調(diào)試步驟 </p>
20、<p> 1)打開(kāi)軟件后,在Project菜單中選擇New Project命令,打開(kāi)一個(gè)新項(xiàng)目。保存此項(xiàng)目,輸入工程文件名后,并保存工程文件的目錄。</p><p> 2)為項(xiàng)目文件選擇一個(gè)目標(biāo)器件,即選擇8051的類型。在Data base 列表框中選擇“ATML 89C51”,確定。 </p><p> 上述設(shè)置好后,創(chuàng)建源程序文件并輸入程序代碼。輸入好代碼后點(diǎn)擊“文
21、件/保存”。</p><p> 4)把源文件添加到項(xiàng)目中,用鼠標(biāo)指在目標(biāo)工作區(qū)的目標(biāo)1,點(diǎn)擊右鍵在彈出的菜單中選擇添加文件到源代碼組,在彈出的添加文件框中,選擇需要添加到項(xiàng)目中的文件。 </p><p> 5)開(kāi)始編譯,對(duì)項(xiàng)目文件進(jìn)行編譯。若沒(méi)有錯(cuò)誤后進(jìn)行硬件調(diào)試。</p><p> 4.2軟件設(shè)計(jì)流程圖</p><p><b&g
22、t; 五、結(jié)束語(yǔ)</b></p><p> 課程設(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ō)得是無(wú)處不在。因此作為電子信息工程專業(yè)的學(xué)生來(lái)說(shuō)掌握單片機(jī)的開(kāi)發(fā)技術(shù)是十分重要的。 </p>&l
23、t;p> 我的題目是簡(jiǎn)易計(jì)算器,對(duì)于我們這些實(shí)踐中的新手來(lái)說(shuō),這是一次考驗(yàn)。怎么才能找到課堂所學(xué)與實(shí)際應(yīng)用的最佳結(jié)合點(diǎn)?怎樣讓自己的業(yè)余更接近專業(yè)?怎樣讓自己的計(jì)劃更具有序性,而不會(huì)忙無(wú)一用?這都是我們所要考慮和努力的。這次課程設(shè)計(jì)我學(xué)到很多很多的東西,學(xué)會(huì)了怎么樣去制定計(jì)劃,怎么樣去實(shí)現(xiàn)這個(gè)計(jì)劃,并掌握了在執(zhí)行過(guò)程中怎么樣去克服心理上的不良情緒。不僅鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書(shū)本上所沒(méi)有學(xué)到過(guò)的知識(shí),掌握了一種系
24、統(tǒng)的研究方法,可以進(jìn)行一些簡(jiǎn)單的編程。通過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。同時(shí)在設(shè)計(jì)的過(guò)程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過(guò)的知識(shí)理解得不夠深刻,掌握得不夠牢固,對(duì)單片機(jī)匯編語(yǔ)言掌握得不夠好。 這次課程設(shè)計(jì)通過(guò)我們小
25、組的努力終于順利完成了,在設(shè)計(jì)中遇到了很多編程問(wèn)題,最后在老師的辛勤指導(dǎo)下,終于迎刃而解,在此我表示感謝!同時(shí),對(duì)給過(guò)我?guī)椭乃型瑢W(xué)和指導(dǎo)老師再次表示忠心的感謝!</p><p><b> 六、參考文獻(xiàn)</b></p><p> 1、《典型模塊設(shè)計(jì)實(shí)例導(dǎo)航》編著:求是科技</p><p> 2、《基于Proteus的8051單片機(jī)實(shí)例教
26、程》主編:李學(xué)禮</p><p> 3、《單片機(jī)c語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例》主編:彭偉</p><p> 4、《單片機(jī)實(shí)訓(xùn)教程》主編:貢雪梅</p><p> 5、《Proteus教程》主編:朱清慧</p><p> 6、《單片機(jī)技術(shù)“做中學(xué)”案例教程》主編:陳石勝</p><p><b> 七、附
27、錄</b></p><p><b> 儀器名稱及數(shù)量</b></p><p><b> 顯示、乘法、除法</b></p><p><b> 加法、減法</b></p><p><b> c語(yǔ)言程序編程</b></p>&l
28、t;p> #include <reg51.h></p><p> #include <ctype.h></p><p> #include "calc.h" </p><p> static data long lvalue; </p><p> static data long r
29、value;</p><p> static data char currtoken;</p><p> static data char lasttoken; </p><p> static data char lastpress; </p><p> static xdata char outputbuffer[MAX_DIS
30、PLAY_CHAR];//輸出緩沖</p><p> //----------------------------------------------</p><p> //主程序 //------------- </p><p> void main()</p><p><b> { </b></p&g
31、t;<p><b> //變量初始化 </b></p><p> lvalue=0; </p><p> rvalue=0; </p><p> currtoken='='; </p><p> lasttoken='='; </p><
32、p><b> //初始化LCD </b></p><p> initialise(); </p><p> calc_putput(OK); </p><p> calc_evaluate();</p><p><b> } </b></p><p>
33、 //----------------------------------------- </p><p> //獲取按鍵值并進(jìn)行計(jì)算處理 </p><p> //-----------------------------------------</p><p> void calc_evaluate() </p><p><b&
34、gt; { </b></p><p> char data key; </p><p> int data i; </p><p> char xdata number[MAX_DISPLAY_CHAR]; </p><p> char xdata *bufferptr; </p><p>
35、<b> //清除緩沖 </b></p><p> for(i=0;i<=MAX_DISPLAY_CHAR;i++) number[i]=' '; </p><p> bufferptr=number; </p><p> while(1) </p><p><b&g
36、t; { </b></p><p> key=calc_getkey();</p><p> if(calc_testkey(key)) </p><p><b> { </b></p><p> if(bufferptr!=
37、&number[MAX_DISPLAY_CHAR-2]) </p><p><b> { </b></p><p> *bufferptr=key; </p><p>
38、calc_display(number); </p><p> bufferptr++; </p><p><b> } </b></p><p><b> }
39、0; </b></p><p><b> else </b></p><p><b> { </b></p><p> if(lasttoken=='0')
40、0; lvalue=calc_asciidec(number);</p><p> else rvalue=calc_asciidec(number); </p><p><b> //清除數(shù)字緩沖</b></p><p>
41、bufferptr=number; </p><p> for(i=0;i<=MAX_DISPLAY_CHAR;i++) number[i]=' '; </p><p> //處理操作符
42、0; </p><p> currtoken=key; </p><p> if(currtoken=='C') calc_opfunctions(currtoken); </p>&l
43、t;p> else calc_opfunctions(lasetoken); </p><p> //清除輸出緩沖 </p><p> for(i=0;i<=MAX_DISPLAY_CHAR;i++)
44、 outpufbuffer[i]=' '; </p><p> bufferptr=number; </p><p> if(currtoken!0x3D)
45、0;lasttoken=currtoken; </p><p><b> } </b></p><p> lastpress=key; </p><p><b> }</b></p><p><b&
46、gt; } </b></p><p> //-------------------------------------------</p><p> // 根據(jù)運(yùn)算符按鍵進(jìn)行運(yùn)算處理</p><p> //--------------------------------------------
47、;void calc_opfunctions (char token)</p><p><b> { </b></p><p> char data result; </p><p> switch(token)</p><p>&l
48、t;b> { </b></p><p> case '+':if(currtoken=='='||isdigit(lastpress)) </p><p><b> { </b></p><p> lvalue+=rvalu
49、e; </p><p> result=calc_chkerror(lvalue); </p><p><b> } </b></p><p> else result=SLEEP; </p><p><b> break;
50、60; </b></p><p> case '-':if(currtoken=='='||isdigit(lastpress)) </p><p><b> { </b></p><p> Lvalue-=rvalue
51、; </p><p> result=calc_chkerror(lvalue); </p><p><b> } </b></p><p> else result=SLEEP; </p><p><b>
52、 break; </b></p><p> case '*':if(currtoken=='='||isdigit(lastpress)) </p><p><b> { </b></p><p> lva
53、lue*=rvalue; </p><p> result=calc_chkerror(lvalue); </p><p><b> } </b></p><p> else result=SLEEP; </p><p><
54、b> break; </b></p><p> case '/':if(currtoken=='='||isdigit(lastpress)) </p><p><b> {</b></p><p> if (rvalue)</p>
55、<p><b> { </b></p><p> lvalue/=rvalue; </p><p> result=calc_chkerror(lvalue); </p><p><b> }
56、;</b></p><p> else result=SLEEP; </p><p><b> }</b></p><p> else result=SLEEP; </p><p><b> break; </b></p>
57、<p><b> //取消 </b></p><p> case 'C':lvalue=0; rvalue=0; currtoke
58、n='0'; lasttoken='0'; </p><p> result=OK; </p><p><b> break
59、; </b></p><p> default:result=SLEEP;</p><p><b> }</b></p><p> calc_output(result);</p><p><b> } </b></p><p> /
60、/--------------------------------------------------------</p><p> // 檢查待顯示數(shù)據(jù)的上界和下界</p><p> // 例如,99999999 and -99999999 </p><p>
61、//--------------------------------------------------------</p><p> int calc_chkerror (long num)</p><p><b> { </b></p><p> if(num>=-99999999&
62、;&num<=99999999) return OK; else return ERROR;</p><p><b> } </b></p><p> //--------------------------------
63、---------------------------</p><p> // 根據(jù)操作狀態(tài)輸出 </p><p> //----------------------------------------------------------</p><p> void calc_output {int status}&
64、lt;/p><p> - { switch(status)</p><p><b> { </b></p><p> case OK:calc_deaplay(calc_decascii(lvalue)); break;&
65、#160; </p><p> case SLEEP: break; </p><p> case ERROR:calc_display("Exception"); break; </
66、p><p> default:calc_display("Exception") break; </p><p><b> } </b></p><p><b> } </b></p&
67、gt;<p> //----------------------------------------------------</p><p> //將ASCII字符串轉(zhuǎn)換為浮點(diǎn)數(shù) </p><p> //----------------------------------------------------</p><p> long
68、 calc_asciidec (char *buffer)</p><p><b> {</b></p><p> long data value; </p><p> long data digit; </p><p>&l
69、t;b> value=0; </b></p><p> while(*buffer!=' ')</p><p><b> { </b></p><p> digit=*buffer-'0'; </p><p>
70、 value=value*10+digit; </p><p><b> buffer++;</b></p><p><b> } </b></p><p> return value;</p><p><b> } </b>&l
71、t;/p><p> //----------------------------------------------------</p><p> //將浮點(diǎn)數(shù)轉(zhuǎn)換為ASCII字符串 </p><p> //---------------------------------------------------- </p><
72、p> char *calc_decascii(long num)</p><p><b> {</b></p><p> long data temp=num;</p><p> char xdata *avvayptr=&outputbuffer[MAX_DIS
73、PLAY_CHAR]; </p><p> long data divisor=10;</p><p> long data result; </p><p> char data remainder,asciival; </p><p> in
74、t data i; </p><p> //如果計(jì)算結(jié)果為0。,則在緩沖中插入0并結(jié)束</p><p> if(!temp) </p><p><b> { </b></p><p> *arrayptr='0';
75、; goto done; </p><p><b> } </b></p><p> if(temp<0) //處理負(fù)數(shù)</p><p><b> { </b></p><p> outputbuffer[0]=&
76、#39;-'; temp-=2*temp;</p><p><b> } </b></p><p> for(i=0;i<sizeof(outputbuffer);i++) </p><p><b> { </b></p>&
77、lt;p> remainber=temp%divisor; </p><p> result=temp/divisor; </p><p> if((!remainder)&&(!result)) *arrayptr=' '; </
78、p><p><b> else </b></p><p><b> { </b></p><p> asciival=remainder+'0'; </p><p> *arrayptr=asciiva
79、l; </p><p><b> } </b></p><p> temp/=10; </p><p> //為“—”號(hào)保留位置 </p><p> if(arrayptr!=&outputbuffer[1]) arra
80、yptr--; </p><p><b> } </b></p><p> done:return outputbuffer;</p><p><b> } </b></p><p> //-------------------------
81、----------------------- </p><p> //測(cè)試按鍵時(shí)數(shù)字還是操作符,如果是數(shù)字則返回1.是操作符時(shí)返回0 </p><p> //------------------------------------------------ </p><p> char calc_testkey
82、;(char key)</p><p><b> {</b></p><p> if(isdigit(key)) return 1; else teturn 0;</p><p><b> } <
83、;/b></p><p> //------------------------------------------------ </p><p> //調(diào)用input例程搜索按鍵,并返回按鍵的ASCII碼值</p><p> //------------------------------------------------ <
84、;/p><p> char calc_getkey()</p><p><b> { </b></p><p> char data mykey; </p><p><b> do</b></p><p><b>
85、; { </b></p><p> mykey=input(); </p><p> } while(mykey==0);</p><p> return mykey;</p><p><b> } </b></p><
86、;p> //------------------------------------------------ </p><p> //調(diào)用Output和Clearscreen例程向LCD輸出ASCII</p><p> //------------------------------------------------ </p><p&g
87、t; void calc_display (char buf[MAX_DISPLAY_CHAR]) </p><p><b> { </b></p><p> int data i=0;</p><p> clearscreen(); </p>
88、<p> for(i;i<=MAX_DISPLAY_CHAR;i++) </p><p><b> { </b></p><p> if(buf[i]!=' ') output(buf[i]); </p><p><
89、;b> }</b></p><p><b> } </b></p><p> //----------------------calc.h---------------------</p><p><b> //本例頭文件 </b></p><p>
90、//-------------------------------------------------</p><p> typedef unsigned short WORD;</p><p> typedef unsigned char BYTE; </p><p> //-
91、----------------------------------------------- </p><p> //定義適合屏幕顯示的ASCII字符的最大個(gè)數(shù)</p><p> //------------------------------------------------</p><p> #define MAX_DISPLAY_
92、CHAR 9 </p><p> //------------------------------------------------</p><p><b> //錯(cuò)誤處理狀態(tài) </b></p><p> //------------------------------------------------&
93、#160;</p><p> enum ERROR {OK=0,SLEEP=1,ERROR=2};</p><p> //------------------------------------------------</p><p><b> //函數(shù)聲明 </b></p><p>
94、 //------------------------------------------------</p><p> void calc_evaluate(); </p><p> void calc_opfunctions (char token); </p><p> char&
95、#160;calc_testkey (char ch); </p><p> long calc_asciidec (char *buffer);</p><p> char *calc_decascii (long num);</p><p
96、> int calc_chkerror (long num);</p><p> void calc_output (int status);</p><p> char calc_getkey(); </p><p> void calc
97、_display(char buf[MAX_DISPLAY_CHAR]); </p><p> void initialise();</p><p> char input(); </p><p> char output(char ch);</p><p> vo
98、id clearscreen; </p><p> //---------------------------lcd.c-------------------------</p><p> //單行液晶顯示程序 </p><p> //------------------------------------------------
99、--------- </p><p> #include<reg51.h></p><p> #include<absacc.h> </p><p> #define uchar unsigned char </p><p> #define
100、;LCD_CMD_WR 0x00</p><p> #define LCD_DATA_WR 0x01</p><p> #define LCD_BUSY_RD 0x02</p>&
101、lt;p> #define LCD_DATA_RD 0x03</p><p> #define LCD_PAGE 0x80 </p><p> #define LCD_CLS &
102、#160; 1</p><p> #define LCD_HOME 2</p><p> #define LCD_SET
103、MODE 4 </p><p> #define LCD_SETVISIBLE 8</p><p> #define LCD_SHIFT
104、; 16 </p><p> #define LCD_SETFUNCTION 32</p><p> #define LCD_SETCGADDR 64</p><p> #define LCD_S
105、ETDDADDR 128</p><p> sbit bflag=ACC^7;//忙標(biāo)志位 </p><p> void wrcmd(uchar); </p><p> void output(char);</p><p> void
106、60;busywait(); </p><p> //------------------------------------------------</p><p><b> //初始化LCD </b></p><p> //----------------------------------------------
107、-- </p><p> void initialise() </p><p><b> { </b></p><p> wrcmd(0x30); //1行8位</p><p> wrcmd(LCD_SETVISIBLE+4);
108、 //顯示開(kāi),關(guān)光標(biāo) </p><p> wrcmd(LCD_SETDDADDR+15); //從右邊開(kāi)始顯示 </p><p> wrcmd(LCD_SETMODE+3); // 遞增左移</p><p><b&
109、gt; } </b></p><p> //------------------------------------------------</p><p> //清屏并將顯示位置起點(diǎn)設(shè)置在最右邊</p><p> //------------------------------------------------ </
110、p><p> void clearscreen()</p><p><b> {</b></p><p> wrcmd(LCD_CLS); </p><p> wrcmd(LCD_SETDDADDR+15); </p><p><b&
111、gt; } </b></p><p> //------------------------------------------------</p><p> //向LCD寫命令 </p><p> //------------------------------------------------</p>&l
112、t;p> void wrcmd(uchar cmd)</p><p><b> { </b></p><p> uchar volatile pdata *p=LCD_CMD_WR; </p><p> P2=LCD_PAGE; </p>
113、<p><b> *p=cmd;</b></p><p> //上面三行可用下面的代碼替換 </p><p> //XBYTE[0x8000]=cmd; </p><p> busywait(); } </p><p> //-----------------
114、-------------------------------</p><p> //向LCD寫一個(gè)字符 </p><p> //------------------------------------------------</p><p> void output(char ch)</p><p>&l
115、t;b> {</b></p><p> char volatile pdata *p=LCD_DATA_WR; </p><p> P2=LCD_PAGE; </p><p><b> *p=ch; </b></p><p> //上
116、面三行可用下面的代碼替換 </p><p> //XBYTE[0x8001]=ch; </p><p> busywait();</p><p><b> } </b></p><p> //----------------------------------------------
117、--</p><p><b> //忙等待 </b></p><p> //------------------------------------------------</p><p> void busywait()</p><p><b> { </b>
118、</p><p> uchar volatile pdata *p=LCD_BUSY_RD; </p><p> P2=LCD_PAGE; </p><p> //上面兩行可改成:</p><p> //uchar volatile pdata
119、;*p=0x8002; </p><p><b> Do</b></p><p><b> { </b></p><p><b> ACC=*p; </b></p><p> } while(bflag==1);</p>
120、;<p> //上述所有代碼也可用以下代碼替換</p><p><b> /* </b></p><p><b> do </b></p><p><b> { </b></p><p> ACC=XBYTE[0
121、x8002];</p><p> } while(bflag==1); </p><p><b> */</b></p><p><b> } </b></p><p> //------------------keypad.c-----
122、-------------- </p><p> //鍵盤掃描函數(shù)char input();返回按鍵的ASCII碼</p><p> //---------------------------------------------</p><p> #include<reg51.h> </p><p&
123、gt; #include<intrins.h> </p><p> char code keycodes[]=</p><p><b> {</b></p><p> '7','8','9','/',</p>
124、<p> '4','5','6','*',</p><p> '1','2','3','-', </p><p> 'C','0','=','+' </p
125、><p><b> }; </b></p><p> char data keyflags[16]; </p><p> //------------------------------------------------</p><p> //獲取鍵盤按鍵子程序 &
126、lt;/p><p> //------------------------------------------------</p><p> char input()</p><p><b> { </b></p><p> char *pKeyflag=keyflags; &
127、#160; //標(biāo)識(shí)按鍵指針 </p><p> char RowAddr=0xef; //鍵盤行
128、地址1110 1111 </p><p> char ColData=0; //列數(shù)據(jù)
129、</p><p> char i,j,Tmp=0; </p><p> for(i=0;i<4;i++) </p><p><b> { </b></p><p> P2=RowAddr; //在P2端口設(shè)置行地址
130、0; </p><p> _nop_(); </p><p> Tmp=P1&0x0f; //從P1端口讀取列數(shù)據(jù) </p><p> for(j=0;j<4;j++) </p><p><b> { &
131、#160; </b></p><p> ColData=Tmp; //保存當(dāng)前列數(shù)據(jù) </p><p> if((Tmp&0x01)==0x00) //如果有鍵按下 </p>
132、<p><b> { </b></p><p> Tmp=*pKeyflag;</p><p> *pKeyflag=1; //標(biāo)識(shí)按鍵&
133、#160; </p><p> if(Tmp==0) //有新按鍵按下 </p
134、><p><b> { </b></p><p> P2=0xff; </p><p> return keycodes[pKeyflag-keyflags];</p><p><b> }
135、160; </b></p><p><b> } </b></p><p> else *pKeyflag=0; </p><p> pKeyflag++; </p><p> T
136、mp=ColData>>1; </p><p><b> } </b></p><p> RowAddr<<=1;</p><p><b> } </b></p><p><b> P2=0xff; <
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)報(bào)告-簡(jiǎn)易計(jì)算器
- 簡(jiǎn)易計(jì)算器單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告-- 簡(jiǎn)易計(jì)算器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)-簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)簡(jiǎn)易計(jì)算器
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易計(jì)算器
- 課程設(shè)計(jì)---單片機(jī)簡(jiǎn)易計(jì)算器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易數(shù)字計(jì)算器
- 單片機(jī)課程設(shè)計(jì)---簡(jiǎn)易計(jì)算器的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)易計(jì)算器的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--簡(jiǎn)易計(jì)算器的設(shè)計(jì)、制作
- 基于51單片機(jī)簡(jiǎn)易計(jì)算器課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---計(jì)算器
- 簡(jiǎn)易計(jì)算器設(shè)計(jì)-單片機(jī)原理及應(yīng)用課程設(shè)計(jì)
- 課程設(shè)計(jì)-單片機(jī)計(jì)算器
- 單片機(jī)計(jì)算器課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--計(jì)算器
- 單片機(jī)課程設(shè)計(jì)-計(jì)算器
評(píng)論
0/150
提交評(píng)論