51单片机控制下的简易计算器仿真图和程序

2025-03-17 11:44:01
推荐回答(1个)
回答1:

我有我自己写的一个程序,根号 开方连续运算1602显示

#include
#include

#define  uint  unsigned int
#define  uchar unsigned char
uchar temp,z,fuhao;      //z?????,fuhao?????
char zifu1[8]={0},zifu2[8]={0},zifu[20];
uchar cuowu[]={"cuo  wu"};
uchar keyshu=0,shu0,genhao=251,n=0;      ///???? 
double shu1=0,shu2=0,shu=0;            //????


sbit EN = P1^6;
sbit RS = P1^4;
sbit RW = P1^5;
sbit duan = P2^6;
sbit wei = P2^7;
sbit gen= P3^0;
sbit fang = P3^1;

double z_s(uchar *p);
void s_z(double b);
void s_z2(double b);
void s_z1(long zheng);


void ten(unsigned int t)           //????
{
uchar i;
for(;t>0;t--)
for(i=0;i<120;i++);
}


/*****??????*****/
uchar jianpan()
{
    z='N'; //?????????,???'N'
    P3=0xfe; //?????
    temp=P3;
    temp=temp&0xf0;
    while(temp!=0xf0) //???
    {
        ten(10);
        temp=P3;
        temp=temp&0xf0;
        while(temp!=0xf0) 
        {
            temp=P3;
            switch(temp)
            {
                case 0xee:z=7;
                    break;
                case 0xde:z=8;
                    break;
                case 0xbe:z=9;
                    break;
                case 0x7e:z='+';
                    break;
            }
            while(temp!=0xf0)  //????
            {
                temp=P3;
                temp=temp&0xf0;
            }
        }
    }
    P3=0xfd; //?????  
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //???
{
ten(10);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) 
{
temp=P3;
switch(temp)
{
case 0xed:z=4;
break;
case 0xdd:z=5;
break;
case 0xbd:z=6;
break;
case 0x7d:z='-';
break;
}
      while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;   //????
}
}
}
  P3=0xfb;  //?????
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //???
{
ten(10);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:z=1;
break;
case 0xdb:z=2;
break;
case 0xbb:z=3;
break;
case 0x7b:z='*';
break;
}
      while(temp!=0xf0) //????
{
temp=P3;
temp=temp&0xf0;
}
}
}
  P3=0xf7;   //?????
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //???
{
ten(10);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:z='=';
break;
case 0xd7:z=0;
break;
case 0xb7:z='.';
break;
case 0x77:z='/';
break;
}
      while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;   //????
}
 }
}
while(fang==0)
{
if(fang==0)
{
ten(5);
if(fang==0)
{
z='^';
}
while(fang==0); //???????
}
}
while(gen==0)
{
if(gen==0)
{
ten(5);
if(gen==0)
{
z=251;
}
while(gen==0); //???????

}
}

return z;

}








void mingling(uchar a)
{
P0=a;
RS=0;
EN=0;
ten(10);
EN=1;
ten(10);
EN=0;

}

void shuju(uchar a)
{
P0=a;
RS=1;
EN=0;
ten(10);
EN=1;
ten(10);
EN=0;
}

void chushihua()
{
  RW=0;
duan=0;
wei=0;
mingling(0x38);   //??????:16???,5???,8?????
ten(20);
mingling(0x0f);   //??????
ten(20);
mingling(0x06);   //??????:????,????
ten(20);
mingling(0x01);   //?????,??????????
ten(20);
}

/*******????**********/

void zifuchuan(uchar *a)
{
while(*a)
{
shuju(*a);
a++;
}
}



////////////////////
/////??????///
////////////////////
double z_s(uchar *p)
{
char i=0,j=0;
double num=0,xiao=0,x=0,y=0;
while((*p!='.')&&*p)   //??????????
{
num=num*10+(*p-'0');
p++; 
}
for(p++,i++,j=0;*p;j++,i++,p++)
xiao=xiao*10+(*p-'0');
for(;j>0;j--)
xiao*=0.1;
num=num+xiao;

return num;
}




void s_z1(long zheng)
{

char j=0,a[20]={0};
if(zheng==0)
{
shuju('0');

return;
}
else if(zheng<0)
{
zheng=0-zheng;
shuju('-');
}
while(zheng>=1)
{
a[j]=zheng%10+'0';
zheng=zheng/10;
j++;

}

for(j=j-1;j>=0;j--)
{
shuju(a[j]);

}



}




void s_z2(double b)
{
long num;
b=b-floor(b);
if(b>0.00000009)
{
shuju('.');

num=(long)(b*1000000);
s_z1(num);
}

}

///////********D'D??*********///////

void s_z(double b)
{
long num;
if(b==0)
{
shuju('0');
return;
}
else if(b<0)
{
b=fabs(b);
shuju('-');
}
num=(long)b;
s_z1(num);
s_z2(b);

}






//////////////////////////////////////
//*********?LCD?????*********//
/*/*//*/*//*/////////////////////////*/
void weizhi(uchar x,uchar y)
{
if(y==0)
mingling(0x40+x);
else mingling(0x40+0x80+x);


}


void shuju1( unsigned x,unsigned char y,unsigned char dat)
{
weizhi( x, y ); 
shuju(dat);
}


////******************************************************???*************************************************************//
void main()

uchar i=0;
chushihua();

while(1)
{
while(1)
{
if((jianpan()!='N')&&(z>=0&&z<=9||z=='.'))
{
if(keyshu<=19)
{
if(z=='.')
shuju('.');
else 
shuju(z+'0');
}
zifu1[keyshu]=z+'0';
keyshu++; shu0++;
}
else if(z=='+'||z=='-'||z=='*'||z=='/'||z=='^'||z==251||z=='=')
{
shu1=z_s(zifu1);
shu0=shu1;
shu=shu1;
loop:
 
shu1=shu;

mingling(0x01);
s_z(shu1);

if(z!='=')shuju(z); //????

if(z==251)
{
shu1=sqrt(shu1);
shu=shu1; //????????
while(1)
{
if(jianpan()=='+'||z=='-'||z=='*'||z=='/'||z=='^'||z=='=')
{
if(z!='=')shuju(z);
break;
}

}
}
keyshu=0;                   //??????
//shuju(fuhao+'0');
fuhao=z;
break;
}
}
while(1)
{
if(z==251)break;
if(z=='=')break;
if((jianpan()!='N')&&(z>=0&&z<=9||z=='.'))
{
if(keyshu<=19)
{
if(z=='.')
shuju('.');
else
shuju(z+'0');
}
zifu2[keyshu]=z+'0';
keyshu++;
}

else if(z=='+'||z=='-'||z=='*'||z=='/'||z=='='||z==251)
{
shu2=z_s(zifu2); 
break;
}
if(z==251)
{
shu2=sqrt(shu2); //????????
while(1)
{
if(jianpan()=='+'||z=='-'||z=='*'||z=='/'||z=='^'||z=='=')
{
if(z!='=')shuju(z);
break;
}

}
}
}
if(fuhao=='^')
shu=pow(shu1,shu2);
if(fuhao=='+')
shu=shu1+shu2;
if(fuhao=='-')
shu=shu1-shu2;
if(fuhao=='*')
shu=shu1*shu2;
if(fuhao=='/')
shu=shu1/shu2;

if((shu2==0&&fuhao=='/'))
{
weizhi(0,1);
zifuchuan(cuowu);
}
if(z=='=')
{
shuju('=');
weizhi(0,1);
s_z(shu);
while(1)
{
if(jianpan()=='+'||z=='-'||z=='*'||z=='/'||z=='^'||z==251)break;
}
}

shu1=0;
shu2=0;
for(i=0;i<8;i++)
zifu1[i]=0;
for(i=0;i<8;i++)
zifu2[i]=0;            //??

if(z=='+'||z=='-'||z=='*'||z=='/'||z=='^'||z==251)
goto loop;

}
}