msp430簡(jiǎn)易計(jì)算器.doc_第1頁
msp430簡(jiǎn)易計(jì)算器.doc_第2頁
msp430簡(jiǎn)易計(jì)算器.doc_第3頁
msp430簡(jiǎn)易計(jì)算器.doc_第4頁
msp430簡(jiǎn)易計(jì)算器.doc_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

/*程序功能:實(shí)現(xiàn)六位數(shù)的加,減,乘,除和數(shù)的n次方,鍵盤K0K9的鍵值為09,K12K15分別為+,*和/,K10為=,K11為上次輸入數(shù)的n方。*/#include #include #define uint unsigned int #define uchar unsigned charconst uchar segment19=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xb7,0xc8,0x8f,0xbf,0x89,0xb9,0xff,0x86,0x88;uchar static key_flag;uchar static key1;uchar A6=0,0,0,0,0,0; /第一次輸入的各位數(shù)uchar B6=0,0,0,0,0,0; /第二次輸入的各位數(shù)uchar F8=0,0,0,0,0,0,16,16; /存放顯示的數(shù)long int c=0; /第一次輸入的數(shù)值long int d=0; /第二次輸入的數(shù)值int e=0; /存放符號(hào)位long int g;/*鍵盤初始化函數(shù)*/void int_I_O(void) /掃描鍵盤p1口及數(shù)碼管p2,p4,p5口的板上資源初始化(數(shù)碼管共陽極) P1DIR |=BIT0+BIT1+BIT2+BIT3; / p1.0至p1.3為輸出(p1.0至p1.3為鍵盤的行) P1OUT &=0x00; /p1輸出初始化全為0 P5DIR |=BIT7; /p5.7輸出 P5OUT &=BIT7; /使能UC573SJ芯片,p5.7為鎖存器使能端,低電平有效 P2DIR |=0XFF; /p2口與陰極接口端有連接,控制p2口能獲得想要的顯示 P4DIR |=0XFF; /p4口與數(shù)碼管控制端有連接,p4端能控制數(shù)碼管的熄滅或開啟/*系統(tǒng)時(shí)鐘初始化函數(shù)*/void int_clk() /時(shí)鐘設(shè)置為smclk=mclk=xt2clk uchar i; BCSCTL1&=XT2OFF; /xt2off=0,打開高頻晶振 BCSCTL2|=SELM1+SELS;/設(shè)置smclk=mclk,并使用高頻晶振 do IFG1&=OFIFG; for(i=0;i100;i+) _NOP(); while(IFG1&OFIFG)!=0);/直至OFIFG標(biāo)志位清為0 IFG1&=OFIFG;/*timerA初始化函數(shù)*/void int_timer() /smclk為時(shí)鐘來源,8分頻,1MHz,增加模式,10ms來一個(gè)中斷 TACTL|=TASSEL1+TACLR+ID0+ID1;/smclk為時(shí)鐘來源,8分頻,1MHz TACTL|=MC0+TAIE; /增加模式,并且使能中斷 TACCR0=9999; /10ms來一個(gè)中斷/*檢測(cè)鍵盤有無輸入函數(shù)*/void fast_scan() /檢測(cè)鍵盤有無輸入,沒輸入key_flag=0,有輸入 key_flag=1 uchar temp; P1OUT &=0xf0; /p1口低四位清0,高四位不變, temp=P1OUT&0xf0; /p1口為oxf0,沒輸入,否則有輸入 if(temp=0xf0)key_flag=0; /沒輸入key_flag=0,有輸入 key_flag=1else key_flag=1; /*行掃描讀列值函數(shù)*/uchar scan_key(uchar line) /表示每行掃描一次,判斷一下列值 uchar key; P1OUT=line; /接受掃描行,用p1第四位控制,就是其中1位為低位,剩余3位為高位 switch(P1IN&0xf0) /p1高四位輸入判斷第幾列,如第一列0111 case 0x70:key=0x01;break; /第一列0x01表示,列為從左往右數(shù) case 0xb0:key=0x02;break; /第二列0x02表示 case 0xd0:key=0x03;break; /第三列0x03表示 case 0xe0:key=0x04;break; /第四列0x04表示 default:key=0xff;break; return(key); /返回列鍵值/*獲取鍵盤數(shù)值函數(shù)*/uchar get_key() /對(duì)行掃描,讀列值的方法獲取鍵盤數(shù)值 uchar key; while(1) /一直掃描,直到掃描完為止 key=scan_key(0x7); /第一行的掃描,從下往上為第一行,將0111給p1的低4位 if(key!=0xff)key|=0x10;P1OUT=0x0f;break; /第一行用0x10 key=scan_key(0xb); /第二行的掃描,將1011給p1的低4位 if(key!=0xff)key|=0x20;P1OUT=0x0f;break; /第二行用0x20 key=scan_key(0xd); /第三行的掃描,將1101給p1的低4位 if(key!=0xff)key|=0x30;P1OUT=0x0f;break; /第三行用0x30 key=scan_key(0xe); /第四行的掃描,將1110給p1的低4位 if(key!=0xff)key|=0x40;P1OUT=0x0f;break; /第四行用0x40 switch(key) case 0x11:key=0;break; /第一行第一列鍵值為0,以后鍵值往后推 case 0x21:key=1;break; case 0x31:key=2;break; case 0x41:key=3;break; case 0x12:key=4;break; case 0x22:key=5;break; case 0x32:key=6;break; case 0x42:key=7;break; case 0x13:key=8;break; case 0x23:key=9;break; case 0x33:key=10;break; case 0x43:key=11;break; case 0x14:key=12;break; case 0x24:key=13;break; case 0x34:key=14;break; case 0x44:key=15;break; _NOP(); /延時(shí) return(key); /返回鍵盤數(shù)值給調(diào)用函數(shù)/*over函數(shù)*/void over() uchar temp; P1OUT&=0xc0; do temp=P1IN&0xc0; if(temp=0xc0)break; while(1);/*可調(diào)時(shí)間的延時(shí)函數(shù)*/void delay(t) /延時(shí)一段時(shí)間 uint i; for(i=0;it;i+) _NOP();/*延時(shí)一段時(shí)間函數(shù)*/void delay2(void) /延時(shí)一段時(shí)間 uint i=0,j=0; for(i=0;i=200;i+) for(j=0;j=300;j+); /*Fi數(shù)碼管顯示函數(shù)*/uchar display(void) /顯示以Fi為數(shù)組內(nèi)的內(nèi)容,第二支數(shù)碼管一直不亮 uchar i; for(i=0;i8;i+) P2OUT=segmentFi;/數(shù)碼管后六位顯示Ai內(nèi)容,數(shù)碼管第一位顯示符號(hào) P4OUT=0x01i; /動(dòng)態(tài)顯示符號(hào)及數(shù)字 delay(700); /調(diào)整t值可調(diào)整顯示閃爍與亮度 return 0;/*算結(jié)果功能函數(shù)*/long int int_key(e)/根據(jù)輸入符號(hào)計(jì)算值long int f=0; int j; long int ji=1; c=A5*100000+A4*10000+A3*1000+A2*100+A1*10+A0;/第一次輸入的數(shù)值 d=B5*100000+B4*10000+B3*1000+B2*100+B1*10+B0;/第二次輸入的數(shù)值 switch(e) /c的數(shù)值為最終值返回 case 11:for(j=1;j=d;j+)ji=ji*c; f=ji;break; case 12:f=c+d;break; case 13:f=c-d;break; case 14:f=c*d;break; case 15:f=c/d;break; default:f=c*c;break; return(f);/*主函數(shù)*/void main(void) WDTCTL=WDTPW+WDTHOLD; int i=0; int j; long int sum; int_clk(); /初始化系統(tǒng)時(shí)鐘 int_timer(); /初始化timer,10ms一次中斷 int_I_O(); /初始化板上資源設(shè)置 _EINT(); /開系統(tǒng)中中斷 while(1) fast_scan(); /判斷是否有鍵盤按下,有key_flag=1,無key_flag=0 if(key_flag=0) continue; key_flag=0; delay2(); /延時(shí)看是否為抖動(dòng) fast_scan(); /再掃描 if(key_flag=1) /有鍵盤0到9按下,用數(shù)組Ai存放,大于9用變量e存放 key_flag=0; /清鍵盤標(biāo)志位 do key1=get_key(); /key1存放鍵盤數(shù)值 if(key1=0;j-)Fj+1=Fj; F0=key1; i+; display(); delay2(); fast_scan(); if(key_flag=0) continue; key_flag=0; delay2(); fast_scan(); over(); delay2(); while(key1=9&i=6); for(j=0;j=5;j+)Aj=Fj; e=key1; /e為符號(hào),e=12為加,e=13為減,e=14為乘,e=15為除 F7=e; display();/x顯示符號(hào) for(i=0;i=5;i+)Fi=0; display(); i=0; fast_scan(); if(key_flag=0) continue; key_flag=0; delay2(); fast_scan(); if(key_flag=1) key_flag=0; do key1=get_key(); if(key1=0;j-)Fj+1=Fj; F0=key1; i+; display(); fast_scan(); if(key_flag=0) continue; key_flag=0; delay2(); fast_scan(); over(); delay2(); while(key1=9&i=6); for(j=0;j999999)F7=16;F6=16;F5=16;F4=16;F3=16;F2=17;F1=17;F0=18; else F5=sum/100000; F4=(sum/10000)%10; F3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論