基于AVR單片機(jī)的計算器程序_第1頁
基于AVR單片機(jī)的計算器程序_第2頁
基于AVR單片機(jī)的計算器程序_第3頁
基于AVR單片機(jī)的計算器程序_第4頁
基于AVR單片機(jī)的計算器程序_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、#in clude<avr/io.h>#include<util/delay.h>/延時函數(shù)的頭文件#include<avr/interrupt.h> / 中斷函數(shù)的頭文件#define uint unsigned int#define uchar unsigned chardefine BIT(k) (1«k)/利用上ICC軟件的優(yōu)點define DI PORTC/夜晶的數(shù)據(jù)輸入端define No_key 255沒有按鍵按下的返回值define key_port PORTD /鍵盤輸入define keyddr DDRDdefine key_p

2、in PIND/宏定義方便以后程序移植define lone_key_port PORTB/獨立鍵盤接口用于輸入小數(shù)點define lone_key_ddr DDRBdefine lone_key_pin (PINB&BIT(0) /讀取獨立鍵盤接口的電平define rs_O PORTA&=BIT(0) /RS 復(fù)位define rs.1 PORTA|=BIT(0) /RS 萱位define en_0 PORTA&=BIT /使能端復(fù)位#defineen_1 PORTA|=BIT(1) /使能端萱位const uchar tablei You are welcome!

3、”; / 初始顯示字符const uchar table2TERROR!"出錯提示字符uchara7=0,0,0,0,0,0,0,b11=0,0,0,0,0,0,0,a15=0,0,0,0,0,b1 5=0,0,0,0,0;/用來存儲輸入的兩個數(shù)字,位數(shù)不可超過10位uchar aa,bb,cc,dd;用來記數(shù)輸入的位數(shù)uchar sym;/用來保存符號uchar flag;/起動標(biāo)志uchar fuhao; /符號標(biāo)志uchar deflagl ; /小數(shù)點標(biāo)志uchar deflag2 ; /小數(shù)點標(biāo)志uchar overflag; /數(shù)值溢出標(biāo)志uchar allov/flag

4、=1; /符號允許標(biāo)志,用于禁止連續(xù)兩個符號的輸出uchar negative;/負(fù)數(shù)標(biāo)志,當(dāng)是負(fù)數(shù)要作相應(yīng)的處理long temp3,temp4; 計算的數(shù)值得數(shù)用其中一個變量存儲即可,不用再浪費(fèi)存開辟其他 變重float tempi, temp2;const unsigned char key_table16=7, 8, 9, 10,4, 5, 6, 11,1,2, 3, 12, 50,0, 21,13;/鍵盤編碼可根據(jù)具體情況而設(shè)定端口初始化/夜晶初始化/定時器初始化void portjnit(); void devicejnit(); void time_init();void wri

5、ght_(uchar );void v/right_data(uchar date); void lcd_handle(uchar temp);么,不該顯不什么uchar keyscan();void judgechar(uchar t);void decimal(uchar de);能連續(xù)出現(xiàn)/夜晶寫指令函數(shù)/夜晶寫數(shù)據(jù)函數(shù)夜晶顯示處理,該顯示什/鍵盤掃描/判斷字符為符號還是數(shù)字/判斷是不是小數(shù)點,只能出現(xiàn)兩個小數(shù)點,旦不void reset() ;/復(fù)位函數(shù)void calculate(void); /對數(shù)值進(jìn)行計算 void result(long value);/顯示結(jié)果void fl

6、ow_clew() ; /溢出提示函數(shù)int main()portjnit(); devicejnit(); time_init(); /初始化 while flow_clew() ;/溢出提示函數(shù),一旦掃描到出錯就會顯示錯誤*中斷服務(wù)程序*總結(jié)資料volatile unsigned int i;/中斷服務(wù)程序中要使用全局變量,且要加volatileSIGNAL(SIG_OVERFLOWO)TCNTO=2O5; /重裝初值 i=keyscan();/返回鍵盤掃描值if(i!=No_key) /確認(rèn)有按鍵按下 if(i=50)wright_(0x01) ;/清顯示_delay_ms(10);延時

7、等待清屏指令完成wrighC(0x80);wright_data(O); /重新顯示 0reset();flag=1; / 標(biāo)志起動/初始化if (i< 50&&f lag)/條件為已經(jīng)啟動而旦輸入的是有效字符judgechar(i);decimal(i);lcd_handle(i);if(i=21)wright_data(v);calculate。; result(temp1);/判斷是不是操作符,要是則要作相應(yīng)的處理/判斷是不是小數(shù)點輸入,要是則要作相應(yīng)的處理/對輸入的數(shù)據(jù)進(jìn)行合理存儲并加以顯示/按下了等號鍵/顯示等號/計算數(shù)值/拆分?jǐn)?shù)值后顯示結(jié)果環(huán)”環(huán)定時器初始化“

8、黃”環(huán)”void timenit()TCNT0=205; /初值 255-205=50 50 微秒TIMSK|=(1«TOIEO);sei(); /開啟總中斷TCCRO|= (1«CS01);/8 分頻 8M/8=1M廣端口初始化void portjnit()DI=Oxff;DDRA| 二 BIT(O);DDRA|二BIT;/輸出狀態(tài)Ion e_key_ddr&=-BIT(O);lone_key_port|=BIT(0); /獨立鍵盤接口設(shè)萱為輸入,并打開上拉電阻DDRD=O;/全部設(shè)為輸入,有個上拉電阻,可以輸入高電平DDRB 二 Oxff;void device

9、 J n 讓()0x0c不顯示光標(biāo) OxOe光標(biāo)不閃,OxOf光標(biāo)en_O; /使能端拉低 wnght_(0x38); 初始化格式 wright_(OxOc) ; /OxOe 打開光標(biāo) 閃v/right_(OxO1) ;/清顯示wright_(0x80);for(i=0;i<17;i+)v/right_data(table1 i);_delay_ms(20);嚴(yán)"夜晶寫入指令的函數(shù)+void v/right_(uchar )rs_O; 低電平時寫指令Dl=;_delay_ms ; enJ;_delay_ms ; en_O;/祕決夜晶寫入數(shù)據(jù)的函數(shù)*/ void v/right_

10、data(uchar data)rs_1; /高電平時寫數(shù)據(jù) Dl=data;_delay_ms ; enJ;_delay_ms ; en_O;廠*4x4矩陣鍵盤及一個獨立鍵盤的掃描函數(shù)*/uchar keyscan (void)unsigned char temp,tempi,key,row,column;key_ddr = OxOf;/高四位輸入列線/低四位輸出到行線key_port = OxfO;/高四位打開上拉電阻/低四位輸出低電平 上拉電阻會把電平拉高if(lo ne_key_pin=O)_de lay_ms (5);/ / 延時消抖if(lone_key_pin=0)_delay_

11、ms(90); /等待松手return(31);if(key_pin & 0xF0)!= OxFO) /作初檢查有否鍵按下,沒有,就返回如果列線不全為1,可能有鍵按下_delay_ms;/延時去抖動if(key_pin & OxFO)!= OxFO) /確認(rèn)有按鍵按下_delay_ms(1000); /延時等待松手for(rov/=0,key_port=0b11111110;rov/<4;rov+)for(column=0,temp=0b11101111 ;column<4;column+)/ 設(shè)責(zé)列線初始值 1110if(key_pin & 0xF0)=(

12、temp & OxFO)/輸入列線,查看這列有否鍵按下key=4*row+column;/鍵編碼二半行輸入值+列掃描值 key=key_tablekey;/鍵盤編碼轉(zhuǎn)換鍵值 return (key);temp«=1;/列線左移1位key_port=(key_port«1) 10x01);/行線掃描值左移1位,掃描下一行return (No_key);/“*對鍵盤掃描返回值進(jìn)行判斷是不是為符號*/void judgechar(uchar t)/用帶參數(shù)的函數(shù)可以減少鍵盤掃描次數(shù)if(t>9&&t<14&&allovflag)

13、/符號圍fuhao=1;/標(biāo)志為符號,為后面的程序作決斷算完后再將其清零allowflag。/禁止下一個符號的輸入,只能輸入一個符號 if(t=1O)/輸入的是減號wright_data('/');if(t=11)/輸入的是減號v/right_data('*');if(t=12)/輸入的是減號v/right_data('-');if(t=13)/輸入的是減號wright_data('+');sym=t;/把符號的編號保存下來,方便以后調(diào)用廣祕夜晶顯示處理,該顯示什么,不該顯示什么*/void lcd_handle(uchar te

14、mp)/用帶參數(shù)的函數(shù)可以減少鍵盤掃描次數(shù)if(temp>=0ft&temp<10)/以下處理僅對數(shù)字有效if(fuhao)/表示已經(jīng)寫了符號了,提示是輸入第二個數(shù)了if(deflag2)/判斷為小數(shù)部分if(dd<=3) -總結(jié)資料-wright-dataCO'+temp); /輸入一個數(shù)就顯示一個數(shù) b1+dd=temp; /保存小數(shù)點后面的數(shù)字elseoverflag=1;else/整數(shù)部分if(bb<=5) /條件為位數(shù)還不足六位 wright.dataCO'+temp); /輸入一個數(shù)就顯示一個數(shù)b+bb=temp; 輸入的是第二個數(shù)保

15、存的是整數(shù)部分 elseoverflag=1;/數(shù)值溢出else/輸入的是第一個數(shù) if(deflagl)/判斷為小數(shù)部分if(cc<=3)wright.dataCO'+temp); /輸入一個數(shù)就顯示一個數(shù) a1+cc=temp; /保存小數(shù)點后面的數(shù)字elseoverflag=1;else整數(shù)部分if(aa<=5) /條件為位數(shù)還不足六位if(aa=O)v/right_(0x80); /從每個位萱起寫 wright.dataCO'+temp); /輸入一個數(shù)就顯示一個數(shù)a+aa=temp; /保存的是整數(shù)部分elseoverflag=1;/數(shù)值溢出/*>新

16、初始化的函數(shù)*/void reset()/按下復(fù)位鍵后變量要全部變到初始狀態(tài)uchar k;for(k=1;k<7;k+)ak二 0;bk=O;overflag=0;/溢出標(biāo)志復(fù)位flag=O;啟動標(biāo)志復(fù)位allovflag=1;/符號允許標(biāo)志萱位fuhao=0;符號已使用標(biāo)志復(fù)位aa=0;bb=O;元素個數(shù)清零sym=0;/符號的編碼萱0;廣7“對數(shù)值進(jìn)行計算,a, b存儲的是數(shù),sym操作符編號"void calculate(void)switch(aa)/根據(jù)位數(shù)代入對應(yīng)的公式case 1: tempi =aaa;break;case 2: tempi =a2+a1*10

17、;break;case 3: tempi =a3+a2*10+a1 *100;break;case 4: temp1=a4+a叮 0+a"00+airi000;break;case 5: tempi =a5+a4*10+a3*100+a2*1000+a1 *10000;break;case 6: tempi =a6+a"0+&4門00+亂3門000+a2"0000+a1100000;SWitch(bb)/根據(jù)位數(shù)代入對應(yīng)的公式case 1: temp2=bbb;總結(jié)資料break;case 2: temp2=b2+b1 *10;break;case 3:

18、temp2=b3+b2*10+b1*100;break;case 4: temp2=b4+b3*10+b2*100+b1 *1000;break;case 5: temp2=b5+b4FO+b3riOO+b*1000+b1*10000;break;case 6: temp2=b6+b*10+b4*100+b勺000+碰2叮0000小1叮00000;temp3=a1 1 *1000+a1 2*100+a13*10+a14;temp4=b11 *1000+b1 2*100+b1 3*10+b1 4;/小數(shù)部分放大 10000 倍tempi =temp1 +temp3/10000.0;temp2=t

19、emp2+temp4/10000.0;/整數(shù)與小數(shù)的結(jié)合switch(sym)/判斷輸入的是哪個操作符并作相應(yīng)的計算case 10: tempi =temp1 /temp2;break;case 11: tempi =temp1 *temp2;break;case 12: tempi =temp1 np2;break;case 13: tempi =temp1 +temp2;break;if(temp1 >999999.9999) /數(shù)據(jù)溢出 要作處理overflag二1;tempi*=10000;/變成整數(shù)處理,方便if (tempi <0)tempi =-temp1; /變負(fù)為正negative=1;/負(fù)數(shù)標(biāo)志廠"把結(jié)果數(shù)值拆分顯示 72/ void result(long value)uchar we10;uchar k;uchar j;if(negative)vright_data(,J);for(k=10;k>5;k-)顯示v/e10=value/1000000000; v/e9=value/100000000%10; v/e8=value/10000000%10; v/e7=value/10000009610; we6=value/100000%10; we =value/10000%10; v/e4=

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論