首页 msp430简易计算器

msp430简易计算器

举报
开通vip

msp430简易计算器 更多资料请访问与非网德州仪器技术社区 /************************************************************** 程序功能:实现六位数的加,减,乘,除和数的 n次方,键盘 K0~K9的键值 为 0~9,K12~K15分别为+,—,*和/,K10为=,K11为上次输入数的 n方。 ***************************************************************/ #include #include #...

msp430简易计算器
更多资料请访问与非网德州仪器技术社区 /************************************************************** 程序功能:实现六位数的加,减,乘,除和数的 n次方,键盘 K0~K9的键值 为 0~9,K12~K15分别为+,—,*和/,K10为=,K11为上次输入数的 n方。 ***************************************************************/ #include #include #define uint unsigned int #define uchar unsigned char const uchar segment[19]={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 A[6]={0,0,0,0,0,0}; //第一次输入的各位数 uchar B[6]={0,0,0,0,0,0}; //第二次输入的各位数 uchar F[8]={0,0,0,0,0,0,16,16}; //存放显示的数 long int c=0; //第一次输入的数值 long int d=0; //第二次输入的数值 int e=0; //存放符号位 long int g; /****************键盘初始化函数****************/ void int_I_O(void) //扫描键盘 p1口及数码管 p2,p4,p5口的板上资源初始化(数码管共阳极) { 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口与数码管控制端有连接,p4端能控制数码管的熄灭或开启 } /****************系统时钟初始化函数****************/ void int_clk() //时钟设置为 smclk=mclk=xt2clk { uchar i; BCSCTL1&=~XT2OFF; //xt2off=0,打开高频晶振 BCSCTL2|=SELM1+SELS;//设置 smclk=mclk,并使用高频晶振 do { IFG1&=~OFIFG; for(i=0;i<100;i++) 更多资料请访问与非网德州仪器技术社区 _NOP(); } while((IFG1&OFIFG)!=0);//直至 OFIFG标志位清为 0 IFG1&=~OFIFG; } /****************timerA初始化函数****************/ void int_timer() //smclk为时钟来源,8分频,1MHz,增加模式,10ms来一个中断 { TACTL|=TASSEL1+TACLR+ID0+ID1;//smclk为时钟来源,8分频,1MHz TACTL|=MC0+TAIE; //增加模式,并且使能中断 TACCR0=9999; //10ms来一个中断 } /****************检测键盘有无输入函数****************/ void fast_scan() //检测键盘有无输入,没输入 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=1 else { key_flag=1; } } /****************行扫描读列值函数****************/ uchar scan_key(uchar line) // 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示每行扫描一次,判断一下列值 { uchar key; P1OUT=line; //接受扫描行,用 p1第四位控制,就是其中 1位为低位,剩余 3位为高位 switch(P1IN&0xf0) //p1高四位输入判断第几列,如第一列 0111 { case 0x70:key=0x01;break; //第一列 0x01表示,列为从左往右数 case 0xb0:key=0x02;break; //第二列 0x02表示 case 0xd0:key=0x03;break; //第三列 0x03表示 case 0xe0:key=0x04;break; //第四列 0x04表示 default:key=0xff;break; } 更多资料请访问与非网德州仪器技术社区 return(key); //返回列键值 } /****************获取键盘数值函数****************/ uchar get_key() //对行扫描,读列值的方法获取键盘数值 { 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(); //延时 return(key); //返回键盘数值给调用函数 } /****************over函数****************/ void over() 更多资料请访问与非网德州仪器技术社区 { uchar temp; P1OUT&=0xc0; do { temp=P1IN&0xc0; if(temp==0xc0)break; } while(1); } /****************可调时间的延时函数****************/ void delay(t) //延时一段时间 { uint i; for(i=0;i=0;j--)F[j+1]=F[j]; F[0]=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++)A[j]=F[j]; e=key1; //e为符号,e=12为加,e=13为减,e=14为乘,e=15为除 F[7]=e; display();//x显示符号 for(i=0;i<=5;i++)F[i]=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<=9) { for(j=4;j>=0;j--)F[j+1]=F[j]; F[0]=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;j<=5;j++)B[j]=F[j]; g=key1; F[7]=g; display(); over(); delay2(); if(g==10) { sum=int_key(e); //算出结果 if(sum>999999){F[7]=16;F[6]=16;F[5]=16;F[4]=16;F[3]=16;F[2]=17;F[1]=17;F[0]=18;} else { F[5]=sum/100000; F[4]=(sum/10000)%10; F[3]=(sum/1000)%10; F[2]=(sum/100)%10; F[1]=(sum/10)%10; F[0]=sum%10; } } //else {F[7]=16; break;}//只有=时才显示结果 display(); } } /****************中断服务函数****************/ 更多资料请访问与非网德州仪器技术社区 #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A(void) { switch(TAIV) { case 2:break; case 4:break; case 10:display(); break; } }
本文档为【msp430简易计算器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_552792
暂无简介~
格式:pdf
大小:109KB
软件:PDF阅读器
页数:8
分类:互联网
上传时间:2012-06-20
浏览量:76