文档库 最新最全的文档下载
当前位置:文档库 › 四位简易计算器(精确到一位小数点)

四位简易计算器(精确到一位小数点)

/****************************四位简易计算器(精确到一位小数点)********************************************
P0接4*4键盘的8个针脚
P1接共阴数码管a-h对应P1^0-P1^7
P3接S1-S8 对应P3^0-P3^7
**************************************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int

sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
sbit din=P1^7;
// 0 1 2 3 4 5 6 7 8 9 -
uchar code display[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
uchar data weima[]={0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff};
uchar data shu[4]={0,0,0,0};
uchar data k,key,i=0,temp,re=0;
int data key1,key2,x=0,y=0,sh;
int data result;
//*******************************延迟函数1ms*************************************
void delay(void)
{
uint n,m;
for(m=0;m<1;m++)
for(n=0;n<110;n++);
}
//******************************** 输入小数点*******************************************
void xiaoshu(void)
{
if(re!=0)
{
for(re=0;re<4;re++)
shu[re]=0;
re=0;
i=0;
x=0;
y=0;
key1=0;
key2=0;
weima[0]=0xf7;
weima[1]=0xf7;
weima[2]=0xfb;
weima[3]=0xfd;
weima[4]=0xfe;
weima[5]=0xff;
weima[6]=0xff;
weima[7]=0xff;
}
else
{
x=i;
y++;
}
}
//*********************************数码显示***********************************
void scan(void)
{
int k;
for(k=0;k<4;k++)
{
P1=display[shu[k]];
P3=weima[k+4];
if((x!=0)&&(k==x-1))
din=1;
delay();
P3=0xff;
}
}
//*****************************按键识别*********************************
void anjian(void)
{
//----------扫描第1行-------------------
P0=0xff;
P0_4=0;
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(); //防抖动
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0x07: key=1;i++; break; //“1“
case 0x0b: key=2;i++; break; //“2“
case 0x0d: key=3;i++; break; //“3“
case 0x0e: key=10; break; //“+“
}

}
temp=P0;
temp=temp&0x0f;
while(temp!=0x0f) //松键判断
{
temp=P0;
temp=temp&0x0f;
}
}
//----------扫描第2行-------------------
P0=0xff;
P0_5=0;
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay();
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0x07: key=4;i++; break; //“4“
case 0x0b: key=5;i++; break; //“5“

case 0x0d: key=6;i++; break; //“6“
case 0x0e: key=11; break; //“-“
}

}
temp=P0;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P0;
temp=temp&0x0f;
}
}
//----------扫描第3行-------------------
P0=0xff;
P0_6=0;
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay();
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0x07: key=7;i++; break; //“7“
case 0x0b: key=8;i++; break; //“8“
case 0x0d: key=9;i++; break; //“9“
case 0x0e: key=12; break; //“*“
}
P1=display[key];
}
temp=P0;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P0;
temp=temp&0x0f;
}
}
//----------扫描第4行-------------------
P0=0xff;
P0_7=0;
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay();
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0x07: key=15; break; //复位
case 0x0b: key=0;i++; break; //“0“
case 0x0d: key=14; break; //“=“
case 0x0e: key=13; break; //“/“
}

}
temp=P0;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P0;
temp=temp&0x0f;
}
}
}

//********************存数*********************************************
//存储输入的数字
void cun (void)
{
uchar h;
if(i!=1)
for(h=7;h>0;h--)
weima[h]=weima[h-1];
shu[i-1]=key;
//************
if(i==1)
sh=key;
else
sh=sh*10+key;
//**************
key=20;
}
//********************运算**********************************************
//存储键入的运算符号,存储输入的值
void suan(void)
{

key1=sh;
sh=1;
//*****************************
if(x!=0)
{

uint a;
a=pow(10,i-x-1);
key1=key1/a;
}
else key1*=10;
//******************************
k=key;
for(i=0;i<4;i++)
shu[i]=0;

weima[0]=0xf7;
weima[1]=0xf7;
weima[2]=0xfb;
weima[3]=0xfd;
weima[4]=0xfe;
weima[5]=0xff;
weima[6]=0xff;
weima[7]=0xff;
i=0;
key=20;
x=0;
}
//********************计算结果******************************************
void resu(void)
{

uchar m=0;
re++;
key2=sh;
//********************************
if(x!=0)
{
uint a;
y++;
a=pow(10,i-x-1);
key2=key2/a;
}
else key2*=10;
//*************有小数点*********************
if(y!=0)
{
if(k==10) result=key1+key2;
if(k==11) result=key1-key2;
if(k==12) result=(key1*key2)/10;
if(k==13) result=10*key1/key2;
if(result>9999)
{
x=0;
result/=10;
}

else x=3;
}
//*************没有小数点*********************
else
{
if(k==10) result=(key1+key2)/10;
if(k==11) result=(key1-key2)/10;
if(k==12) result=(key1*key2)/100;
if(k==13) result=key1/key2;
x=0;
}
//************负值情况*****************
if(result<0)
{
result=0-result;
m=1;
}
shu[0]=result/1000; //千位
shu[1]=result/100%10; //百位
shu[2]=result%100/10; //十位
shu[3]=result%10; //个位
i=4;
//**************正数显示***************
if(m!=1)
{
if((x==0)&&(shu[0]==0))
{
shu[0]=10;
if(shu[1]==0)
{
shu[1]=10;
if(shu[2]==0)
shu[2]=10;
}
}

else if(shu[0]==0)
{
shu[0]=10;
if(shu[1]==0)
shu[1]=10;
}
}
// ***********负值显示****************
else
{
if(x==0)
{
if((shu[0]==0)&&(shu[1]==0)&&(shu[2]==0))
{
shu[0]=10;
shu[1]=10;
shu[2]=12;
}
else if((shu[0]==0)&&(shu[1]==0))
{
shu[0]=10;
shu[1]=12;
}
else if(shu[0]==0)
shu[0]=11;
}

else
{
if((shu[0]==0)&&(shu[1]==0))
{
shu[0]=10;
shu[1]=12;
}
else if(shu[0]==0)
shu[0]=11;
}
}

//******************************************
key=20;
weima[4]=0xf7;
weima[5]=0xfb;
weima[6]=0xfd;
weima[7]=0xfe;


}
//***********************主函数*****************************************
void main()
{

while(1)
{
scan();
anjian();
//-------计算结果-----
if(key==14)
resu();
//------小数点------
else if(key==15)
xiaoshu();
//------运算符--------
else if((key<14)&&(key>9))
suan();
//-------输入数字----------
else if((key<10)&&(key>-1))
{
if(i<5) cun();
else i=4;
}
}
}
//**********************************************************************

相关文档