初学者简易计算器程序纠错 求大神指导
时间:10-02
整理:3721RD
点击:
proteus中仿真输入没问题,就是出不来结果。小白第一次写程序 望纠错。
#include<reg52.h>
#include<string.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={'0','1','2','3','4','5','6','7','8','9','.','+','-','*','/','='};
sbit lcden=P2^2;
sbit lcdrw=P2^1;
sbit lcdrs=P2^0;
uchar key,fuhao,dengyu,xsd;
uint k=0,m=0,num1=0,xiaoshu=0,n=0,i,num,b=0,p=0,q=0,y[8]={0};
float num2,shu1,shu2,result;
uchar diyihang[8]={0},xianshi[16]={0},jieguo[8]={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;
lcden=0;
lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
lcden=0;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清零,数据指针清零
}
void shuchu()//结果输出函数
{
uint a,f,h;
float c,d,g;
a=result;//将结果强制转换为整型变量
c=result-a;//a为整数部分,c为小数部分
while(a)
{
y[n]=a%10;//将整数a除10取余,将数放入数组中
jieguo[n]=y[n]+'0';
a=a/10;//将整数去掉最低位重新存入整型a中
n++;//为数组存入第二个数做准备
}
jieguo[n]='.';//加入小数点
n++;
d=c*10;//将小数左移一位
f=d;//将小数强制转换为整型变量
g=d-f;//记录下剩下的小数
y[n]=f;
jieguo[n]=y[n]+'0';//记录小数点后第一位数
n++;
h=g*10;//将小数左移一位
y[n]=h;
jieguo[n]=y[n]+'0';//记录小数点后第二位
}
void jisuan()//计算程序
{
if(dengyu=='=')
{
if(xsd==1)
{
for(i=0;i<b;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
for(i=(b+1);i<k;i++)
{
q=diyihang[i]-'0';xiaoshu=xiaoshu*10+q;
}
num2=xiaoshu/pow(10,k-b-1);
shu2=num1+num2;//将输入的第二个数记录下来
b=0;k=0;num1=0;xiaoshu=0;p=0;q=0;num2=0;xsd=0;
memset(diyihang,0,sizeof(char)*8);//将数组清零
}
else
{
for(i=0;i<k;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
shu2=num1;
p=0;k=0;num1=0;
memset(diyihang,0,sizeof(char)*8);
}
if(fuhao=='+')
{
result=shu1+shu2;shuchu();
}
if(fuhao=='-')
{
result=shu1-shu2;shuchu();
}
if(fuhao=='*')
{
result=shu1*shu2;shuchu();
}
if(fuhao=='/')
{
result=shu1/shu2;shuchu();
}
}
}
void keyscan()
{
uchar temp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
num=key;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
num=key;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
num=key;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
num=key;
}
}
}
void keyscandown()
{
P3=0xf0;
if(P3!=0xf0)
{
keyscan();
if(key<=9&&key>=0)//当输入为0到9
{
diyihang[k]=table[num];//将数字记录到数组中
xianshi[m]=table[num];
k++;
m++;
}
else if(key==10)//小数点出现
{
xsd=1;
b=k;//记录下小数点的位数
diyihang[k]='.';
xianshi[m]='.';
k++;
m++;
}
else if(key<=14&&key>=11)//当输入为“+,-,*,/"时
{
if(key==11)//当输入+
{
fuhao='+';
xianshi[m]='+';
m++;
if(xsd==1)
{
for(i=0;i<b;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}//将小数点前的数字转换为十进制数
for(i=(b+1);i<k;i++)
{
q=diyihang[i]-'0';xiaoshu=xiaoshu*10+q;
}//将小数点后的数字转换为十进制数
num2=xiaoshu/pow(10,k-b-1);
shu1=num1+num2;//将输入的第一个数记录下来
b=0;k=0;num1=0;xiaoshu=0;p=0;q=0;num2=0;xsd=0;
memset(diyihang,0,sizeof(char)*8);//将数组清零
}
else
{
for(i=0;i<k;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
shu1=num1;
k=0;p=0;num1=0;
memset(diyihang,0,sizeof(char)*8);
}
}
if(key==12)//当输入-
{
fuhao='-';
xianshi[m]='-';
m++;
if(xsd==1)
{
for(i=0;i<b;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}//将小数点前的数字转换为十进制数
for(i=(b+1);i<k;i++)
{
q=diyihang[i]-'0';xiaoshu=xiaoshu*10+q;
}//将小数点后的数字转换为十进制数
num2=xiaoshu/pow(10,k-b-1);
shu1=num1+num2;//将输入的第一个数记录下来
b=0;k=0;num1=0;xiaoshu=0;p=0;q=0;num2=0;xsd=0;
memset(diyihang,0,sizeof(char)*8);//将数组清零
}
else
{
for(i=0;i<k;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
shu1=num1;
k=0;p=0;num1=0;
memset(diyihang,0,sizeof(char)*8);
}
}
if(key==13)//当输入*
{
fuhao='*';
xianshi[m]='*';
m++;
if(xsd==1)
{
for(i=0;i<b;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}//将小数点前的数字转换为十进制数
for(i=(b+1);i<k;i++)
{
q=diyihang[i]-'0';xiaoshu=xiaoshu*10+q;
}//将小数点后的数字转换为十进制数
num2=xiaoshu/pow(10,k-b-1);
shu1=num1+num2;//将输入的第一个数记录下来
b=0;k=0;num1=0;xiaoshu=0;p=0;q=0;num2=0;xsd=0;
memset(diyihang,0,sizeof(char)*8);//将数组清零
}
else
{
for(i=0;i<k;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
shu1=num1;
k=0;p=0;num1=0;
memset(diyihang,0,sizeof(char)*8);
}
}
if(key==14)//当输入/
{
fuhao='/';
xianshi[m]='/';
m++;
if(xsd==1)
{
for(i=0;i<b;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}//将小数点前的数字转换为十进制数
for(i=(b+1);i<k;i++)
{
q=diyihang[i]-'0';xiaoshu=xiaoshu*10+q;
}//将小数点后的数字转换为十进制数
num2=xiaoshu/pow(10,k-b-1);
shu1=num1+num2;//将输入的第一个数记录下来
b=0;k=0;num1=0;xiaoshu=0;p=0;q=0;num2=0;xsd=0;
memset(diyihang,0,sizeof(char)*8);//将数组清零
}
else
{
for(i=0;i<k;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
shu1=num1;
k=0;p=0;num1=0;
memset(diyihang,0,sizeof(char)*8);
}
}
}
else if(key==15)//当输入=
{
dengyu='=';
xianshi[m]='=';
jisuan();
}
}
}
void main()
{
init();
while(1)
{
init();
keyscandown();
write_com(0x80);
for(i=0;i<m;i++)
{
write_data(xianshi[i]);
delay(5);
}
write_com(0x80+0x40);//显示第二行,将结果显示出来
for(i=0;i<n;i++)
{
write_data(jieguo[i]);
delay(5);
}
}
}
#include<reg52.h>
#include<string.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={'0','1','2','3','4','5','6','7','8','9','.','+','-','*','/','='};
sbit lcden=P2^2;
sbit lcdrw=P2^1;
sbit lcdrs=P2^0;
uchar key,fuhao,dengyu,xsd;
uint k=0,m=0,num1=0,xiaoshu=0,n=0,i,num,b=0,p=0,q=0,y[8]={0};
float num2,shu1,shu2,result;
uchar diyihang[8]={0},xianshi[16]={0},jieguo[8]={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;
lcden=0;
lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
lcden=0;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清零,数据指针清零
}
void shuchu()//结果输出函数
{
uint a,f,h;
float c,d,g;
a=result;//将结果强制转换为整型变量
c=result-a;//a为整数部分,c为小数部分
while(a)
{
y[n]=a%10;//将整数a除10取余,将数放入数组中
jieguo[n]=y[n]+'0';
a=a/10;//将整数去掉最低位重新存入整型a中
n++;//为数组存入第二个数做准备
}
jieguo[n]='.';//加入小数点
n++;
d=c*10;//将小数左移一位
f=d;//将小数强制转换为整型变量
g=d-f;//记录下剩下的小数
y[n]=f;
jieguo[n]=y[n]+'0';//记录小数点后第一位数
n++;
h=g*10;//将小数左移一位
y[n]=h;
jieguo[n]=y[n]+'0';//记录小数点后第二位
}
void jisuan()//计算程序
{
if(dengyu=='=')
{
if(xsd==1)
{
for(i=0;i<b;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
for(i=(b+1);i<k;i++)
{
q=diyihang[i]-'0';xiaoshu=xiaoshu*10+q;
}
num2=xiaoshu/pow(10,k-b-1);
shu2=num1+num2;//将输入的第二个数记录下来
b=0;k=0;num1=0;xiaoshu=0;p=0;q=0;num2=0;xsd=0;
memset(diyihang,0,sizeof(char)*8);//将数组清零
}
else
{
for(i=0;i<k;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
shu2=num1;
p=0;k=0;num1=0;
memset(diyihang,0,sizeof(char)*8);
}
if(fuhao=='+')
{
result=shu1+shu2;shuchu();
}
if(fuhao=='-')
{
result=shu1-shu2;shuchu();
}
if(fuhao=='*')
{
result=shu1*shu2;shuchu();
}
if(fuhao=='/')
{
result=shu1/shu2;shuchu();
}
}
}
void keyscan()
{
uchar temp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
num=key;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
num=key;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
num=key;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
num=key;
}
}
}
void keyscandown()
{
P3=0xf0;
if(P3!=0xf0)
{
keyscan();
if(key<=9&&key>=0)//当输入为0到9
{
diyihang[k]=table[num];//将数字记录到数组中
xianshi[m]=table[num];
k++;
m++;
}
else if(key==10)//小数点出现
{
xsd=1;
b=k;//记录下小数点的位数
diyihang[k]='.';
xianshi[m]='.';
k++;
m++;
}
else if(key<=14&&key>=11)//当输入为“+,-,*,/"时
{
if(key==11)//当输入+
{
fuhao='+';
xianshi[m]='+';
m++;
if(xsd==1)
{
for(i=0;i<b;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}//将小数点前的数字转换为十进制数
for(i=(b+1);i<k;i++)
{
q=diyihang[i]-'0';xiaoshu=xiaoshu*10+q;
}//将小数点后的数字转换为十进制数
num2=xiaoshu/pow(10,k-b-1);
shu1=num1+num2;//将输入的第一个数记录下来
b=0;k=0;num1=0;xiaoshu=0;p=0;q=0;num2=0;xsd=0;
memset(diyihang,0,sizeof(char)*8);//将数组清零
}
else
{
for(i=0;i<k;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
shu1=num1;
k=0;p=0;num1=0;
memset(diyihang,0,sizeof(char)*8);
}
}
if(key==12)//当输入-
{
fuhao='-';
xianshi[m]='-';
m++;
if(xsd==1)
{
for(i=0;i<b;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}//将小数点前的数字转换为十进制数
for(i=(b+1);i<k;i++)
{
q=diyihang[i]-'0';xiaoshu=xiaoshu*10+q;
}//将小数点后的数字转换为十进制数
num2=xiaoshu/pow(10,k-b-1);
shu1=num1+num2;//将输入的第一个数记录下来
b=0;k=0;num1=0;xiaoshu=0;p=0;q=0;num2=0;xsd=0;
memset(diyihang,0,sizeof(char)*8);//将数组清零
}
else
{
for(i=0;i<k;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
shu1=num1;
k=0;p=0;num1=0;
memset(diyihang,0,sizeof(char)*8);
}
}
if(key==13)//当输入*
{
fuhao='*';
xianshi[m]='*';
m++;
if(xsd==1)
{
for(i=0;i<b;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}//将小数点前的数字转换为十进制数
for(i=(b+1);i<k;i++)
{
q=diyihang[i]-'0';xiaoshu=xiaoshu*10+q;
}//将小数点后的数字转换为十进制数
num2=xiaoshu/pow(10,k-b-1);
shu1=num1+num2;//将输入的第一个数记录下来
b=0;k=0;num1=0;xiaoshu=0;p=0;q=0;num2=0;xsd=0;
memset(diyihang,0,sizeof(char)*8);//将数组清零
}
else
{
for(i=0;i<k;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
shu1=num1;
k=0;p=0;num1=0;
memset(diyihang,0,sizeof(char)*8);
}
}
if(key==14)//当输入/
{
fuhao='/';
xianshi[m]='/';
m++;
if(xsd==1)
{
for(i=0;i<b;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}//将小数点前的数字转换为十进制数
for(i=(b+1);i<k;i++)
{
q=diyihang[i]-'0';xiaoshu=xiaoshu*10+q;
}//将小数点后的数字转换为十进制数
num2=xiaoshu/pow(10,k-b-1);
shu1=num1+num2;//将输入的第一个数记录下来
b=0;k=0;num1=0;xiaoshu=0;p=0;q=0;num2=0;xsd=0;
memset(diyihang,0,sizeof(char)*8);//将数组清零
}
else
{
for(i=0;i<k;i++)
{
p=diyihang[i]-'0';num1=num1*10+p;
}
shu1=num1;
k=0;p=0;num1=0;
memset(diyihang,0,sizeof(char)*8);
}
}
}
else if(key==15)//当输入=
{
dengyu='=';
xianshi[m]='=';
jisuan();
}
}
}
void main()
{
init();
while(1)
{
init();
keyscandown();
write_com(0x80);
for(i=0;i<m;i++)
{
write_data(xianshi[i]);
delay(5);
}
write_com(0x80+0x40);//显示第二行,将结果显示出来
for(i=0;i<n;i++)
{
write_data(jieguo[i]);
delay(5);
}
}
}
发时间看看
发时间看看,很不一般