资源描述
Msp430简易计算器设计
设计任务:
1. 实现计算器基本“+,-,*,/”运算功能。
2. 八个数码管,第一位显示符号位,第二位空置,剩余六位显示数字,结果溢出显示“EER”;
3. 有自己独立的运算特色
设计目的:
学习使用单片机内部的I/O功能,熟悉I/O与键盘矩阵和数码管的连接,熟练掌握单片机I/O的编程。
设计方案:
使用数组储存和调用内部数据,利用子函数实现各种运算功能,另外添加阶乘factorial()函数。
程序代码:
#include <msp430x14x.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char leddata[24] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8f,0xbf,0x89,0xb9,0xff,0x86,0xaf,0xcf};
unsigned char time[8] = {20,20,0,0,0,0,0,0};//初始数码管
unsigned char getkey(void);
unsigned int qiushu();
long factorial(long a);
void qingping(void);
void fenjie();
void delay(unsigned int asdf)
{
for(uint asd=0;asd<asdf;asd++);
}
;
/*************************主函数************************/
void main(void)
{
uchar flag=0,i=9;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P5DIR|=BIT7;
P5OUT&=~BIT7;
P4DIR=0xff;
P2DIR=0xff;
P1DIR=0x0F;
P1OUT=0xff;
while(1)
{ long p,q,r;
time[1]=20;
i=getkey();
if(i<10)
{
time[2]=time[3];
time[3]=time[4];
time[4]=time[5];
time[5]=time[6];
time[6]=time[7];
time[7]=i;
}
else {
switch(i)
{
case 12:time[0]=16;
p=qiushu();
qingping();
flag=12;
break;
case 13:time[0]=17;
p=qiushu();
qingping();
flag=13;
break;
case 14:time[0]=18;
p=qiushu();
qingping();
flag=14;
break;
case 15:time[0]=19;
p=qiushu();
qingping();
flag=15;
break;
case 10:time[0]=23;
p=qiushu();
qingping();
flag=10;
break;
case 11:{q=qiushu(); //做相应的计算求值
qingping();
switch(flag)
{case 12:r=p+q;break;
case 13:r=p-q;break;
case 14:r=p*q;break;
case 15:r=p/q;break;
case 10:r=factorial(p);break;
}
if((r>999999)||(r<0)) {
qingping();
time[5]=21;
time[6]=21;
time[7]=22;
}
else fenjie(r);}
break;
}}
for(uchar j=0;j<=7;j++) //显示
{
P4OUT=0x80>>j;
P2OUT=leddata[time[j]];
delay(200);
}
}
}//end of main
unsigned int qiushu() //转化成相应的十进制整数
{unsigned int y;
y=time[2]*100000+time[3]*10000+time[4]*1000+time[5]*100+time[6]*10+time[7];
return y;
}
void qingping(void) //清除屏幕
{unsigned int a;
for(a=7;a>1;a--)
time[a]=0;
}
void fenjie(long r) //提取十进制整数各位数值,并显示
{
time[7]=r%10;
time[6]=r/10%10;
time[5]=r/100%10;
time[4]=r/1000%10;
time[3]=r/10000%10;
time[2]=r/100000%10;
}
long factorial(long a)
{
long x,i;
x=a;
for(i=1;i<a;i++)
{
x=x*(a-i);
}
return(x);
}
uchar getkey(void) //获取键值
{
uchar z,x=16;
P1OUT=0x00;
if((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1IN&BIT4)))
{
delay(10000);
if((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1IN&BIT4)))
{
for(z=0;z<=1;z++)
{
P1OUT=~BIT0;
if(!(P1IN&BIT7))
{x=3;break;}
P1OUT=~BIT0;
if(!(P1IN&BIT6))
{x=7;break;}
P1OUT=~BIT0;
if(!(P1IN&BIT5))
{x=11;break;}
P1OUT=~BIT0;
if(!(P1IN&BIT4))
{x=15;break;}
//line 1
P1OUT=~BIT1;
if(!(P1IN&BIT7))
{x=2;break;}
P1OUT=~BIT1;
if(!(P1IN&BIT6))
{x=6;break;}
P1OUT=~BIT1;
if(!(P1IN&BIT5))
{x=10;break;}
if(!(P1IN&BIT4))
{x=14;break;}
//line3
P1OUT=~BIT3;
if(!(P1IN&BIT6))
{x=4; break;}
P1OUT=~BIT3;
if(!(P1IN&BIT7))
{x=0; break;}
P1OUT=~BIT3;
if(!(P1IN&BIT5))
{x=8; break;}
P1OUT=~BIT3;
if(!(P1IN&BIT4))
{x=12; break;}
//line 2
P1OUT=~BIT2;
if(!(P1IN&BIT6))
{x=5; break;}
P1OUT=~BIT2;
if(!(P1IN&BIT7))
{x=1; break;}
P1OUT=~BIT2;
if(!(P1IN&BIT5))
{x=9; break;}
P1OUT=~BIT2;
if(!(P1IN&BIT4))
{x=13; break;}}
while((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1IN&BIT4)))
for(uchar j=0;j<=7;j++)
{
P4OUT=0x80>>j;
P2OUT=leddata[time[j]];
delay(500);
}
delay(20000);
while((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1IN&BIT4)))
for(uchar j=0;j<=7;j++)
{
P4OUT=0x80>>j;
P2OUT=leddata[time[j]];
delay(500);
}
delay(20000);
}
}
return (x);
}
展开阅读全文