基于AVR單片機(jī)的計(jì)算器程序_第1頁(yè)
基于AVR單片機(jī)的計(jì)算器程序_第2頁(yè)
基于AVR單片機(jī)的計(jì)算器程序_第3頁(yè)
基于AVR單片機(jī)的計(jì)算器程序_第4頁(yè)
基于AVR單片機(jī)的計(jì)算器程序_第5頁(yè)
已閱讀5頁(yè),還剩6頁(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)介

1、#include#include/延時(shí)函數(shù)的頭文件#include / 中斷函數(shù)的頭文件#define uint unsigned int#define uchar unsigned char#define BIT(k) (1k) /利用上ICC軟件的優(yōu)點(diǎn)#define DI PORTC /夜晶的數(shù)據(jù)輸入端#define No_key 255/沒(méi)有按鍵按下的返回值#define key_port PORTD/鍵盤輸入#define key_ddr DDRD #define key_pin PIND /宏定義方便以后程序移植#define lone_key_port PORTB /獨(dú)立鍵盤接口

2、用于輸入小數(shù)點(diǎn)#define lone_key_ddr DDRB#define lone_key_pin (PINB&BIT(0) /讀取獨(dú)立鍵盤接口的電平#define rs_0 PORTA&=BIT(0) /RS復(fù)位#define rs_1 PORTA|=BIT(0) /RS置位#define en_0 PORTA&=BIT(1) /使能端復(fù)位#define en_1 PORTA|=BIT(1) /使能端置位const uchar table1= You are welcome!;/初始顯示字符const uchar table2=ERROR!;/出錯(cuò)提示字符uchar a7=0,0,0,

3、0,0,0,0,b11=0,0,0,0,0,0,0,a15=0,0,0,0,0,b15=0,0,0,0,0; /用來(lái)存儲(chǔ)輸入的兩個(gè)數(shù)字,位數(shù)不可超過(guò)10位uchar aa,bb,cc,dd; /用來(lái)記數(shù)輸入的位數(shù)uchar sym; /用來(lái)保存符號(hào)uchar flag;/起動(dòng)標(biāo)志uchar fuhao; /符號(hào)標(biāo)志uchar deflag1 ; /小數(shù)點(diǎn)標(biāo)志uchar deflag2 ; /小數(shù)點(diǎn)標(biāo)志uchar overflag; /數(shù)值溢出標(biāo)志uchar allowflag=1; /符號(hào)允許標(biāo)志,用于禁止連續(xù)兩個(gè)符號(hào)的輸出uchar negative; /負(fù)數(shù)標(biāo)志,當(dāng)是負(fù)數(shù)要作相應(yīng)的處理lo

4、ng temp3,temp4; /計(jì)算的數(shù)值 得數(shù)用其中一個(gè)變量存儲(chǔ)即可,不用再浪費(fèi)內(nèi)存開(kāi)辟其他變量float temp1, 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 port_init();/端口初始化void device_init(); /夜晶初始化void time_init();/定時(shí)器初始化void wright_com(uchar com); /夜晶寫(xiě)指令函數(shù)void wright_data(uc

5、har date); /夜晶寫(xiě)數(shù)據(jù)函數(shù)void lcd_handle(uchar temp); /夜晶顯示處理,該顯示什么,不該顯示什么 uchar keyscan(); /鍵盤掃描void judgechar(uchar t); /判斷字符為符號(hào)還是數(shù)字void decimal(uchar de) ; /判斷是不是小數(shù)點(diǎn),只能出現(xiàn)兩個(gè)小數(shù)點(diǎn),且不能連續(xù)出現(xiàn)void reset() ; /復(fù)位函數(shù) void calculate(void); /對(duì)數(shù)值進(jìn)行計(jì)算void result(long value); /顯示結(jié)果void flow_clew() ; /溢出提示函數(shù)int main() po

6、rt_init(); device_init(); time_init(); /初始化 while(1) flow_clew() ; /溢出提示函數(shù),一旦掃描到出錯(cuò)就會(huì)顯示錯(cuò)誤 /*中斷服務(wù)程序*/volatile unsigned int i;/中斷服務(wù)程序中要使用全局變量,且要加volatileSIGNAL(SIG_OVERFLOW0) TCNT0=205; /重裝初值 i=keyscan(); /返回鍵盤掃描值if(i!=No_key) /確認(rèn)有按鍵按下 if(i=50) wright_com(0x01) ;/清顯示_delay_ms(10); /延時(shí)等待清屏指令完成 wright_co

7、m(0x80); wright_data(0); /重新顯示0reset(); /初始化 flag=1; / 標(biāo)志起動(dòng) if(i50&flag) /條件為已經(jīng)啟動(dòng)而且輸入的是有效字符 judgechar(i);/判斷是不是操作符,要是則要作相應(yīng)的處理decimal(i);/判斷是不是小數(shù)點(diǎn)輸入,要是則要作相應(yīng)的處理lcd_handle(i) ;/對(duì)輸入的數(shù)據(jù)進(jìn)行合理存儲(chǔ)并加以顯示 if(i=21) /按下了等號(hào)鍵 wright_data(=); /顯示等號(hào) calculate(); /計(jì)算數(shù)值 result(temp1); /拆分?jǐn)?shù)值后顯示結(jié)果 /*定時(shí)器初始化*/void time_init

8、() TCNT0=205; /初值 255-205=50 50微秒TIMSK|=(1TOIE0);sei(); /開(kāi)啟總中斷TCCR0|= (1CS01);/8分頻 8M/8=1M /*端口初始化*/void port_init() DI=0xff; DDRA|=BIT(0); DDRA|=BIT(1);/輸出狀態(tài) lone_key_ddr&=BIT(0); lone_key_port|=BIT(0); /獨(dú)立鍵盤接口設(shè)置為輸入,并打開(kāi)上拉電阻 DDRD=0; /全部設(shè)為輸入,有個(gè)上拉電阻,可以輸入高電平 DDRB=0xff; /*夜晶初始化*/void device_init() en_0;

9、 /使能端拉低wright_com(0x38) ; /初始化格式wright_com(0x0c) ;/0x0e打開(kāi)光標(biāo) 0x0c不顯示光標(biāo)0x0e光標(biāo)不閃,0x0f光標(biāo)閃wright_com(0x01) ;/清顯示 wright_com(0x80); for(i=0;i17;i+) wright_data(table1i); _delay_ms(20);/*夜晶寫(xiě)入指令的函數(shù)*/void wright_com(uchar com)rs_0; /低電平時(shí)寫(xiě)指令DI=com; _delay_ms(1);en_1;_delay_ms(1); en_0;/*夜晶寫(xiě)入數(shù)據(jù)的函數(shù)*/void wright

10、_data(uchar data)rs_1; /高電平時(shí)寫(xiě)數(shù)據(jù) DI=data;_delay_ms(1);en_1;_delay_ms(1);en_0;/*4x4矩陣鍵盤及一個(gè)獨(dú)立鍵盤的掃描函數(shù)*/uchar keyscan(void) unsigned char temp,temp1,key,row,column; key_ddr = 0x0f;/ 高四位輸入列線/低四位輸出到行線 key_port = 0xf0;/ 高四位打開(kāi)上拉電阻/低四位輸出低電平 上拉電阻會(huì)把電平拉高 if(lone_key_pin=0) _delay_ms(5); /延時(shí)消抖 if(lone_key_pin=0)

11、_delay_ms(90); /等待松手 return(31); if(key_pin & 0xF0)!= 0xF0) / 作初檢查有否鍵按下,沒(méi)有,就返回 如果列線不全為1,可能有鍵按下 _delay_ms(5);/ 延時(shí)去抖動(dòng) if(key_pin & 0xF0)!= 0xF0) /確認(rèn)有按鍵按下 _delay_ms(1000); /延時(shí)等待松手 for(row=0,key_port=0b11111110;row4;row+) for(column=0,temp=0b11101111;column4;column+)/ 設(shè)置列線初始值1110 if(key_pin & 0xF0)=(tem

12、p & 0xF0)/ 輸入列線,查看這列有否鍵按下 key=4*row+column;/ 鍵編碼=4*行輸入值+列掃描值 key=key_tablekey;/ 鍵盤編碼轉(zhuǎn)換鍵值 return (key); temp=1;/ 列線左移1位 key_port=(key_port9&t=0&temp10) /以下處理僅對(duì)數(shù)字有效 if(fuhao) /表示已經(jīng)寫(xiě)了符號(hào)了,提示是輸入第二個(gè)數(shù)了 if(deflag2) /判斷為小數(shù)部分 if(dd=3) wright_data(0+temp); /輸入一個(gè)數(shù)就顯示一個(gè)數(shù)b1+dd=temp; /保存小數(shù)點(diǎn)后面的數(shù)字else overflag=1;els

13、e /整數(shù)部分 if(bb=5) /條件為位數(shù)還不足六位 wright_data(0+temp); /輸入一個(gè)數(shù)就顯示一個(gè)數(shù) b+bb=temp; /輸入的是第二個(gè)數(shù) 保存的是整數(shù)部分 else overflag=1; /數(shù)值溢出 else/輸入的是第一個(gè)數(shù)if(deflag1) /判斷為小數(shù)部分 if(cc=3) wright_data(0+temp); /輸入一個(gè)數(shù)就顯示一個(gè)數(shù)a1+cc=temp; /保存小數(shù)點(diǎn)后面的數(shù)字else overflag=1;else /整數(shù)部分 if(aa=5) /條件為位數(shù)還不足六位 if(aa=0) wright_com(0x80); /從每個(gè)位置起寫(xiě) w

14、right_data(0+temp); /輸入一個(gè)數(shù)就顯示一個(gè)數(shù) a+aa=temp; / 保存的是整數(shù)部分 else overflag=1; /數(shù)值溢出 /*重新初始化的函數(shù)*/void reset() /按下復(fù)位鍵后變量要全部變到初始狀態(tài)uchar k;for(k=1;k999999.9999) /數(shù)據(jù)溢出 要作處理 overflag=1; temp1*=10000; /變成整數(shù)處理,方便 if(temp15;k-) /只能十位以上的數(shù)字進(jìn)行檢測(cè),個(gè)位的不管是不是零都要顯示 if(wek!=0) break; /確定第一個(gè)非零數(shù)字,只顯示有效數(shù)字 for(j=k;j0;j-) /從第一個(gè)非零數(shù)字開(kāi)始顯示 if(j=4) wright_data(.); /小數(shù)部分前面要加個(gè)小數(shù)點(diǎn) wright_data(0+wej);_delay_ms(2);/*溢出提示函數(shù)*/void flow_clew() uchar num; if(overflag) wright_com(0x80+0x40+5); for(num=0;num6;num+) wright_data(table2num);_delay_ms(2); /*判斷是不是小數(shù)點(diǎn)*/void decimal(uchar

溫馨提示

  • 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)論