科学计算器
1.任务
设计制作一个科学计算器。 
2. 要求
(1)按数字 0-9 时应发出蜂鸣器声音,数越大,频率越高。 (20 分)
(2) 完成任意两位数(范围 0-99)的加减乘除运算,结果只需显示整数部分,但如果结果为负数应显示负号。 (20 分)
(3) 完成任意两位数(范围 0-99)的加减乘除运算, 结果要求有小数部分,显示为 xxxx.xxxx(小数点前不超过四位,小数点后若多于四位,只需显示四位),如果结果为负数应显示负号。 (20 分)
(4) 完成任意三位数(范围 0-999)的加减乘除运算, 结果只需显示整数部分,但如果结果为负数应显示负号。(10 分)
(5) 对任意两位整数进行开方运算,结果保留 4 位有效数字。(10 分)
(6) 请完成由三个任意二位数组成,格式为 dpdpd 形式表达式的运算(假定 d表示任意整数, p 表示任意操作符(加减乘除),x 表示单个数字, 则 dpdpd 的可能形式之一为 11/2+3)。

3.代码

#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#include<math.h>

#define uchar unsigned char
#define uint unsigned int

/************蜂鸣器*****************/
sbit beep=P3^7;

/************LCD*********************/
sbit lcden=P3^4;//液晶使能端
sbit lcdrs=P3^5;//液晶数据命令选择端

/*************按键******************/
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;

sbit key9=P2^0;
sbit key10=P2^1;
sbit key11=P2^2;
sbit key12=P2^3;
sbit key13=P2^4;
sbit key14=P2^5;
sbit key15=P2^6;
sbit key16=P2^7;

sbit key17=P3^0;
sbit key18=P3^1;
sbit key19=P3^2;
sbit key20=P3^3;

uchar array[16]={'\0','\0','\0','\0','\0','\0'};//       键盘扫描
uchar str[16]={'\0','\0','\0','\0'}; //      主函数转换

uint idata va1_ge, va1_shi,va1_bai,va1_qian,va1_wan,va2_ge,va2_shi,va2_bai,va3_ge,va3_shi;//获取操作数
uchar idata operator,operator1 ,operator2;
int   idata operator3_int,operator2_int,operator1_int,value_char,value_int,value_int_jueduizhi;//运算结果
float idata value_float;
int   idata value_int_ge, value_int_shi, value_int_bai,value_int_qian,value_int_wan,value_int_shiwan,value_int_shiwan;       //运算结果的各位
unsigned long int  value_int_long;//运算结果
int idata jj=0;//array下标,

/********函数声明*********/
void key_scan(void);

void delay(uint z);

void write_com(uchar com);
void write_data(uchar date);
void LCD_Init(void);

void beep0(void);
void beep1(void);
void beep2(void);
void beep3(void);
void beep4(void);
void beep5(void);
void beep6(void);
void beep7(void);
void beep8(void);
void beep9(void);

/*************************主函数*****************/
void main(void)
{
   int i=0;
   LCD_Init();

beep=0;//不响

while(1)
    {         
        key_scan(); 
/******************************两位数算数运算****************************/
         if(array[5]=='='&&(array[2]=='+'||array[2]=='-'||array[2]=='*'||array[2]=='/')) 
        {     
            va1_shi=array[0]-48;
            va1_ge=array[1]-48;

operator=array[2];

va2_shi=array[3]-48;
            va2_ge=array[4]-48;

operator1_int=va1_shi*10+va1_ge;// 操作数1(十)
            operator2_int=va2_shi*10+va2_ge;//操作数2(十)

switch(operator)
            {
                case '+':
                 
                value_int=operator1_int+operator2_int; //value_int(20-198)
                if(value_int<=99)
                {
                  value_int_ge= value_int%10;//取出个位数
                  str[0]=value_int_ge+48;
                  
                  value_int_shi= value_int/10;//取出十位数
                  str[1]= value_int_shi+48;

write_data(str[1]); 
                  write_data(str[0]); 
                }
                else if(value_int>=100)
                {
                  value_int_ge= value_int%10;//取出个位数
                  str[0]=value_int_ge+48;

value_int_shi= value_int/10%10;//取出十位数
                  str[1]= value_int_shi+48;

value_int_bai=value_int/100;//取出百位数
                  str[2]= value_int_bai+48;

write_data(str[2]); 
                  write_data(str[1]); 
                  write_data(str[0]); 
                }
                break;

case '-':
                value_int=operator1_int-operator2_int; //value_int(-99-99)
                if(value_int<0)
                {
                    if(value_int>-10)
                    {
                        value_int_jueduizhi=operator2_int-operator1_int;
                        str[0]=value_int_jueduizhi+48;
                        write_data('-'); 
                        write_data(str[0]); 
                    }
                    else if(value_int<-10)
                    {
                        value_int_jueduizhi=operator2_int-operator1_int;
                        str[0]=value_int_jueduizhi%10+48;
                        str[1]=value_int_jueduizhi/10+48;
                        write_data('-'); 
                        write_data(str[1]); 
                        write_data(str[0]); 
                    }
                }
                else if(value_int==0)
                {
                       write_data('0'); 
                }
               else    if(value_int>0)
               {
                    if(value_int>10)
                    {
                      value_int_ge= value_int%10;//取出个位数
                      str[6]=value_int_ge+48;
                      
                      value_int_shi= value_int/10;//取出十位数
                      str[7]= value_int_shi+48;
    
                      write_data(str[7]); 
                      write_data(str[6]); 
                    } 
                    else if(value_int<10)
                    {       
                      str[8]=value_int+48;
                      write_data(str[8]);    
                    }
                }
                break;
             case '*':

value_int=operator2_int*operator1_int;
                if(value_int<1000)
                {
                  value_int_ge= value_int%10;//取出个位数
                  str[0]=value_int_ge+48;

value_int_shi= value_int/10%10;//取出十位数
                  str[1]= value_int_shi+48;

value_int_bai=value_int/100;//取出百位数
                  str[2]= value_int_bai+48;

write_data(str[2]); 
                  write_data(str[1]); 
                  write_data(str[0]); 
                }
                else if(value_int>=1000)
                {
                  value_int_ge= value_int%10;//取出个位数
                  str[0]=value_int_ge+48;

value_int_shi= value_int/10%10;//取出十位数
                  str[1]= value_int_shi+48;

value_int_bai=value_int/100%10;//取出百位数
                  str[2]= value_int_bai+48;

value_int_qian=value_int/1000;//取出千位数
                  str[3]= value_int_qian+48;

write_data(str[3]);
                  write_data(str[2]); 
                  write_data(str[1]); 
                  write_data(str[0]); 
                }
                break;

//两位数除法运算
                case '/': //0.101010-9.9
                value_float=operator1_int/((float)operator2_int);

sprintf(str,"%1.4f",value_float);

if(operator1_int==operator2_int)
               write_data(str[0]);

else  if((str[2]!='0')&&(str[3]=='0')&&(str[4]=='0')&&(str[5]=='0'))
               {write_data(str[0]);write_data(str[1]);write_data(str[2]); }

//               if((str[2]!='0')&&(str[3]!='0')&&(str[4]=='0')&&(str[5]=='0'))
//               {write_data(str[0]);write_data(str[1]);write_data(str[2]);write_data(str[3]); }
//
//               if((str[2]!='0')&&(str[3]!='0')&&(str[4]!='0')&&(str[5]=='0'))
//                {write_data(str[0]);write_data(str[1]);write_data(str[2]);write_data(str[3]);write_data(str[4]); }
//
              else 
                {write_data(str[0]);write_data(str[1]);write_data(str[2]);write_data(str[3]);write_data(str[4]); write_data(str[5]);}
                break;
                }
                for(i=0;i<=15;i++)
                {
                      array[i]='\0';
                }
                jj=0;
        }
/******************************二进制转换********************************************************/
         else if((array[1]=='B')&&(array[2]=='='))
         {
             if(array[0]=='0')
            {
                 write_data('0'); 
                 write_data('0');
                 write_data('0');
                 write_data('0');    
            }
             if(array[0]=='1')
            {
                 write_data('0'); 
                 write_data('0');
                 write_data('0');
                 write_data('1');    
            }
                if(array[0]=='2')
            {
                 write_data('0'); 
                 write_data('0');
                 write_data('1');
                 write_data('0');    
            }
                if(array[0]=='3')
            {
                 write_data('0'); 
                 write_data('0');
                 write_data('1');
                 write_data('1');    
            }
                if(array[0]=='4')
            {
                 write_data('0'); 
                 write_data('1');
                 write_data('0');
                 write_data('0');    
            }
                if(array[0]=='5')
            {
                 write_data('0'); 
                 write_data('1');
                 write_data('0');
                 write_data('1');    
            }
                if(array[0]=='6')
            {
                 write_data('0'); 
                 write_data('1');
                 write_data('1');
                 write_data('0');    
            }
                      if(array[0]=='7')
            {
                 write_data('0'); 
                 write_data('1');
                 write_data('1');
                 write_data('1');    
            }
                if(array[0]=='8')
            {
                 write_data('1'); 
                 write_data('0');
                 write_data('0');
                 write_data('0');    
            }
                if(array[0]=='9')
            {
                 write_data('1'); 
                 write_data('0');
                 write_data('0');
                 write_data('1');    
            }
             for(i=0;i<=15;i++)
            {
                  array[i]='\0';
            }
            jj=0;
         }

/****************************三位数算数运算**********************************************************/
        else if((array[7]=='=')&&(array[4]!='.'))
        {
            va1_bai=array[0]-48; //第一个操作数的百位
            va1_shi=array[1]-48;//第一个操作数的十位
            va1_ge=array[2]-48;//第一个操作数的个位

operator=array[3];

va2_bai=array[4]-48; //第二个操作数的百位
            va2_shi=array[5]-48;//第二个操作数的十位
            va2_ge=array[6]-48;//第二个操作数的个位

operator1_int=va1_bai*100+va1_shi*10+va1_ge;
            operator2_int= va2_bai*100+va2_shi*10+va2_ge;

switch(operator)
            {
                case '+':
                value_int=operator1_int+operator2_int; //value_int(200-1998)
                if(value_int<=999)
                {
                  value_int_ge= value_int%10;//取出个位数
                  str[0]=value_int_ge+48;
                  value_int_shi= value_int/10%10;//取出十位数
                  str[1]= value_int_shi+48;
                  value_int_bai=value_int/100;//取出百位数
                  str[2]= value_int_bai+48;
                  write_data(str[2]); 
                  write_data(str[1]); 
                  write_data(str[0]); 
                }
                else if(value_int>999)
                {
                  value_int_ge= value_int%10;//取出个位数
                  str[0]=value_int_ge+48;
                  value_int_shi= value_int/10%10;//取出十位数
                  str[1]= value_int_shi+48;
                  value_int_bai=value_int/100%10;//取出百位数
                  str[2]= value_int_bai+48;
                  value_int_qian=value_int/1000;//取出千位数
                  str[3]= value_int_qian+48;
                  write_data(str[3]); 
                  write_data(str[2]); 
                  write_data(str[1]); 
                  write_data(str[0]); 
                }
                break;
            
                case '*':
                value_int_long=operator1_int*operator2_int;//操作数正确     计算结果不正确(14961) 实际998001

value_int_ge=value_int_long%10;//0
                  str[0]=value_int_ge+48;

value_int_shi=value_int_long/10%10;//5
                  str[1]=value_int_shi+48;

value_int_bai=value_int_long/100%10;//2
                  str[2]=value_int_bai+48;

value_int_qian=value_int_long/1000%10; //1
                  str[3]=value_int_qian+48;

value_int_wan=value_int_long/10000%10;//1
                  str[4]=value_int_wan+48;

value_int_shiwan=value_int_long/100000;//2 
                  str[5]=value_int_shiwan+48; //0

if(str[5]!='0')
                  {write_data(str[5]);}

write_data(str[4]); 
                  write_data(str[3]); 
                  write_data(str[2]); 
                  write_data(str[1]); 
                  write_data(str[0]);
                break;

case '/':
                if((operator1_int==999)&&(operator2_int==100)) write_data('9');

else
                {
                    value_float=operator1_int/(float)operator2_int;
                    sprintf(str,"%1.2f",value_float);
    
                    write_data(str[0]);    
                 }
                break;

case '-':
                value_int=operator1_int-operator2_int;
                if((value_int>=0)&&(value_int<10))
                {
                   str[0]=value_int+48;
                    write_data(str[0]); 
                }
                else if((value_int>=10)&&(value_int<100))
                {
                  value_int_ge=value_int%10;
                  str[0]=value_int_ge+48;

value_int_shi=value_int/10;
                  str[1]=value_int_shi+48;

write_data(str[1]); 
                write_data(str[0]); 
                }
                else if(value_int>=100)
                {
                    value_int_ge=value_int%10;
                  str[0]=value_int_ge+48;

value_int_shi=value_int/10%10;
                  str[1]=value_int_shi+48;

value_int_bai=value_int/100;
                  str[2]=value_int_bai+48;

write_data(str[2]); 
                 write_data(str[1]); 
                 write_data(str[0]);

}
                else if((-10<value_int)&&(value_int<0))
                {
                value_int_jueduizhi=operator2_int-operator1_int;

str[0]=value_int_jueduizhi+48;
                write_data('-');
                write_data(str[0]); 
                }

else if((-100<value_int)&&(value_int<=-10))
                {
                 value_int_jueduizhi=operator2_int-operator1_int;
                 
                 value_int_ge=value_int_jueduizhi%10;
                 str[0]=value_int_ge+48;
                 value_int_shi=value_int_jueduizhi/10;
                 str[1]=value_int_shi+48;
                 
                write_data('-');
                write_data(str[1]); 
                write_data(str[0]); 
                }

else if(value_int<=-100)
                {
                  value_int_jueduizhi=operator2_int-operator1_int;

value_int_ge=value_int_jueduizhi%10;//
                  str[0]=value_int_ge+48;

value_int_shi=value_int_jueduizhi/10%10;
                  str[1]=value_int_shi+48;

value_int_bai=value_int_jueduizhi/100;
                  str[2]=value_int_bai+48;
                write_data('-');
                write_data(str[2]); 
                write_data(str[1]); 
                write_data(str[0]); 
    
                }
                break;
            }
           for(i=0;i<=15;i++)
            {
                  array[i]='\0';
            }
            jj=0;
        }
/****************************************对两位整数进行开方运算*************************************/
        else if(array[2]=='K'&&array[3]=='=')
        {
            va1_shi=array[0]-48;
            va1_ge=array[1]-48;
            value_int=va1_shi*10+va1_ge;
            value_float=sqrt(value_int);
            
            sprintf(str,"%1.4f",value_float);
                 write_data(str[0]); 
                 write_data(str[1]); 
                 write_data(str[2]);
                 write_data(str[3]);
                 write_data(str[4]);

for(i=0;i<=15;i++)
            {
                  array[i]='\0';
            }
                jj=0;                
        }
/*****************正弦函数******************************************************/
        else if(array[0]=='S')
        {
            /****************一位整数****************/
            if(array[2]=='=')
            {
                  value_int=array[1]-48;
                  value_float= value_int*(3.141592/180);//弧度
                  value_float=sin(value_float);
                  sprintf(str,"%1.6f",value_float);
                      
                  write_data(str[0]); 
                    write_data(str[1]); 
                    write_data(str[2]);
                    write_data(str[3]);
                    write_data(str[4]);
                   write_data(str[5]);
                    write_data(str[6]);
                    write_data(str[7]);

for(i=0;i<=15;i++)
                    {
                      array[i]='\0';
                    }
                       jj=0;    
            }

/****************两位整数****************/
            else if(array[3]=='=')
            {
                va1_shi=array[1]-48;
                va1_ge=array[2]-48;
                value_int=va1_shi*10+va1_ge;//度数
                value_float= value_int*(3.141592/180);//弧度
                value_float=sin(value_float);
                sprintf(str,"%1.6f",value_float);
                     
                
                    write_data(str[0]); 
                    write_data(str[1]); 
                    write_data(str[2]);
                    write_data(str[3]);
                    write_data(str[4]);
                   write_data(str[5]);
                    write_data(str[6]);
                    write_data(str[7]);
               
                for(i=0;i<=15;i++)
                {
                  array[i]='\0';
               }
                   jj=0;    
            }
           /***********************三位整数***********************/
            else if(array[4]=='=')
            {
                va1_shi=array[2]-48;
                va1_ge=array[3]-48;
                va1_bai=array[1]-48;
                value_int=va1_bai*100+va1_shi*10+va1_ge;//度数

value_float=value_int*(3.141592/180);//弧度
                value_float=sin(value_float);
                sprintf(str,"%1.5f",value_float);
                
                    write_data(str[0]); 
                    write_data(str[1]); 
                    write_data(str[2]);
                    write_data(str[3]);
                    write_data(str[4]);
                    write_data(str[5]);
                    write_data(str[6]);    
                
                for(i=0;i<=15;i++)
                {
                  array[i]='\0';
               }
                   jj=0;    
            }              
            /***********************小数点前1位***********************/
            else if((array[2]=='.')&&(array[5]=='='))
            {
                va1_shi=array[3]-48;
                va1_ge=array[4]-48;
                va1_bai=array[1]-48;
                value_float=va1_bai+va1_shi*0.1+va1_ge*0.01;//度数

value_float=value_float*(3.141592/180);//弧度
                value_float=sin(value_float);
                sprintf(str,"%1.5f",value_float);
                
                    write_data(str[0]); 
                    write_data(str[1]); 
                    write_data(str[2]);
                    write_data(str[3]);
                    write_data(str[4]);
                    write_data(str[5]);
                    write_data(str[6]);    
                
                for(i=0;i<=15;i++)
                {
                  array[i]='\0';
               }
                   jj=0;    
                    
            }
            /***********************小数点前2位***********************/
            else if((array[3]=='.')&&(array[6]=='='))
            {
                va1_shi=array[2]-48;
                va1_ge=array[5]-48;
                va1_bai=array[4]-48;
                va1_qian=array[1]-48;
                value_float=va1_qian*10+va1_bai+va1_shi*0.1+va1_ge*0.01;//度数

value_float=value_float*(3.141592/180);//弧度
                value_float=sin(value_float);
                sprintf(str,"%1.5f",value_float);
                
                    write_data(str[0]); 
                    write_data(str[1]); 
                    write_data(str[2]);
                    write_data(str[3]);
                    write_data(str[4]);
                    write_data(str[5]);
                    write_data(str[6]);    
                
                for(i=0;i<=15;i++)
                {
                  array[i]='\0';
               }
                   jj=0;    
                    
            }
               /***********************小数点前3位***********************/
            else if((array[4]=='.')&&(array[7]=='='))
            {
                va1_shi=array[5]-48;
                va1_ge=array[6]-48;
                va1_bai=array[3]-48;
                va1_qian=array[2]-48;
                va1_wan=array[1]-48;
                value_float=va1_wan*100+va1_qian*10+va1_bai+va1_shi*0.1+va1_ge*0.01;//度数

value_float=value_float*(3.141592/180);//弧度
                value_float=sin(value_float);
                sprintf(str,"%1.5f",value_float);
                
                    write_data(str[0]); 
                    write_data(str[1]); 
                    write_data(str[2]);
                    write_data(str[3]);
                    write_data(str[4]);
                    write_data(str[5]);
                    write_data(str[6]);    
                
                for(i=0;i<=15;i++)
                {
                  array[i]='\0';
               }
                   jj=0;    
            }
        }
      /****************第六问  两位操作数 (加 减 塍 除) 两位操作数 (加 减 塍 除)两位操作数*******************/
       else if(array[8]=='=')
       {
                 va1_shi=array[0]-48;
              va1_ge=array[1]-48;
              operator1_int=va1_shi*10+va1_ge;//操作数1

operator1=array[2];
              operator2=array[5];

va2_ge=array[4]-48;
              va2_shi=array[3]-48;
              operator2_int=va2_shi*10+va2_ge;//操作数2

va3_ge=array[7]-48;
              va3_shi=array[6]-48;
              operator3_int=va3_shi*10+va3_ge;//操作数3

if(operator1=='/')
              {
                    /******先除 再加  范围10.0101-108.9000**********/
                     if(operator2=='+')
                   {        
                       value_float=(operator1_int/(float)operator2_int)+operator3_int;
                       sprintf(str,"%.4f",value_float);
                    
                    write_data(str[0]);
                    write_data(str[1]); 
                    write_data(str[2]);
                    write_data(str[3]);
                    write_data(str[4]);    
                    write_data(str[5]);
                    write_data(str[6]);
                    write_data(str[7]);    
                    write_data(str[8]);    
                    write_data(str[9]);    
                   }
                       /******先除 再除****范围0.0010-0.9900******/
                    if(operator2=='/')
                  {
                            value_float=(operator1_int/(float)operator2_int)/operator3_int;

sprintf(str,"%.6f",value_float);
                    
                    write_data(str[0]); 
                    write_data(str[1]);
                    write_data(str[2]);
                    write_data(str[3]);
                    write_data(str[4]);
                    write_data(str[5]);
                    
                  }
                    /******先除 再乘以****范围1.0100-980.1******/
                   else    if(operator2=='*')
                    {
                               value_float=(operator1_int/(float)operator2_int)*operator3_int;
                            sprintf(str,"%.6f",value_float);

write_data(str[0]); 
                                write_data(str[1]);
                                write_data(str[2]);
                                write_data(str[3]);
                                write_data(str[4]);
                                write_data(str[5]);
                    }
                    /******先除 再减****范围1.0100-980.1******/
                    else if(operator2=='-')
                    {
                               value_float=(operator1_int/(float)operator2_int)-operator3_int;
                            sprintf(str,"%.6f",value_float);

write_data(str[0]); 
                                write_data(str[1]);
                                write_data(str[2]);
                                write_data(str[3]);
                                write_data(str[4]);
                                write_data(str[5]);
                                write_data(str[6]);
                                write_data(str[7]);
                                write_data(str[8]);
                    }
              }
                  else if(operator1=='*')
                  {
                          /******先乘 再加  *******0**********/
                         if(operator2=='+')
                       {        
                        value_int=operator1_int*operator2_int+operator3_int;
                        sprintf(str,"%.6d",value_int);
                        
                        write_data(str[0]); 
                        write_data(str[1]);
                        write_data(str[2]);
                        write_data(str[3]);
                        write_data(str[4]);
                        write_data(str[5]);
                       }
                       /******先乘 再除  **********0**********/
                       else if(operator2=='/')
                      {
                           value_float=(operator1_int*(float)operator2_int)/operator3_int;
                           sprintf(str,"%.4f",value_float);
                        
                        write_data(str[0]);
                        write_data(str[1]); 
                        write_data(str[2]);
                        write_data(str[3]);
                        write_data(str[4]);    
                        write_data(str[5]);
                        write_data(str[6]);
                        write_data(str[7]);    
                        write_data(str[8]);    
                        write_data(str[9]);
                     }
                      /******先乘 再减  **********0**********/
                     else if(operator2=='-')
                    {
                               value_int=operator1_int*operator2_int-operator3_int;
                            sprintf(str,"%d",value_int);

write_data(str[0]); 
                                write_data(str[1]);
                                write_data(str[2]);
                                write_data(str[3]);
                    }    
                  }
              else if(operator1=='+')
              {
                      /******先加 再加  *******0**********/
                   if(operator2=='+')
                   {        
                        value_int=operator1_int+operator2_int+operator3_int;
                        if(value_int<100)
                        {     sprintf(str,"%d",value_int);
                             write_data(str[0]); 
                             write_data(str[1]);
                        }
                        else 
                        {
                           sprintf(str,"%d",value_int);
                             write_data(str[0]); 
                             write_data(str[1]);
                             write_data(str[2]);    
                        }
                  }
                      /******先加 再减  *******0**********/    
                   else if(operator2=='-')
                    {
                               value_int=operator1_int+operator2_int-operator3_int;
                            if(value_int<0)
                            {
                                if(value_int<-10)
                                {
                                    sprintf(str,"%d",value_int);
                                     write_data(str[0]); 
                                     write_data(str[1]);
                                     write_data(str[2]);    
                                }

else
                                {
                                    sprintf(str,"%d",value_int);
                                     write_data(str[0]); 
                                     write_data(str[1]);
                                }
                            }
                            if(value_int>0)
                            {
                                if(value_int<10)
                                {
                                    sprintf(str,"%d",value_int);
                                     write_data(str[0]); 
                                }
                                else if(value_int>=100)
                                {
                                    sprintf(str,"%d",value_int);
                                     write_data(str[0]); 
                                     write_data(str[1]);
                                     write_data(str[2]);
                                }
                                else
                                {
                                    sprintf(str,"%d",value_int);
                                    write_data(str[0]); 
                                    write_data(str[1]);
                                }
                            }
                    }    
                /******************先加 再乘*************/
                       else    if(operator2=='*')
                        {  
                           value_int=operator1_int+operator2_int*operator3_int;
                            if(value_int<1000)
                            {
                                sprintf(str,"%d",value_int);
                                write_data(str[0]); 
                                write_data(str[1]);
                                write_data(str[2]);    
                            }
                             else 
                            {    sprintf(str,"%d",value_int);
                                write_data(str[0]); 
                                write_data(str[1]);
                                write_data(str[2]);
                                write_data(str[3]);    
                            }
                        }
                        /******先加 再除*************/
                     else if(operator2=='/')
                      {
                          value_float=operator1_int+operator2_int/(float)operator3_int;

sprintf(str,"%.4f",value_float);
                        
                        write_data(str[0]);
                        write_data(str[1]); 
                        write_data(str[2]);
                        write_data(str[3]);
                        write_data(str[4]);    
                        write_data(str[5]);
                        write_data(str[6]);
                        write_data(str[7]);    
                        write_data(str[8]);    
                        write_data(str[9]);
                     }
              }
              else if(operator1=='-')
              {
                /**********************先减 再加  *******0**********/
                   if(operator2=='+')
                   {        
                        value_int=operator1_int-operator2_int+operator3_int;
                        if(value_int>0)
                        {     
                                if(value_int<10)
                                {
                                 sprintf(str,"%d",value_int);
                                 write_data(str[0]); 
                                }
                                else if(value_int<100)
                                {
                                 sprintf(str,"%d",value_int);
                                 write_data(str[0]); 
                                 write_data(str[1]); 
                                }
                                else 
                                {
                                 sprintf(str,"%d",value_int);
                                 write_data(str[0]); 
                                 write_data(str[1]);
                                 write_data(str[2]);
                                }
                        }
                        else 
                        {
                               if(value_int>-10)
                                {
                                 sprintf(str,"%d",value_int);
                                 write_data(str[0]); 
                                 write_data(str[1]);
                                }

else 
                                {
                                  sprintf(str,"%d",value_int);
                                  write_data(str[0]); 
                                  write_data(str[1]);
                                  write_data(str[2]);
                                }
                        }
                  }
                  /**********************先减 再减  *******0**********/
                else  if(operator2=='-')
                  {
                   value_int=operator1_int-operator2_int-operator3_int;
                      if(value_int>0)
                    {
                        if(value_int<10)
                        {
                            sprintf(str,"%d",value_int);
                            write_data(str[0]);
                        }
                        else
                        {
                                sprintf(str,"%d",value_int);
                            write_data(str[0]); write_data(str[1]);
                        }

}
                    else if(value_int==0) write_data('0');
                    else
                    {
                        if(value_int>-10)
                        {
                            sprintf(str,"%d",value_int);
                            write_data(str[0]);
                            write_data(str[1]);
                        }
                        else if(value_int<-100)
                        {
                            sprintf(str,"%d",value_int);
                            write_data(str[0]);
                            write_data(str[1]);
                            write_data(str[2]);
                            write_data(str[3]);
                        }
                        else
                        {
                            sprintf(str,"%d",value_int);
                            write_data(str[0]);
                            write_data(str[1]);
                            write_data(str[2]);
                        }    
                    }
                  }            
                  /**********************先减 再乘 范围是-9791到-1 *******0**********/
                  else if(operator2=='*')
                  {
                      value_int=operator1_int-operator2_int*operator3_int;
                    if(value_int>-10) //6
                    {
                       sprintf(str,"%d",value_int);
                       write_data(str[0]);
                       write_data(str[1]);
                    }
                    else if    (value_int>-100)
                    {
                     sprintf(str,"%d",value_int);
                     write_data(str[0]);
                     write_data(str[1]);
                     write_data(str[2]);
                    }
                    else if    (value_int>-1000)
                    {
                      sprintf(str,"%d",value_int);
                     write_data(str[0]);
                     write_data(str[1]);
                     write_data(str[2]);
                     write_data(str[3]);
                    }
                    else
                    {
                     sprintf(str,"%d",value_int);
                     write_data(str[0]);
                     write_data(str[1]);
                     write_data(str[2]);
                     write_data(str[3]);
                     write_data(str[4]);
                    }

}
  /**********************先减 再除 范围是 *******0**********/
                  else if(operator2=='/')
                  {
                          value_float=operator1_int-operator2_int/(float)operator3_int;

if(value_float<1)
                        {        
                           sprintf(str,"%.6f",value_float);
                            write_data(str[0]);
                            write_data(str[1]);
                            write_data(str[2]);    
                        }
    
                        else if(value_float<10)    
                        {    
                            sprintf(str,"%.6f",value_float);
                            write_data(str[0]);
                            write_data(str[1]);
                            write_data(str[2]);    
                        }
                        else
                        {
                            sprintf(str,"%.6f",value_float);
                             write_data(str[0]);
                             write_data(str[1]);
                             write_data(str[2]);
                             write_data(str[3]);
                             write_data(str[4])    ;
                             write_data(str[5])     ;
                        }
                  }
              }
                 for(i=0;i<=15;i++)
               {
                  array[i]='\0';
               }
               jj=0;    
       }  
         /****************  二位操作数 (加 减 塍 除) 一位操作数 (加 减 塍 除)二位操作数*******************/

/****************  一位操作数 (加 减 塍 除) 一位操作数 (加 减 塍 除)一位操作数*******************/
          else if(array[5]=='=')
          {
              operator1_int=array[0]-48;//操作数1

operator1=array[1];
              operator2=array[3];

operator2_int=array[2]-48;;//操作数2

operator3_int=array[4]-48;//操作数3
               if( operator1=='+')
               {
               /**********加 加*************/
                       if(operator2=='+')
                    {
                             value_int=operator1_int+operator2_int+operator3_int;
                            if(value_int<10)
                            {
                                sprintf(str,"%d",value_int);
                             write_data(str[0]);
                            }
                            else 
                            {
                             sprintf(str,"%d",value_int);
                             write_data(str[0]);
                             write_data(str[1]);
                            }
                    }
            /********加*减*************/
                    else if(operator2=='-')
                    {
                          value_int=operator1_int+operator2_int-operator3_int;
                          if(value_int>0)
                          {
                              if(value_int<10)
                            {
                              str[0]=value_int+48;
                             write_data(str[0]);
                             }
                            else 
                            {
                             sprintf(str,"%d",value_int);
                             write_data(str[0]);
                             write_data(str[1]);
                            }
                          }
                          else 
                          {
                               sprintf(str,"%d",value_int);
                             write_data(str[0]);
                             write_data(str[1]);
                          }
                    }
                    /********加*乘**(0-90)***********/
                    else if(operator2=='*')
                    {
                         value_int=operator1_int+operator2_int*operator3_int;
                         if(value_int<10)
                         {      
                            str[0]=value_int+48;
                              write_data(str[0]);
                         }
                         else
                         {
                              sprintf(str,"%d",value_int);
                             write_data(str[0]);
                             write_data(str[1]);
                         }
                    }
                       /********加*除(0-18)*************/
                    else if(operator2=='/')
                    {
                        value_float=operator1_int+operator2_int/(float)operator3_int;
                        if(value_float<10)
                        {
                            sprintf(str,"%f",value_float);

write_data(str[0]);
                             write_data(str[1]);
                             write_data(str[2]);
                             write_data(str[3]);
                        }
                        else 
                        {
                                      sprintf(str,"%f",value_float);
                            write_data(str[0]);
                             write_data(str[1]);
                             write_data(str[2]);
                             write_data(str[3]);
                        }
                    }
               }
               else if(operator1=='-')
               {
                 /*********************先减 在加***********************************/
                    if(operator2=='+')
                 {
                     value_int=operator1_int-operator2_int+operator3_int;
                    if(value_int<0)
                    {
                        sprintf(str,"%d",value_int);
                        write_data(str[0]);
                        write_data(str[1]);
                    }
                    
                    else if(value_int==0)
                    {
                         write_data('0');
                    }
                    else 
                    {     
                        if(value_int<10)
                        {
                            str[2]= value_int+48;
                            write_data(str[2]);
                        }
                        else
                        {
                            sprintf(str,"%d",value_int);
                            write_data(str[0]);
                            write_data(str[1]);
                        }
                    }
                 }
                 /*********************先减 再减***********************************/
                 else if(operator2=='-')
                 {
                         value_int=operator1_int-operator2_int-operator3_int;
                    if(value_int<0)
                    {
                       if(value_int>-10)
                       {
                           sprintf(str,"%d",value_int);
                            write_data(str[0]);
                            write_data(str[1]);
                       }
                       else 
                       {
                             sprintf(str,"%d",value_int);
                            write_data(str[0]);
                            write_data(str[1]);
                            write_data(str[2]);

}
                    }
                    
                    else if(value_int==0)
                    {
                          write_data('0');
                    }
                    else 
                    {
                       str[0]= value_int+48;
                       write_data(str[0]);
                    }
                 }
                 /*********************先减 再乘***********************************/
                 else if(operator2=='*')
                 {
                          value_int=operator1_int-operator2_int*operator3_int;
                         if(value_int>0)
                         {
                          str[0]= value_int+48;
                          write_data(str[0]);
                         }
                         
                         else if(value_int==0)
                         {
                                 write_data('0');
                         }

else
                         {
                             sprintf(str,"%d",value_int);
                            write_data(str[0]);
                            write_data(str[1]);
                         }
                 }
                 /*********************先减 再除***********************************/
                 else if(operator2=='/')
                 {
                     value_float=operator1_int-operator2_int/(float)operator3_int;
                    if(value_float>0)
                    {      
                    sprintf(str,"%f",value_float);
                            write_data(str[0]);
                            write_data(str[1]);
                            write_data(str[2]);
                            write_data(str[3]);
                    }
                    else
                    {
                           sprintf(str,"%f",value_float);
                            write_data(str[0]);
                            write_data(str[1]);
                            write_data(str[2]);
                            write_data(str[3]);
                                write_data(str[4]);
                                    write_data(str[5]);
                    }
                 }
               }
                for(i=0;i<=15;i++)
               {
                  array[i]='\0';
               }
               jj=0;
          }

}
}

void  key_scan(void)
{
    uchar skey;

if(key1==0)
     {
        delay(10);
        if(key1==0)
        {
          skey = '7'; 
          array[jj++]=skey;
          beep7();
        }
      while(!key1);    
       write_data(skey); 
      }

if(key2==0)
      {
       delay(10);
       if(key2==0)
       {
              skey = '4'; 
           array[jj++]=skey;
           beep4();
       }
          while(!key2);
         write_data(skey);    
      }

if(key3==0)
       {
             delay(10);
          if(key3==0)
          {
              skey = '1'; 
           array[jj++]=skey;
               beep1();
          }
          while(!key3);
         write_data(skey);
       }

if(key4==0)
       {
             delay(10);
          if(key4==0)
        {
              skey = '.'; 
           array[jj++]=skey;
        }
          while(!key4);
         write_data(skey);
       }

if(key5==0)
       {
             delay(10);
          if(key5==0)
          {
              skey = '8'; 
           array[jj++]=skey;
           beep8();
          }
           while(!key5);
         write_data(skey);
       }

if(key6==0)
       {
             delay(10);
          if(key6==0)
          {
              skey = '5'; 
           array[jj++]=skey;
           beep5();
          }
           while(!key6);
         write_data(skey);
       }

if(key7==0)
       {
             delay(10);
          if(key7==0)
          {
              skey = '2'; 
           array[jj++]=skey;
           beep2();
          }
           while(!key7);
         write_data(skey);
       }

if(key8==0)
       {
             delay(10);
          if(key8==0)
          {
              skey = '0'; 
           array[jj++]=skey;
           beep0();
          }
           while(!key8);
         write_data(skey);
       }

if(key9==0)
       {
             delay(10);
          if(key9==0)
          {
              skey = '9'; 
           array[jj++]=skey;
           beep9();
          }
           while(!key9); 
         write_data(skey);
       }
        if(key10==0)
       {
             delay(10);
          if(key10==0)
          {
              skey = '6'; 
           array[jj++]=skey;
           beep6();
          }
           while(!key10);
         write_data(skey);
       }

if(key11==0)
       {
             delay(10);
          if(key11==0)
          {
              skey = '3'; 
           array[jj++]=skey;
           beep3();
          }
           while(!key11);
         write_data(skey);
       }

if(key12==0)
       {
             delay(10);
          if(key12==0)
          {
              skey = '='; 
           array[jj++]=skey;
          }
           while(!key12);
         write_data(skey);
       }

if(key13==0)
       {
             delay(10);
          if(key13==0)
          {
              skey = '/'; 
           array[jj++]=skey;
          }
           while(!key13);
         write_data(skey);
       }

if(key14==0)
       {
             delay(10);
          if(key14==0)
          {
              skey = '*'; 
           array[jj++]=skey;
          }
           while(!key14);
         write_data(skey);
       }

if(key15==0)
       {
             delay(10);
          if(key15==0)
          {
              skey = '-'; 
           array[jj++]=skey;
          }
           while(!key15);
         write_data(skey);
       }

if(key16==0)
       {
             delay(10);
          if(key16==0)
          {
              skey = '+'; 
           array[jj++]=skey;
          }
           while(!key16);
         write_data(skey);
       }

if(key17==0)
       {
             delay(10);
          if(key17==0)
          {
              skey = 'C'; 
           array[jj++]=skey;
          }    
          write_data(skey);
          delay(100);
          
           while(!key17);     write_com(0x01);//显示清屏
         jj=0;
       }

if(key18==0)
       {
             delay(10);
          if(key18==0)
          {
              skey = 'K'; 
           array[jj++]=skey;
          }
           while(!key18);
         write_data(skey);
       }

if(key19==0)
       {
             delay(10);
          if(key19==0)
          {
              skey = 'B'; 
           array[jj++]=skey;
          }
           while(!key19);
         write_data(skey);
       }

if(key20==0)
       {
             delay(10);
          if(key20==0)
          {
              skey = 'S'; 
           array[jj++]=skey;
          }
           while(!key20);
         write_data(skey);
         write_data('i');
         write_data('n');
       }

}

void beep0(void)
{
    uchar i,j;
    for(i=0;i<125;i++)
    {
        beep=!beep;
        for(j=0;j<200;j++)
        _nop_();
    }
    beep=0;//关闭蜂鸣器
}
void beep1(void)
{
    uchar i,j;
    for(i=0;i<125;i++)
    {
        beep=!beep;
        for(j=0;j<180;j++)
        _nop_();
    }
    beep=0;//关闭蜂鸣器
}

void beep2(void)
{
          uchar i,j;
    for(i=0;i<125;i++)
    {
        beep=!beep;
        for(j=0;j<80;j++)
        _nop_();
    }
    beep=0;//关闭蜂鸣器
}

void beep3(void)
{
    uchar i,j;
    for(i=0;i<125;i++)
    {
        beep=!beep;
        for(j=0;j<140;j++)
        _nop_();
    }
    beep=0;//关闭蜂鸣器
}
 void beep4(void)
{
    uchar i,j;
    for(i=0;i<125;i++)
    {
        beep=!beep;
        for(j=0;j<120;j++)
        _nop_();
    }
    beep=0;//关闭蜂鸣器
}
 void beep5(void)
{
    uchar i,j;
    for(i=0;i<125;i++)
    {
        beep=!beep;
        for(j=0;j<100;j++)
        _nop_();
    }
    beep=0;//关闭蜂鸣器
}

void beep6(void)
{
          uchar i,j;
    for(i=0;i<125;i++)
    {
        beep=!beep;
        for(j=0;j<200;j++)
        _nop_();
    }
    beep=0;//关闭蜂鸣器

}

void beep7(void)
{
    uchar i,j;
    for(i=0;i<125;i++)
    {
        beep=!beep;
        for(j=0;j<160;j++)
        _nop_();
    }
    beep=0;//关闭蜂鸣器
}

void beep8(void)
{
    uchar i,j;
    for(i=0;i<125;i++)
    {
        beep=!beep;
        for(j=0;j<240;j++)
        _nop_();
    }
    beep=0;//关闭蜂鸣器
}
 void beep9(void)
{

uchar i,j;
    for(i=0;i<125;i++)
    {
        beep=!beep;
        for(j=0;j<160;j++)
        _nop_();
    }
    beep=0;//关闭蜂鸣器
}  
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

void write_com(uchar com)
{
    lcdrs=0;//选择写命令模式
    P0=com;//将要写的命令字送到数据总线上
    delay(5);//稍作延时以待数据稳定
    lcden=1;//使能端给一高电平
    delay(5);//稍作延时
       lcden=0;//使能端置1以完成高脉冲
}

void write_data(uchar date)
{
   lcdrs=1;//选择写数据模式    
   P0=date;//将要写的数据字送到数据总线上
   delay(5);
   lcden=1;// 使能端给一高电平
   delay(5);
   lcden=0;//使能端置1以完成高脉冲
}

void LCD_Init(void)
{
    lcden=0;//液晶使能端为低电平
    /*显示模式设置*/
    write_com(0x38);//16*2显示 5*7点阵 8位数据接口
    /*显示开/关及光标设置*/
    write_com(0x0c);//设置开显示,不显示光标
    write_com(0x06);//写一个字符后地址指针加1,整屏显示不移动
    write_com(0x01);//显示清0,数据指针清0

write_com(0x80);//第一行显示
}

基于51单片机的科学计算器相关推荐

  1. c语言51单片机计算器,新基于51单片机的简易计算器

    <新基于51单片机的简易计算器>由会员分享,可在线阅读,更多相关<新基于51单片机的简易计算器(24页珍藏版)>请在人人文库网上搜索. 1.基于51单片机的简易计算器1.前言: ...

  2. 基于51单片机的简单计算器

    在上一篇中,我们已经说过了基于51单片机的简单拨号器,在下边,我们将写一个计算器程序,原理很简单,只需要在拨号器的基础上,算出拨号器所表示的数字,并进行计算即可. 代码如下: #include&quo ...

  3. 基于51单片机的简易计算器的实现

    目录 一.硬件简介 1.LCD1602液晶显示器介绍 (1)LCD1602的组成 (2)各引脚功能介绍 (3)DDRAM 2.矩阵按键介绍 (1)矩阵按键的优点: (2)原理: (3)检测方法: (4 ...

  4. 基于51单片机的智能计算器Protues仿真设计

    目录 一.设计背景 二.实现功能 三.硬件设计 3.1 总体硬件设计 ​3.2 键盘电路的设计 3.3 显示电路的设计 四.仿真演示 五.源程序 一.设计背景 随着社会的发展,科学的进步,人们的生活水 ...

  5. 基于51单片机的智能计算器

    其实,说智能也不算智能,就是在计算器上加上了日历.时钟和温度显示而已.具体用到的也是51很基础的模块,一个键盘,一个1602,温度显示那块用到了DS18B20,硬件调试的部分也很少,主要是代码的书写. ...

  6. 基于51单片机的矩阵计算器设计

    当初本科的毕业设计不是很完美,一直想把它完善一下,这学期刚开始有点时间,就以一个小项目的方式,综合自己这一年多来的代码阅读收获,重写了这个工程. 一,平台的重新搭建 Ø  在win7上重新安装了pro ...

  7. 51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告)

    本设计: 基于51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告) 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号S0001 芯片可以替换为 ...

  8. 利用c51进行数模转换并在液晶屏上显示_基于C51单片机的智能计算器、矩阵键盘、lcd1602...

    目录 1绪论.............................................................................................. ...

  9. 51单片机计算器_基于51单片机的倒计时温度检测报警器

    基于51单片机的倒计时温度检测报警器 学习单片机断断续续半年了,在学长学姐的教学帮助下,完成了51单片机的入门学习,开始实践做项目,在一周时间内设计和制作出个人项目.起初,我设计和选择的是12864显 ...

最新文章

  1. 独家 | 几个Jupyter笔记本的使用技巧
  2. 2018.07.30 巴别时代
  3. Flex 布局 - 容器
  4. 高带宽低性能服务器,国外大带宽低延迟服务器首选天下数据美国服务器
  5. ReactJs 第三章 React元素的渲染
  6. 安装ceston8出现timeout_瓦罗兰特Valorant:显示逾时怎么办 瓦罗兰特time out解决
  7. [代码]获取源页的控件值
  8. spring boot 教程(三)配置详解
  9. PHP表单入库处理,ThinkPHP收集表单数据入库操作(三种方式)
  10. Win2003(R2 SP2)服务器纯净版系统
  11. 小爬需登录的网站之麦子学院
  12. HFSS天线设计实例_不同介质的BLE S11曲线
  13. 通过Kali模拟CC攻击进行WEB压力测试实操
  14. CODESYS 控制虚拟单轴运动
  15. APK Multi-Tool强大的APK反编译工具终极教程
  16. 舞魔金星[读书笔记]
  17. premiere cs6导出视频格式
  18. Android OCR数字识别
  19. 目标跟踪之数据标注软件ViBAT使用指导
  20. 百度飞桨和文心大模型助力,中康科技重构医疗科研大数据治理

热门文章

  1. Hopsan教程1-快速入门
  2. 正则手机号码校验11位,13,14,15,16,17,18,19开头
  3. 翻译-服务注册与发现
  4. 计算机组成原理试卷分析,计算机组成原理试卷分析.doc
  5. 使用《红孩儿工具箱》开发基于Cocos2d-x的《坦克大战》游戏
  6. yui java 右键_给YUI Compressor添加右键命令,完成快捷压缩
  7. 网页版github上新建文件夹
  8. 软件外包公司软件测试面试题
  9. java采集_Java实现一个小说采集程序的简单实例
  10. push和pop的区别?