flag是用来控制什么的啊

if(flag==1) //flag在乘中控制使按下一个数据清除sum1
{
sum1=0;
flag=0;
}
请问这个是什么意思啊?
求LCD1602写简易计算器的算法思路?

flag就是个标志位。当需要切换状态时,判断标志如果为1,则进行复位,同时将sum1初始化为0。如果已经是复位状态,则什麽也不干
具体的作用,还要看上下文才知道

具体题目是什么啊,直接贴一段也看不出来啥啊

在这里插入代码片#include<reg51.h>
#include<LCD1602.h>
#define kong1 P1 //控制矩阵按键
// kong0=P0 发送命令发送数据
uc code a[]={'0','1','2','3','4','5','6','7','8','9','+','-','*','/','='};
long sum1,sum2;
float sum3 ; //用于除法
long sum4,sum5; //用于除法;
uc addflag,subflag,mulflag,divflag;
uc keyflag; // 在keyvaluechuli()函数中控制
uc flag ;// 控制乘中的sum1进行清除;
uc keyvalue=100; //keyvalue值不同表示的不同功能
//初始值设置为100
void delay10us(ut t) //误差 0us
{
uc a;
for(;t>0;t--)
for(a=2;a>0;a--);
}

//判断按键值

uc keypanduan() //返回按键值
{
uc cc; //cc作为返回值 aa控制强制退出
kong1=0xf0;
if(kong1!=0xf0) //先判断行
{
delay10us(100); //1000us

  if(kong1!=0xf0)
  {

    cc=kong1;
    keyflag=1;     //置一表示按键按下 

  }

}

 kong1=0x0f ;// 判断列
if(kong1!=0x0f)
{

   delay10us(100);
   if(kong1!=0x0f)
   {
    cc=cc|kong1; //得到按键值
   }

  }

while(kong1!=0x0f);

return cc;

}

//通过对应的按键值对应keyvalue 在
//keyvaluechuli()函数中对keyvalue进行处理
void keyswitch(uc key)
{

switch(key){

 case 0xe7:   keyvalue=1;  break;
                                             // +  -  *  /
 case 0xd7:      keyvalue=2;  break;             // 3  6  9  清零
                                             // 2  5  8  =
 case 0xb7:   keyvalue=3;  break;             // 1  4  7  0

 case 0xeb:   keyvalue=4;  break;
                          
 case 0xdb:      keyvalue=5;  break;

 case 0xbb:      keyvalue=6;  break;

 case 0xed:      keyvalue=7;  break;

 case 0xdd:      keyvalue=8;  break;

 case 0xbd:      keyvalue=9;  break;

 case 0xee:   keyvalue=0;  break;

 case 0x77:      keyvalue=10; break; //加法

 case 0x7b:   keyvalue=11; break;// 减法         
 
 case 0x7d:      keyvalue=12; break;//乘法

 case 0x7e:      keyvalue=13; break;//除法

 case 0xde:      keyvalue=14; break;//等于

 case 0xbe:      keyvalue=15; break;//    清屏
 default :break;

}

}

//处理keyvalue的函数
void shujuchuli()
{
if(keyvalue==15)
{
LCDcmd(0x01);
sum1=sum2=0;
addflag=0;
subflag=0;
mulflag=0;
divflag=0;

}
if(keyvalue<10)
{
if(flag==1) //flag在乘中控制使按下一个数据清除sum1
{
sum1=0;
flag=0;
}
sum1=sum1*10+keyvalue;
LCDdat(a[keyvalue]); //写数据
}

}

void jiafa() //加法
{

addflag++;
subflag=mulflag=divflag=0;
if(addflag>1)
{
sum1=sum1+sum2;
}
sum2=sum1;
sum1=0;

}

void jianfa() //减法
{

subflag++;
addflag=mulflag=divflag=0;
if(subflag==1)

{
sum2=sum1;
}
if(subflag>1)
{
sum2=sum2-sum1;
}
sum1=0;
}

void chengfa() //乘法
{
mulflag++;
subflag=addflag=divflag=0;
flag=1;
if(mulflag>1)
{
sum1=sum1*sum2;

}

sum2=sum1;

}

void chufa() //除法
{
divflag++;
subflag=mulflag=addflag=0;
if(divflag==1)

{
sum3=sum1;
}

if(divflag>1)
{
sum3=sum3/sum1; //除法保留3位小数

}

sum1=0;
}

//按等于之后数据是从第二行从右向左写

void dengyu() //等于
{

 if(addflag)          //加法
{
    sum2=sum1+sum2;
       LCDcmd(0x4f+0x80);          //这里控制从第二行开始从右
    LCDcmd(0x04);              //向左写
    while(sum2!=0)
    {

     LCDdat(0x30+sum2%10); 
     sum2/=10;

    }
         LCDdat('=');

       addflag=0;        //完成计算把对应的flag清除

}

// 减法的处理 分结果为正数 和负数
//进行不同处理
//减法先写负数不行
if(subflag) //减法
{
sum2=sum2-sum1;
LCDcmd(0x4f+0x80);
LCDcmd(0x04);
if(sum2>=0) //结果正数的
{
while(sum2!=0)
{

          LCDdat(0x30+sum2%10);
           sum2/=10;

        }
     
    }
    else //结果负数
    {

        sum2=-sum2;
        while(sum2!=0)
       {

       LCDdat(0x30+sum2%10);
       sum2/=10;

        }
         LCDdat('-');

    }

        LCDdat('=');


         subflag=0;
   
}

if(mulflag) //乘法
{
sum2=sum1*sum2;
LCDcmd(0x4f+0x80);
LCDcmd(0x04);
while(sum2!=0)
{

  LCDdat(0x30+sum2%10);
  sum2/=10;

 }
    LCDdat('=');

   mulflag=0;

}

//除法结果小于0.1和等于0.1和等于0.1种情况
//把结果放大了1000000倍 再通过取余的方法求数据
if(divflag) //除法
{
uc cent=0; //这个使控制数字之前的0有多少
uc k=0,i=0;
sum2=(sum3/sum1)*1000000;//保留6位小数
LCDcmd(0x4f+0x80);
LCDcmd(0x04);

 if(sum2==100000) //结果等于0.1
 {

        while(sum2!=0)
    {
       LCDdat(0x30+sum4%10);
       sum4/=10;

    }
    for(i=0;i<cent;i++)
    {

         if(i==cent-2)
         {

            LCDdat(0x30); //0
            LCDdat('.');

         }
         else
          {

             LCDdat(0x30); //0

          }

    }
    cent=0;
}
 if(sum2<100000)   //结果小于0.1
 {
      sum4=sum2;    
     sum5=sum2;     
     while(sum5<100000)
     {
         cent++;
         sum5*=10;

     }

    while(sum4!=0)
    {
       LCDdat(0x30+sum4%10);
       sum4/=10;

    }
    for(i=0;i<=cent;i++)
    {

         if(i==cent-1)
         {

            LCDdat(0x30); //0
            LCDdat('.');

         }
         else
          {

             LCDdat(0x30); //0

           }

    }
 
 }    
if(sum2>100000)        //结果大于0.1的
{    
              
  while(sum2!=0)
   {
        k++;          //k到3时写小数点
        LCDdat(0x30+sum2%10);
        sum2/=10;
        if(k==6)
        {
           
             LCDdat('.');
            if(sum2==0)
            {

             LCDdat(0x30);  //写0

            }
        }

   }




     LCDdat('=');
     divflag=0;

}

}
}

void keyvaluechuli() //对key的值进行处理
{
if(keyflag) //表明 按键按下
{
keyflag=0;
switch(keyvalue)
{

    case 10:jiafa();     LCDdat(a[keyvalue]);break;      
  case 11:jianfa();     LCDdat(a[keyvalue]);break;
  case 12:chengfa(); LCDdat(a[keyvalue]);break;
  case 13:chufa();     LCDdat(a[keyvalue]);break;
  case 14:dengyu();  break;
  default:shujuchuli( );   // 0~9 和清零                         
 }


 }

}

void main()
{

uc yy=0;
LCDinitial( ); //LCD1602的初始化设置
while(1)
{

yy=keypanduan(); //按键值赋值给yy;

keyswitch(yy); //得到对应的value值
keyvaluechuli(); //对value值对应的功能进行处理

}

}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^