基于51单片机的科学计算器

科学计算器
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);//第一行显示
}

猜你喜欢

转载自blog.csdn.net/Qinlong_Stm32/article/details/84503016