版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 信息與通信工程學院</b></p><p><b> 簡易計算器</b></p><p><b> 目 錄</b></p><p> 一、設計任務和性能指標2</p><p><b> 1.1設計任務2</b
2、></p><p><b> 1.2性能指標2</b></p><p><b> 二.設計方案2</b></p><p> 三.系統(tǒng)硬件設計3</p><p> 3.1單片機最小系統(tǒng)3</p><p> 3.2鍵盤接口電路3</p>&
3、lt;p> 3.3數(shù)碼管顯示電路4</p><p> 3.4錯誤報警電路5</p><p> 四、系統(tǒng)軟件設計6</p><p> 4.1鍵盤掃描子程序設計6</p><p> 4.2移位子程序及結果計算子程序設計10</p><p> 4.3顯示子程序設計12</p>&l
4、t;p> 4.4主程序設計13</p><p> 五、調(diào)試及性能分析13</p><p> 5.1調(diào)試步驟13</p><p> 5.2性能分析14</p><p><b> 六、心得體會14</b></p><p><b> 參考文獻14</b>
5、;</p><p> 附錄1 系統(tǒng)硬件電路圖15</p><p> 附錄2 程序清單16</p><p> 一、設計任務和性能指標</p><p><b> 1.1設計任務</b></p><p> 印刷電路板(要求布局合理,線路清晰),繪出程序流程圖,并給出程 利用單片機及外圍接
6、口電路(鍵盤接口和顯示接口電路)設計制作一個計算器,用LED顯示計算數(shù)值及結果。</p><p> 要求用Protel 畫出系統(tǒng)的電路原理圖(要求以最少組件,實現(xiàn)系統(tǒng)設計所要求的功能),序清單(要求思路清晰,盡量簡潔,主程序和子程序分開,使程序有較強的可讀性)。</p><p><b> 1.2性能指標</b></p><p> 加法:四
7、位加法,計算結果若超過四位則顯示計算錯誤</p><p> 減法:四位減法,計算結果若小于零則顯示計算錯誤</p><p><b> 乘法:個位數(shù)乘法</b></p><p><b> 除法:整數(shù)除法</b></p><p> 有清零功能,計算錯誤報警</p><p>
8、;<b> 二.方案總體設計</b></p><p> 按照系統(tǒng)設計的功能的要求,初步確定設計系統(tǒng)由主控模塊、顯示模塊、錯誤報警模塊、鍵掃描接口電路共四個模塊組成,電路系統(tǒng)構成框圖如圖1.1所示。主控芯片使用51系列AT89C52單片機,采用高性能的靜態(tài)80C51設計,由先進工藝制造,并帶有非易失性Flash程序存儲器。它是一種高性能、低功耗的8位COMS微處理芯片,市場應用最多。<
9、;/p><p> 鍵盤電路采用4*4矩陣鍵盤電路。</p><p> 顯示模塊采用4枚共陽極數(shù)碼管和74ls273鎖存芯片構成等器件構成。</p><p> 錯誤報警電路采用5V蜂鳴器。</p><p> 系統(tǒng)選用以STC89C51單片機為主控機。通過擴展必要的外圍接口電路,實現(xiàn)對計算器的設計。</p><p>&
10、lt;b> 三.系統(tǒng)硬件設計</b></p><p> 3.1單片機最小系統(tǒng)</p><p> 單片機最小系統(tǒng)就是支持主芯片正常工作的最小電路部分,包括主控芯片、復位電路和晶振電路。</p><p> 主控芯片選取STC89C52RC芯片,因其具有良好的性能及穩(wěn)定性,價格便宜應用方便。</p><p> 晶振選取1
11、1.0592MHz,晶振旁電容選取30pF。</p><p> 采用按鍵復位電路,電阻分別選取100Ω和10K,電容選取10μF。</p><p> 以下為單片機最小系統(tǒng)硬件電路圖。</p><p> 圖3.1 單片機最小系統(tǒng)</p><p><b> 3.2鍵盤接口電路</b></p><p
12、><b> 計算器所需按鍵有:</b></p><p> 數(shù)字鍵:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’</p><p> 功能鍵:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C( 清零)’</p><p> 共計16個按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端
13、相連,四行和四列的8個公共端分別接P1.0~P1.7,這樣掃描P1口就可以完成對矩陣鍵盤的掃描,通過對16個按鍵進行編碼,從而得到鍵盤的口地址,對比P1口德掃描結果和各按鍵的地址,我們就可以得到是哪個鍵按下,從而完成鍵盤的功能。</p><p> 以下為鍵盤接口電路的硬件電路圖</p><p> 圖3.2 矩陣鍵盤內(nèi)部電路</p><p> 3.3 LCD顯示
14、模塊:</p><p> 本設計采用LCD液晶顯示器來顯示輸出數(shù)據(jù).通過D0-D7引腳向LCD寫指令字或寫數(shù)據(jù)以使LCD實現(xiàn)不同的功能或顯示相應數(shù)據(jù).</p><p> 在與單片機最小系統(tǒng)連接時,采用并行連接方式,此方式的特點是傳輸速度快。并行接口的輸入由p0.0-p0.7進行控制,傳輸信息。</p><p> LCD顯示使用了兩片極化材料,在它們之間是液體水
15、晶溶液。電流通過該液體時會使水晶重新排列,以使光線無法透過它們。因此,每個水晶就像百葉窗,既能允許光線穿過又能擋住光線。</p><p> LCD也就顯示具有直角顯示、低耗電量、體積小、還是零輻射等優(yōu)點。</p><p> 圖3.3 LCD顯示電路</p><p><b> 3.4錯誤報警電路</b></p><p&g
16、t; 錯誤報警電路就是在計算結果出現(xiàn)錯誤時或輸入數(shù)據(jù)出現(xiàn)錯誤時,發(fā)出聲音警報,提示使用者錯誤出現(xiàn)。</p><p> 這里就采用5V蜂鳴器作為報警設備,利用PNP三極管對蜂鳴器進行驅動,有P2.2對其進行控制,這樣在出現(xiàn)錯誤的同時用P2.2輸出低,就可以使蜂鳴器工作,完成報警任務。</p><p> 在編寫程序時,報警電路實現(xiàn)的功能是:當計算正常時使p2.2口輸出高電平時,蜂鳴器不會
17、響應。當計算出現(xiàn)錯誤(例如0作為被除數(shù)時)此時給p2.2輸出低電平,使蜂鳴器響應,達到報警功能。</p><p> 以下為報警電路硬件電路圖</p><p><b> 圖3.4 報警電路</b></p><p><b> 四.系統(tǒng)軟件設計</b></p><p> 首先初始化參數(shù);然后掃描鍵
18、盤看是否有鍵輸入,若有,讀取鍵碼;判斷鍵碼是數(shù)字鍵、清零鍵還是功能鍵(“+”“-”“*”“/”“=”),是數(shù)值鍵則送數(shù)碼管顯示并保存數(shù)值,是清零鍵則做清零處理,是功能鍵則又判斷是“=”還是運算鍵,若是“=”則計算最后結果并送數(shù)碼管顯示,若是其它功能鍵則不顯示。(其中里面包含了延時去抖動程序)。 </p><p><b> 圖4.1程序流程圖</b></p><
19、p> 4.1鍵盤掃描子程序設計</p><p> 要進行數(shù)據(jù)的計算就必須先進行數(shù)據(jù)的輸入,也就必須確定按鍵輸入的數(shù)值是什么,這就需要對鍵盤進行掃描,從而確定究竟是哪個鍵按下。</p><p> 對于鍵盤的掃描,既可以用行掃描也可以用列掃描,這里采用行掃描的方法來完成對鍵盤的掃描。</p><p> 行掃描就是逐行掃描鍵盤,看是哪一行有鍵按下,再通過返回
20、的鍵碼來確定究竟是哪個按鍵按下。如對第一行掃描就令P1.0為低,P1口其余為高,這樣若第一行有鍵按下,則P1口的值就會由0xfe變?yōu)槠渌?,再由這個值來確定是哪個鍵按下。</p><p> 以下為鍵盤掃描子程序的程序清單。</p><p> void keyscan() //矩陣鍵盤</p><p><b> {</b><
21、;/p><p><b> P3=0xfe;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b>&
22、lt;/p><p> Delay_1ms(10);</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p>
23、<p><b> temp=P3;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xee: key=1; break;</p><p> case 0xde: key=2; break;</p&g
24、t;<p> case 0xbe: key=3; break;</p><p> case 0x7e: key=15; break;</p><p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b></
25、p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p><b> }</b></p><p> if(key>=1&&key<=3)</p><p><b> {&l
26、t;/b></p><p> L1602_char(1,i,key + 48);</p><p><b> i++;</b></p><p> ss[b]=key;</p><p><b> b++;</b></p><p> Delay_1ms(300);&
27、lt;/p><p><b> }</b></p><p> if(key==15)</p><p><b> {</b></p><p> L1602_string(1,i++,"/");</p><p><b> e='/'
28、;;</b></p><p> A=f(ss,b);</p><p><b> b=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b>
29、</p><p><b> P3=0xfd;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b&g
30、t;</p><p> Delay_1ms(10);</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p>
31、;<p><b> temp=P3;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xed: key=4; break;</p><p> case 0xdd: key=5; break;</
32、p><p> case 0xbd: key=6; break;</p><p> case 0x7d: key=14; break;</p><p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b>&l
33、t;/p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p><b> }</b></p><p> if(key>=4&&key<=6)</p><p><b>
34、{</b></p><p> L1602_char(1,i,key + 48);</p><p><b> i++;</b></p><p> ss[b]=key;</p><p><b> b++;</b></p><p> Delay_1ms(300
35、);</p><p><b> }</b></p><p> if(key==14)</p><p><b> {</b></p><p> L1602_string(1,i++,"*");</p><p><b> e='*&
36、#39;;</b></p><p> A=f(ss,b);</p><p><b> b=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b
37、></p><p><b> P3=0xfb;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {<
38、/b></p><p> Delay_1ms(10);</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></
39、p><p><b> temp=P3;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xeb: key=7; break;</p><p> case 0xdb: key=8; break;&
40、lt;/p><p> case 0xbb: key=9; break;</p><p> case 0x7b: key=13; break;</p><p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b&g
41、t;</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p><b> }</b></p><p> if(key>=7&&key<=9)</p><p><b&g
42、t; {</b></p><p> L1602_char(1,i,key + 48);</p><p><b> i++;</b></p><p> ss[b]=key;</p><p><b> b++;</b></p><p> Delay_1ms
43、(300);</p><p><b> }</b></p><p> if(key==13)</p><p><b> {</b></p><p> L1602_string(1,i++,"-");</p><p><b> e=
44、9;-';</b></p><p> A=f(ss,b);</p><p><b> b=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }<
45、;/b></p><p><b> P3=0XF7;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {&
46、lt;/b></p><p> Delay_1ms(10);</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b>&l
47、t;/p><p><b> temp=P3;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xe7: key=10; break;</p><p> case 0xd7: key=0; break
48、;</p><p> case 0xb7: key=11; break;</p><p> case 0x77: key=12; break;</p><p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b&
49、gt;</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p><b> }</b></p><p> if(key==12)</p><p><b> {</b></
50、p><p> L1602_string(1,i++,"+");</p><p><b> e='+';</b></p><p> A=f(ss,b);</p><p><b> b=0;</b></p><p><b> }
51、</b></p><p> if(key==11)</p><p><b> {</b></p><p> L1602_string(1,i++,"=");</p><p><b> e='=';</b></p><p>
52、; A=f(ss,b);</p><p><b> b=0;</b></p><p><b> }</b></p><p> if(key==11) //=</p><p><b> {</b></p><p> H=f(ss,b);&
53、lt;/p><p><b> b=0;</b></p><p><b> switch(e)</b></p><p><b> {</b></p><p> case '+': result=A+H; break;</p><p>
54、 case '-': result=A-H; break;</p><p> case '*': result=A*H; break;</p><p> case '/': result=A/H; break;</p><p> default: result=H;</p><p><
55、;b> }</b></p><p> L1602_string(1,i++,"=");</p><p> show(result);</p><p><b> }</b></p><p> if(key==10) //清零</p><p>&l
56、t;b> {</b></p><p> wcmd(0x01);</p><p> wcmd(0x80);</p><p><b> b=0;</b></p><p><b> i=1;</b></p><p><b> k=1;<
57、/b></p><p><b> }</b></p><p> if(key==0)</p><p><b> {</b></p><p> L1602_char(1,i,key + 48);</p><p><b> i++;</b>&
58、lt;/p><p> ss[b]=key;</p><p><b> b++;</b></p><p> Delay_1ms(300);</p><p><b> }</b></p><p><b> }</b></p><p&
59、gt;<b> } </b></p><p><b> }</b></p><p> 4.2移位子程序及結果計算子程序設計</p><p> 輸入數(shù)據(jù)要存儲在一四位數(shù)組內(nèi),而我們鍵入的值是數(shù)據(jù)的高位,后鍵入的值是低位,這樣我們就需要在輸入低位數(shù)值時將高位數(shù)值從數(shù)組的低位移向數(shù)組的高位,這就是編寫移位子程序
60、的目的。</p><p> 對于結果計算子程序,包含加、減、乘、除四種運算。以加法運算為例,各種運算各有其標志位來代表計算類型,當加法標志位add=1是,就將輸入的兩個數(shù)據(jù)按照加法進行計算。</p><p> 首先將數(shù)組內(nèi)的數(shù)按照對應的位關系,將其轉化為一個十進制數(shù),這樣我們就得到了加速和被加數(shù)這樣倆個十進制數(shù),從而我們就可以簡單的將兩個數(shù)進行相加,結果就是我們所求的數(shù)值。但這個數(shù)值不
61、能直接顯示到數(shù)碼管上,我們還要對其進行處理,使其變?yōu)閷M位的四個數(shù)存入數(shù)組內(nèi),以便顯示。既通過對結果數(shù)值分別除以1000、100、10和對10取余,得到我們想要的四個數(shù),送顯示子程序顯示。其余減、乘、除的計算方法與加法的計算方法一樣,這里不再累述。</p><p> 以下為移位子程序和結果計算子程序的程序清單。</p><p> uint exp(uint m) //位數(shù)函數(shù)&l
62、t;/p><p><b> {</b></p><p><b> uint n=1;</b></p><p><b> while(m)</b></p><p><b> {</b></p><p><b> n=n
63、*10;</b></p><p><b> --m;</b></p><p><b> }</b></p><p><b> return n;</b></p><p><b> }</b></p><p>
64、uint f(uint g[],uint d)//結果函數(shù)</p><p><b> {</b></p><p> uint m=0,i,j;</p><p> for (i=0;i<d;++i)</p><p><b> {</b></p><p><
65、;b> j=d-i-1;</b></p><p> m=m+g[i]*(exp(j));</p><p> } return m;</p><p><b> }</b></p><p> uint length(uint z) //判斷得數(shù)長度函數(shù)</p><p&g
66、t;<b> {</b></p><p><b> uint n=1;</b></p><p> while(z>10)</p><p><b> {</b></p><p><b> z=z/10;</b></p><
67、p><b> n++;</b></p><p><b> }</b></p><p><b> return n;</b></p><p><b> }</b></p><p> void show(uint h) //顯示得數(shù)函數(shù)&
68、lt;/p><p><b> {</b></p><p> uint n,i,dat;</p><p> n=length(h);</p><p> for(i=n;i>0;--i)</p><p> { dat=h/(exp(i-1));</p><p>
69、 L1602_char(2,k++,dat + 48);</p><p> h=h%(exp(i-1));</p><p><b> }</b></p><p><b> }</b></p><p> 4.3顯示子程序設計</p><p> 從始至終無論是輸入的計
70、算數(shù)據(jù),還是計算后的結果值。都存儲在同一數(shù)組dat[ ]中,這樣我們只要在顯示時一直調(diào)用dat[ ]中的值,就能正確的顯示數(shù)據(jù)。</p><p> 以下為顯示子程序的程序清單。</p><p> void show(uint h) //顯示得數(shù)函數(shù)</p><p><b> {</b></p><p> u
71、int n,i,dat;</p><p> n=length(h);</p><p> for(i=n;i>0;--i)</p><p> { dat=h/(exp(i-1));</p><p> L1602_char(2,k++,dat + 48);</p><p> h=h%(exp(i-1))
72、;</p><p><b> }</b></p><p><b> }</b></p><p><b> 4.4主程序設計</b></p><p> 主程序既把以上各子程序串連成一個整體,使整個程序循環(huán)運行。而在以上程序中也已經(jīng)加入了個程序之間的連接點,首先進入程序后就
73、立即進入顯示子程序,而顯示子程序內(nèi)又調(diào)用鍵盤掃描子程序,若有鍵按下,則會跳轉到移位子程序和結果計算子程序進行相應的處理。通過計算或移位后,數(shù)組內(nèi)的值發(fā)生改變,顯示的值也會同時發(fā)生改變。之后再進行鍵盤掃描,如此反復運行,就構成了程序的整體。</p><p><b> 以下為主程序清單。</b></p><p> void main() //主函數(shù)</p
74、><p><b> {</b></p><p> L1602_init();</p><p><b> while(1)</b></p><p><b> {</b></p><p> keyscan();</p><p>
75、<b> }</b></p><p><b> }</b></p><p> 整體程序清單見附錄二。</p><p><b> 五、調(diào)試及性能分析</b></p><p><b> 5.1調(diào)試步驟</b></p><p>
76、 在焊接好器件后,先不要將芯片插在芯片座上,要先驗證先板上電源是否好用,有無短路等。接上USB電源,用萬用表測量個芯片座對應電源和地之間的電壓值,觀察電壓值是否正常。一切正常后方可將芯片插入芯片座,以繼續(xù)測試其他功能。</p><p> 將芯片插上后,對各個模塊進行調(diào)試,按鍵是否工作正常,數(shù)碼管是否顯示正常等。編寫相關部分的測試程序對其進行測試。</p><p> 各部分硬件檢測無誤
77、后,下載程序進行整體調(diào)試,一切正常后,結束調(diào)試過程。</p><p> 在具體調(diào)試時首先遇到的問題是程序無法下載進入單片機,通過將電路板接線與原理電路圖接線的對比發(fā)現(xiàn),串口芯片與單片機連接的輸入,輸出接反,重新用銅線連接后,依然無法下載程序。后找到原因是由于下載串口與設計封裝不符,用相對應的下載線可以下載。</p><p> 成功下載程序后,發(fā)現(xiàn)LCD顯示不正確,查看后發(fā)現(xiàn)有先沒有連接
78、,可能是制板時漏印,連接后顯示正常。</p><p><b> 5.2性能分析</b></p><p> 對于計算器的性能,主要的衡量指標就在于計算的精度,本次制作的計算器性能情況如下:</p><p> 加法運算:四位加法運算,和值不超過9999,若超過上限,則顯示錯誤提示E,蜂鳴器報警提示。</p><p>
79、 減法運算:四位減法運算,若結果為負,對其取絕對值。</p><p> 乘法運算:積不超過9999的乘法運算,若超出上限,顯示錯誤提示E,蜂鳴器報警提示。</p><p> 除法運算:整數(shù)除法,既計算結果為整數(shù),若除數(shù)為零,則顯示錯誤提示E,蜂鳴器報警提示。</p><p> 通過對實際性能的分析,可以得到本次設計滿足設計的要求。</p><
80、;p><b> 六、心得體會</b></p><p> 通過本次課程設計我真正的自己完成了對給定要求系統(tǒng)的硬件設計、電路設計、電路板設計、軟件設計以及對成品的調(diào)試過程。從整個過程中學習到了很多方面的知識,了解到以往學習中自己知識在某方面的不足之處,是對以往學習科目的一種貫穿和承接,從而能更好的認識和學習,也對將來從事工作大有裨益。</p><p> 在試驗
81、過程中,充分的讓理論和實踐進行了結合。實踐是檢驗真理的唯一標準,確實只有在實踐中,才能讓理論知識得以實現(xiàn),這也是工科所期望的成果,在這次試驗里,讓我們更具象的認識理論,對學習有莫大的幫助。</p><p> 從本次課設中我也看到了自身的很多不足之處,對知識的掌握不夠扎實,有一知半解的現(xiàn)象。有時做事不夠穩(wěn)定,過于毛躁,不能平心靜氣的去分析所遇到的問題和錯誤。這在以后的工作和生活中是不可取的,通過對自身問題的認識與
82、改正相信再遇到同樣問題時會更好的解決。以后的設計實驗也會更好的完成。</p><p><b> 參考文獻</b></p><p> [1] 徐維祥、劉旭敏. 單片微型機原理及應用. 大連:大連理工大學出版社,1996</p><p> [2] 李光飛、樓然苗、胡佳文、謝象佐. 單片機課程設計與實例指導. 北京: 北京航空航天大學出版社,2
83、004 </p><p> [3] 余永權. 89系列FLASH單片機原理及應用. 北京:電子工業(yè)出版社,2002</p><p> [4] 劉巖川、董玉華、劉忠富、韓志敏.單片機原理及系統(tǒng)設計.北京:電子工業(yè)出版社,2014</p><p> 附錄1 系統(tǒng)硬件電路圖</p><p><b> 附錄2 實物圖</b&g
84、t;</p><p><b> 附錄3 程序清單</b></p><p> #include<reg51.h></p><p> #include<intrins.h></p><p> #define uint unsigned int</p><p> #d
85、efine uchar unsigned char</p><p> #define ulong unsigned long</p><p> uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};</p><p> uchar i=1,j=0;&
86、lt;/p><p> uchar key,temp;</p><p><b> uchar e;</b></p><p> uint ss[8];</p><p> uint b=0,A,H,result,k=1;</p><p> sbit E=P2^3;//1602使能引腳</
87、p><p> sbit RW=P3^6;//1602讀寫引腳</p><p> sbit RS=P2^4;//1602數(shù)據(jù)/命令選擇引腳</p><p> void Delay_1ms(uint i)//1ms延時</p><p><b> {</b></p><p><b
88、> uint x,j;</b></p><p> for (j=0;j<i;j++);</p><p> for (x=0;x<=148;x++);</p><p><b> }</b></p><p> void delay()</p><p><
89、b> {</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b>&l
90、t;/p><p><b> _nop_();</b></p><p><b> }</b></p><p> bit Busy(void)</p><p><b> {</b></p><p> bit busy_flag = 0;</p&g
91、t;<p><b> RS = 0;</b></p><p><b> RW = 1;</b></p><p><b> E = 1;</b></p><p><b> delay();</b></p><p> busy_flag
92、 = (bit)(P0 & 0x80);</p><p><b> E = 0;</b></p><p> return busy_flag;</p><p><b> }</b></p><p> void wcmd(uchar del)</p><p>&
93、lt;b> {</b></p><p> while(Busy());</p><p><b> RS = 0;</b></p><p><b> RW = 0;</b></p><p><b> E = 0;</b></p><
94、p><b> delay();</b></p><p><b> P0 = del;</b></p><p><b> delay();</b></p><p><b> E = 1;</b></p><p><b> delay
95、();</b></p><p><b> E = 0;</b></p><p><b> }</b></p><p> void wdata(uchar del)</p><p><b> {</b></p><p> while(
96、Busy());</p><p><b> RS = 1;</b></p><p><b> RW = 0;</b></p><p><b> E = 0;</b></p><p><b> delay();</b></p><
97、p><b> P0 = del;</b></p><p><b> delay();</b></p><p><b> E = 1;</b></p><p><b> delay();</b></p><p><b> E = 0
98、;</b></p><p><b> }</b></p><p> void L1602_init(void)</p><p><b> {</b></p><p> wcmd(0x38);</p><p> Delay_1ms(5);</p>
99、;<p> wcmd(0x38);</p><p> Delay_1ms(5);</p><p> wcmd(0x38);</p><p> Delay_1ms(5);</p><p> wcmd(0x38);</p><p> wcmd(0x08);</p><p>
100、; wcmd(0x0c);</p><p> wcmd(0x04);</p><p> wcmd(0x01);</p><p><b> }</b></p><p> void L1602_char(uchar hang,uchar lie,char sign)</p><p><
101、b> {</b></p><p><b> uchar a;</b></p><p> if(hang == 1) a = 0x80;</p><p> if(hang == 2) a = 0xc0;</p><p> a = a + lie - 1;</p><p>
102、<b> wcmd(a);</b></p><p> wdata(sign);</p><p><b> }</b></p><p> void L1602_string(uchar hang,uchar lie,uchar *p)</p><p><b> {</b>
103、;</p><p> uchar a,b=0;</p><p> if(hang == 1) a = 0x80;</p><p> if(hang == 2) a = 0xc0;</p><p> a = a + lie - 1;</p><p><b> while(1)</b><
104、;/p><p><b> {</b></p><p> wcmd(a++);</p><p><b> b++;</b></p><p> if((*p == '\0')||(b==16)) break;</p><p> wdata(*p);</
105、p><p><b> p++;</b></p><p><b> }</b></p><p><b> }</b></p><p> uint exp(uint m) //位數(shù)函數(shù)</p><p><b> {</b>&l
106、t;/p><p><b> uint n=1;</b></p><p><b> while(m)</b></p><p><b> {</b></p><p><b> n=n*10;</b></p><p><b>
107、; --m;</b></p><p><b> }</b></p><p><b> return n;</b></p><p><b> }</b></p><p> uint f(uint g[],uint d)//結果函數(shù)</p>
108、<p><b> {</b></p><p> uint m=0,i,j;</p><p> for (i=0;i<d;++i)</p><p><b> {</b></p><p><b> j=d-i-1;</b></p><p
109、> m=m+g[i]*(exp(j));</p><p> } return m;</p><p><b> }</b></p><p> uint length(uint z) //判斷得數(shù)長度函數(shù)</p><p><b> {</b></p><p&g
110、t;<b> uint n=1;</b></p><p> while(z>10)</p><p><b> {</b></p><p><b> z=z/10;</b></p><p><b> n++;</b></p>&
111、lt;p><b> }</b></p><p><b> return n;</b></p><p><b> }</b></p><p> void show(uint h) //顯示得數(shù)函數(shù)</p><p><b> {</b>&
112、lt;/p><p> uint n,i,dat;</p><p> n=length(h);</p><p> for(i=n;i>0;--i)</p><p> { dat=h/(exp(i-1));</p><p> L1602_char(2,k++,dat + 48);</p>&l
113、t;p> h=h%(exp(i-1));</p><p><b> }</b></p><p><b> }</b></p><p> void keyscan() //矩陣鍵盤</p><p><b> {</b></p><p
114、><b> P3=0xfe;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p><
115、;p> Delay_1ms(10);</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p><p><b
116、> temp=P3;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xee: key=1; break;</p><p> case 0xde: key=2; break;</p><p>
117、 case 0xbe: key=3; break;</p><p> case 0x7e: key=15; break;</p><p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b></p><p&g
118、t;<b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p><b> }</b></p><p> if(key>=1&&key<=3)</p><p><b> {</b></p
119、><p> L1602_char(1,i,key + 48);</p><p><b> i++;</b></p><p> ss[b]=key;</p><p><b> b++;</b></p><p> Delay_1ms(300);</p><
120、;p><b> }</b></p><p> if(key==15)</p><p><b> {</b></p><p> L1602_string(1,i++,"/");</p><p><b> e='/';</b>&l
121、t;/p><p> A=f(ss,b);</p><p><b> b=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>&l
122、t;p><b> P3=0xfd;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p>
123、<p> Delay_1ms(10);</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p><p>&l
124、t;b> temp=P3;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xed: key=4; break;</p><p> case 0xdd: key=5; break;</p><p&g
125、t; case 0xbd: key=6; break;</p><p> case 0x7d: key=14; break;</p><p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b></p><
126、p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p><b> }</b></p><p> if(key>=4&&key<=6)</p><p><b> {</b><
127、;/p><p> L1602_char(1,i,key + 48);</p><p><b> i++;</b></p><p> ss[b]=key;</p><p><b> b++;</b></p><p> Delay_1ms(300);</p>
128、<p><b> }</b></p><p> if(key==14)</p><p><b> {</b></p><p> L1602_string(1,i++,"*");</p><p><b> e='*';</b>
129、;</p><p> A=f(ss,b);</p><p><b> b=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
130、<p><b> P3=0xfb;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p&g
131、t;<p> Delay_1ms(10);</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p><p&g
132、t;<b> temp=P3;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xeb: key=7; break;</p><p> case 0xdb: key=8; break;</p><
133、;p> case 0xbb: key=9; break;</p><p> case 0x7b: key=13; break;</p><p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b></p>
134、<p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p><b> }</b></p><p> if(key>=7&&key<=9)</p><p><b> {</b>
135、;</p><p> L1602_char(1,i,key + 48);</p><p><b> i++;</b></p><p> ss[b]=key;</p><p><b> b++;</b></p><p> Delay_1ms(300);</p&g
136、t;<p><b> }</b></p><p> if(key==13)</p><p><b> {</b></p><p> L1602_string(1,i++,"-");</p><p><b> e='-';</
137、b></p><p> A=f(ss,b);</p><p><b> b=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p&
138、gt;<p><b> P3=0XF7;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></
139、p><p> Delay_1ms(10);</p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> if(temp!=0xf0)</p><p><b> {</b></p><
140、p><b> temp=P3;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xe7: key=10; break;</p><p> case 0xd7: key=0; break;</p>&
141、lt;p> case 0xb7: key=11; break;</p><p> case 0x77: key=12; break;</p><p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b></p>
142、<p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p><b> }</b></p><p> if(key==12)</p><p><b> {</b></p><p&g
143、t; L1602_string(1,i++,"+");</p><p><b> e='+';</b></p><p> A=f(ss,b);</p><p><b> b=0;</b></p><p><b> }</b><
144、/p><p> if(key==11)</p><p><b> {</b></p><p> L1602_string(1,i++,"=");</p><p><b> e='=';</b></p><p> A=f(ss,b);&
145、lt;/p><p><b> b=0;</b></p><p><b> }</b></p><p> if(key==11) //=</p><p><b> {</b></p><p> H=f(ss,b);</p><
146、;p><b> b=0;</b></p><p><b> switch(e)</b></p><p><b> {</b></p><p> case '+': result=A+H; break;</p><p> case '-
147、39;: result=A-H; break;</p><p> case '*': result=A*H; break;</p><p> case '/': result=A/H; break;</p><p> default: result=H;</p><p><b> }</
148、b></p><p> L1602_string(1,i++,"=");</p><p> show(result);</p><p><b> }</b></p><p> if(key==10) //清零</p><p><b> {<
149、/b></p><p> wcmd(0x01);</p><p> wcmd(0x80);</p><p><b> b=0;</b></p><p><b> i=1;</b></p><p><b> k=1;</b></p&g
150、t;<p><b> }</b></p><p> if(key==0)</p><p><b> {</b></p><p> L1602_char(1,i,key + 48);</p><p><b> i++;</b></p><
151、;p> ss[b]=key;</p><p><b> b++;</b></p><p> Delay_1ms(300);</p><p><b> }</b></p><p><b> }</b></p><p><b>
152、} </b></p><p><b> }</b></p><p> void main() //主函數(shù)</p><p><b> {</b></p><p> L1602_init();</p><p><b> while
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計簡易計算器
- 單片機課程設計-簡易計算器
- 單片機課程設計簡易計算器
- 單片機課程設計--簡易計算器
- 課程設計---單片機簡易計算器設計
- 單片機課程設計報告---簡易計算器
- 單片機課程設計報告-簡易計算器
- 單片機課程設計--簡易數(shù)字計算器
- 簡易計算器單片機課程設計報告
- 單片機課程設計---簡易計算器的設計
- 單片機課程設計報告-- 簡易計算器設計
- 單片機課程設計--簡易計算器的設計
- 基于51單片機簡易計算器課程設計
- 單片機計算器課程設計
- 單片機課程設計--計算器
- 單片機課程設計-計算器
- 課程設計-單片機計算器
- 簡易計算器設計-單片機原理及應用課程設計
- 單片機課程設計報告--簡易計算器的設計、制作
- 單片機簡易計算器設計
評論
0/150
提交評論