#include <msp430x14x.h>
const unsigned char data[22] ={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,
0x8f,0xbf,0x89,0xb9,
0xff,0xaf};//0~9 a~f 符号
unsigned char segment[8] = {20,20,0,0,0,0,0,0};//初始数码管
unsigned char flag1=0;
void delay(unsigned int j)
{
unsigned int i;
for(i=0;i<j;i++);
}
unsigned int jisuan()
{unsigned int y;
y=segment[2]*100000+segment[3]*10000+segment[4]*1000+segment[5]*100+segment[6]*10+s egment[7];
return y;
}
void clear(void)
{unsigned int a;
for(a=7;a>1;a--)
segment[a]=0;
}
void zhuanhuan( unsigned long r)
{
segment[7]=r%10;
segment[6]=r/10%10;
segment[5]=r/100%10;
segment[4]=r/1000%10;
segment[3]=r/10000%10;
segment[2]=r/100000%10;
}
unsigned char getkey(void)
{
unsigned char m,n=16;
P1OUT=0x00;
if((!(P1IN&BIT4))||(!(P1IN&BIT5))||(!(P1IN&BIT6))||(!(P1IN&BIT7)))
{delay(10000);
if((!(P1IN&BIT4))||(!(P1IN&BIT5))||(!(P1IN&BIT6))||(!(P1IN&BIT7)))
{
flag1=1;
for(m=0;m<=2;m++)
{
P1OUT=~BIT0;
if(!(P1IN&BIT7)){n=3;break;}
if(!(P1IN&BIT6)){n=7;break;}
if(!(P1IN&BIT5)){n=11;break;}
if(!(P1IN&BIT4)){n=15;break;}
P1OUT=~BIT1;
if(!(P1IN&BIT7)){n=2;break;}
if(!(P1IN&BIT6)){n=6;break;}
if(!(P1IN&BIT4)){n=14;break;}
if(!(P1IN&BIT5)){n=10;break;}
P1OUT=~BIT2;
if(!(P1IN&BIT7)){n=1; break;}
if(!(P1IN&BIT6)){n=5; break;}
if(!(P1IN&BIT5)){n=9; break;}
if(!(P1IN&BIT4)){n=13; break;}
P1OUT=~BIT3;
if(!(P1IN&BIT7)){n=0; break;}
if(!(P1IN&BIT6)){n=4; break;}
if(!(P1IN&BIT5)){n=8; break;}
if(!(P1IN&BIT4)){n=12; break;}
delay(20000);
while((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1IN&BIT4)))
for(unsigned char j=0;j<=7;j++)
{
P4OUT=0x80>>j;
P2OUT=data[segment[j]];
delay(500);
}
delay(20000);
}
}
}
return (n);
}
void main(void)
{
unsigned char flag=0,i=9;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P5DIR|=BIT7;
P5OUT&=~BIT7;
P4DIR=0xff;
P2DIR=0xff;
P1DIR=0x0f;
P1OUT=0xff;
while(1)
{ unsigned long p,q,r;
unsigned long s=1;
segment[1]=20;
i=getkey();
if((i<10)&(flag1=1))
{
segment[2]=segment[3];
segment[3]=segment[4];
segment[4]=segment[5];
segment[5]=segment[6];
segment[6]=segment[7];
segment[7]=i;
flag1=0;
}
else {
switch(i)
{case 15:segment[0]=19;p=jisuan();clear();flag=15;break;
case 14:segment[0]=18;p=jisuan();clear();flag=14;break;
case 13:segment[0]=17;p=jisuan();clear();flag=13;break;
case 12:segment[0]=16;p=jisuan();clear();flag=12;break;
case 10:segment[0]=10;p=jisuan();clear();flag=10;break;
case 11:{q=jisuan(); clear();
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:for(unsigned i=q;i>0;i--)
{ s=p*s;}
r=s;break;
}
if(r>999999)
{clear();segment[5]=14;segment[6]=14;segment[7]=21; }
else
zhuanhuan(r);
}
break;
}
}
for(unsigned char j=0;j<=7;j++)
{
P4OUT=0x80>>j;
P2OUT=data[segment[j]];
delay(200);
}
}
}。