找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1994|回复: 0
收起左侧

51单片机计算器(带括号)

[复制链接]
ID:951290 发表于 2021-7-20 17:41 | 显示全部楼层 |阅读模式
随便看看,发现我真菜,大体都可以了,一部分小问题懒得改......
没有备注


#include "reg51.h"
#include "intrins.h"
#include "1602.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>

typedef unsigned char u8;
typedef unsigned int u16;

#define juzhen_key P1
#define juzhen_dig P0

sbit k1=P3^1;        
sbit k2=P3^0;         
sbit k3=P3^2;     
sbit k4=P3^3;   
sbit led=P2^4;

char dall[16]="                ";
char Disp[16]="                ";
char desip[16]="                ";
u8 keyvalue;
u8 wei=0;
u8 error=0;           
float count[15];
char stytem[15];
bit flag=0;
bit pack=0;
bit flag1=0;  



void delay(u16 i)
{
        while(i--);
}

float text(u8 j,u8 k)     //     1  8
{
    u8 a,pointIndex=j,x=j,sec=0;
    float tuer=0.0;
    float p =0.0;
    int y=0;
    for(a=j;a<k;a++)
    {
        if(dall[a]=='.')
        {
        sec=1;
        break;
        }
    }
    if(sec==1)
    {
    while(x<k)
     {
       if(dall[x++]=='.')
       break;
       pointIndex++;
     }              //   1
     if(dall[j]=='-')
      {
          for(a=j+1;a<k;a++)
          {
             if(a<pointIndex)
              {
                   tuer=tuer*10+(dall[a]-48);
              }
            if(a>pointIndex)
             {
                  y--;
                  p=pow(10,y);
                  tuer+=(dall[a]-48)*p;
             }
             tuer=tuer*(-1);
      }
      }
        else if(dall[j]!='-')
        {

              for(a=j;a<k;a++)
          {
             if(a<pointIndex)
              {
                   tuer=tuer*10+(dall[a]-48);
              }
            if(a>pointIndex)
             {
                  y--;
                  p=pow(10,y);
                  tuer=tuer+(dall[a]-48)*p;
             }
      }
        }
}
else if(sec==0)
{
    if(dall[j]=='-')
    {
          for(a=j+1;a<k;a++)
              {
            tuer=tuer*10+(dall[a]-48);
              }
    }
     else if (dall[j]!='-')
        {
            for(a=j;a<k;a++)
              {
              tuer=tuer*10+(dall[a]-48);
              }
        }
    if(dall[j]=='-')
    {
        tuer=tuer*(-1);
    }        
}
return tuer;
}


void process(u8 i, u8 j)       //??ò?×éà¨o?à?μ?êy?Y??DD′|àí          12   1
{
        u8 k,e=0,hear_begin=j,p;
        u8 hic=0;
        for(k=j+1;k<=i;k++)      //  7
                {
                        if(dall[k]=='*'||dall[k]=='/'||dall[k]=='+'||dall[k]=='-'||dall[k]==')'||dall[k]=='=')
                        {
                                if(k<i)
                                {
                                  count[e]=text(hear_begin,k);      ///1   8   //               
                                        if(dall[k]!=')')
                                        stytem[e]=dall[k];
                                        hear_begin=k+1;           //4
                                        e++;
                                }
                                else if(k==i)
                                {
                                        count[e]=text(hear_begin,k);   //     4,    7
                                        hear_begin=k;
                                }
                        }
          }               
        if(e>0)
        {               
         for(k=0;k<e;k++)
         {
                 if(stytem[k]=='*')
                 {
                          count[k+1]=count[k+1]*count[k];
                          for(p=k;p>0;p--)
                           {
                                 count[p]=count[p-1];
                                 stytem[p]=stytem[p-1];   
                           }
                           if(k<e-1)
                           {
                           hic++;
                           }
                 }
                 if(stytem[k]=='/')
                 {
                         count[k+1]=count[k]/count[k+1];
                         for(p=k;p>0;p--)
                           {
                                 count[p]=count[p-1];
                                 stytem[p]=stytem[p-1];           
                           }
                           if(k<e-1)
                           {
                           hic++;
                           }
                 }
         }
         for(k=0;k<=e-hic;k++)
         {
                 if(k<e-hic)
                 {
                 count[k]=count[hic+k];
                 stytem[k]=stytem[hic+k];
                 }
                 else if(k=e-hic)
                 {
                         count[k]=count[hic+k];
                 }
         }
         e=e-hic;
         for(k=0;k<e;k++)
         {
                 if(stytem[k]=='+')
                 {
                         count[k+1]=count[k+1]+count[k];
                         for(p=k;p>0;p--)
                           {
                                 count[p]=count[p-1];
                                 stytem[p]=stytem[p-1];
                           }  
                 }
                 if(stytem[k]=='-')
                 {
                         count[k+1]=count[k]-count[k+1];
                         for(p=k;p>0;p--)
                           {
                                 count[p]=count[p-1];
                                 stytem[p]=stytem[p-1];
                           }
                 }
         }
         count[0]=count[e];
}
}



void priority()   
{
        u8 i , j ,longs , k ;
         char ptr[12] ;
        float pp;
         if(flag==0)
         {
        for(i = 0 ; i < wei; i++)
        {
                if(dall[ i]==')')           
                {        
                        for(j=i;j>=0;j--)   
                        {
                                if(dall[j]=='(')
                                {
                                        memset(ptr,0,sizeof(ptr));
                                        process(i,j+1);
                                        pp=count[0];
                                        sprintf(ptr,"%.5f",pp);
                                        longs=strlen(ptr);         
                                        if(longs<=(i-j+1))            
                                        {
                                                for(k=0;k<longs;k++)
                                                {
                                                        dall[k+j]=ptr[k];
                                                }
                                                for(k=0;k<wei-i;k++)
                                                {
                                                        dall[j+longs+k]=dall[i+k+1];
                                                }
                                                wei=wei-(i-j-longs+1);
                                        }
                                        else
                                        {
                                                for(k=wei;k>i;k--)
                                                {
                                                        dall[k+longs-i+j-1]=dall[k];
                                                }
                                                for(k=0;k<longs;k++)
                                                {
                                                        dall[k+j]=ptr[k];
                                                }
                                                wei=wei+longs-i+j-1;
                                        }
                                        break;
                                }
                        }
                }
        }
        process(wei, 0);      //9   
        memset(ptr,0,sizeof(ptr));
        pp=count[0];
        sprintf(ptr,"%.5f",pp);         
        longs=strlen(ptr);           
          for(i=longs-1;i>longs-7;i--)
      {
              if(ptr[ i]=='0'||ptr[ i]=='.')
                  {
                  ptr[ i]=' ';
                  }
                  else if(ptr[ i]!='0'&&ptr[ i]!='.')
                  {
                          break;
                  }
       }
                                        for(k=0;k<longs;k++)
                {
                       Disp[k]=ptr[k];
                }
        flag=1;
}
}


void  bely()         //??à¨o?????à¨o?á?±?μ?êy×?ó?×?·?μ??yè·é¨?è
{
        u8 i;
        for(i=0;i<wei;i++)
        {
                if((dall[ i]=='+'||dall[ i]=='-'||dall[ i]=='*'||dall[ i]=='/'||dall[ i]=='.')&&(dall[i+1]=='+'||dall[i+1]=='-'||dall[i+1]=='*'||dall[i+1]=='/'||dall[i+1]=='.'||dall[i+1]=='='))
                {
                        error=9;
                        break;
                }
                if((dall[ i]=='+'||dall[ i]=='-'||dall[ i]=='*'||dall[ i]=='/')&&(dall[i+1]==')'))
                {
                        error=9;
                        break;
                }
                if(dall[ i]=='('&&(dall[i+1]=='*'||dall[i+1]=='/'))
                {
           error=9;
                        break;
                }
                if((dall[ i]=='1'||dall[ i]=='2'||dall[ i]=='0'||dall[ i]=='3'||dall[ i]=='4'||dall[ i]=='5'||dall[ i]=='6'||dall[ i]=='7'||dall[ i]=='8'||dall[ i]=='9')&&(dall[i+1]=='('))
                        {
                                error=9;
                                break;
                        }
        }
}

void  handle()   //×?·?′?±éàú,à¨o?′|àí   
{
        u8 i,j,k=0,you=10,pp=0;            
        if(flag1==0)
        {
                      for(j=0;j<wei;j++)
                                        {
                                                if(dall[j]=='(')
                                                {
                                                        you++;
                                                }
                                                if(dall[j]==')')
                                                {
                                                        you--;
                                                }
                                        }if(you!=10)
                                        {
                                                error=9;
                                        }
                        for(i=0;i<wei;i++)      //±éàúà¨o?  ?ò′í
                                 {
                                   if(error==9)
                                    {
                                          break;
                                    }                        
                                        if(dall[wei-2]=='('||dall[wei-1]=='(')
                                        {
                                                error=9;
                                                break;
                                        }
                                        if((dall[ i]=='('&&dall[i+1]==')')||(dall[ i]==')'&&dall[i+1]=='('))
                                        {
                                                error=9;
                                                break;
                                        }
                                        if(i==wei-1)
                                        {
                                                flag1=1;
                                        }                        
                                        if(dall[ i]=='(')
                                        {
                                                for(j=pp;j<wei;j++)
                                                {
                                                        if(dall[j]==')')
                                                        {
                                                                if(j<i)
                                                                {
                                                                        error=9;
                                                                        break;
                                                                }
                                                                pp=j+1;
                                                                break;
                                                        }
                                                }
                                        }
                        }
                        bely();
                        if(error!=9)
                        {
                        priority();
                        }
                }
}
void conversion()
{
        switch(keyvalue)
        {
                case(1):   dall[wei]='1';  desip[wei]='1';   break;
                case(2):   dall[wei]='2';  desip[wei]='2';   break;
                case(3):   dall[wei]='3';  desip[wei]='3';   break;
                case(4):   dall[wei]='+';  desip[wei]='+';   break;
                case(5):   dall[wei]='4';  desip[wei]='4';   break;
                case(6):   dall[wei]='5';  desip[wei]='5';   break;
                case(7):   dall[wei]='6';  desip[wei]='6';   break;
                case(8):   dall[wei]='-';  desip[wei]='-';   break;
                case(9):   dall[wei]='7';  desip[wei]='7';   break;
                case(10):  dall[wei]='8';  desip[wei]='8';   break;
                case(11):  dall[wei]='9';  desip[wei]='9';   break;
                case(12):  dall[wei]='*';  desip[wei]='*';   break;
                case(13):  dall[wei]='.';  desip[wei]='.';   break;
                case(14):  dall[wei]='0';  desip[wei]='0';   break;
                case(15):  dall[wei]='=';  desip[wei]='=';   break;
                case(16):  dall[wei]='/';  desip[wei]='/';   break;               
        }
        if(dall[wei]!='=')
        {
        wei++;
        }
        keyvalue=0;
        if(wei>16)
        {
                wei=16;
        }
}

void keydown()
{
        juzhen_key=0x0f;
        if(juzhen_key!=0x0f)
        {
                delay(100);
                if(juzhen_key!=0x0f)
                {
                        juzhen_key=0x0f;
                        switch(juzhen_key)
                        {
                                case(0x07): keyvalue=1;break;
                                case(0x0b): keyvalue=2;break;
                                case(0x0d): keyvalue=3;break;
                                case(0x0e): keyvalue=4;break;
                        }
                        juzhen_key=0xf0;
                        switch(juzhen_key)
                        {
                                case(0x70): keyvalue=keyvalue + 0;break;
                                case(0xb0): keyvalue=keyvalue + 4;break;
                                case(0xd0): keyvalue=keyvalue + 8;break;
                                case(0xe0): keyvalue=keyvalue + 12;break;
                        }
                        while((juzhen_key!=0xf0)&&(juzhen_key!=0x0f));
      conversion();
                }               
        }
}

void key()
{
        u8 qin;
          if(k1==0||k2==0||k3==0||k4==0)
        {
                delay(10000);
                if(k1==0)
                {
                        dall[wei]='(';
                        desip[wei]='(';
                    wei++;
                        while(k1==0);
                }
                else if(k2==0)
                {
            dall[wei]=')';
                        desip[wei]=')';
                  wei++;
                        while(k2==0);
                }
                else if(k3==0)
                {
                   wei--;
                   dall[wei]=' ';
                        desip[wei]=' ';
                        while(k3==0);
                }
                else if(k4==0)
                  {
                          flag=0;
                          flag1=0;
                          error=0;
                       for(qin=0;qin<16;qin++)
                         {
                              dall[qin]=' ';
                             desip[qin]=' ';
                                  Disp[qin]=' ';
                      }
                        wei=0;
                            while(k4==0);
                 }
         }
}


void xianshi()
{
        u8 i;
        LcdWriteCom(0x00+0x80);
        for(i=0;i<16;i++)    //??ê?μúò?DD
        {
                LcdWriteData(desip[ i]);        
        }
        if(error==9)
        {
                Disp[0]='E';
                Disp[1]='r';
                Disp[2]='r';
                Disp[3]='o';
                Disp[4]='r';
        LcdWriteCom(0x40+0x80);   //??ê?μú?tDD
        for(i=0;i<16;i++)
        {
                LcdWriteData(Disp[ i]);        
        }               
        }
        if(flag==1)
        {
                LcdWriteCom(0x40+0x80);   //??ê?μú?tDD                 
                for(i=0;i<16;i++)
                {
                        LcdWriteData(Disp[ i]);        
                }               
        }
}

void main()
{
        LcdInit();
        while(1)
                {
                        if(pack==1)
                        {
                                led=0;
                        }
                        if(dall[wei]=='=')
                        {
                                handle();
                        }
                        keydown();
                        key();
                        xianshi();
                }
}



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表