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值对应的功能进行处理
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话: