找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4645|回复: 5
收起左侧

51制作计算器程序,浮点数计算出问题

[复制链接]
ID:70453 发表于 2014-12-14 16:19 | 显示全部楼层 |阅读模式
我是个初学者。不知道是不是自己太激进了。学完矩阵键盘就直接写了计算器程序。
应该是只有等于之后的数据处理和处理后的显示那一块出了问题
六位数的整数显示也有问题。
先看代码。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit buzzer=P3^6;         
uchar wei1,wei2,wei3,wei4,wei5,wei6,wei7,wei8;
uchar sign=0;                                          //判断是否按了加、减、乘、除      
uchar dotnum;               //小数点后第几位
uchar dotnum1,dotnum2,dotnum3,dotnum4,dotnum5,dotnum6;
uchar numdot1;numdot2,numdot3,numdot4,numdot5,numdot6;           //小数点后第几位
float floatnum1,num1,floatnum2,num2,num;
int intnum1,intnum2;
uint intnum;floatnum;
uchar add,sub,mul,div,dot,equal,overflow;      //运算加、减、乘、除、点、等于                    
uchar code d[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff/*20空*/,0xbf/*21横杠_错误*/};
sbit P27=P2^7;     
sbit P26=P2^6;
sbit P25=P2^5;
sbit P24=P2^4;
sbit P23=P2^3;
sbit P22=P2^2;
sbit P21=P2^1;
sbit P20=P2^0;
void beep()          //数据超过6位时响
{
uint i,j;
for(i=0;i<100;i++)
{            
buzzer=0;
for(j=57;j>0;j--);
buzzer=1;
for(j=57;j>0;j--);
}
}
void delayms(uint xms)         //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}
void display()             //数码管显示
{
P0=d[wei1];P27=0;
delayms(1);P27=1;
P0=d[wei2];P26=0;
delayms(1);P26=1;
P0=d[wei3];P25=0;
delayms(1);P25=1;

P0=d[wei4];P24=0;
delayms(1);P24=1;
P0=d[wei5];P23=0;
delayms(1);P23=1;
P0=d[wei6];P22=0;
delayms(1);P22=1;
}
void move()          //数码管移动函数
{
if(equal==1)
{
  wei6=wei5=wei4=wei3=wei2=wei1=20;
  equal=0;
}
if(wei6!=20){beep();overflow=1;}
else
{
wei6=wei5;
wei5=wei4;
wei4=wei3;
wei3=wei2;
wei2=wei1;
}
}
long int intsum()        //求小数点之前的和
{
char w1=wei1,w2=wei2,w3=wei3,w4=wei4,w5=wei5,w6=wei6;
long int numadd;
if(w6==20)w6=0;
if(w5==20)w5=0;
if(w4==20)w4=0;
if(w3==20)w3=0;
if(w2==20)w2=0;
if(w1==20)w1=0;
numadd=w1+w2*10+w3*100+w4*1000+w5*10000+w6*100000;
return numadd;
}
float floatsum(float x)          //求小数点后的和
{
int i;
dotnum++;
for(i=0;i<dotnum;i++)
  x*=0.1;
return x;
}
void signdefaultf()        //运算符操作函数
{
if(dot==0)
{
  intnum1=intsum();
  floatnum1=0;
}
num1=intnum1+floatnum1;
wei1=wei2=wei3=wei4=wei5=wei6=20;
dotnum=0;
dot=0;
equal=0;
add=sub=mul=div=0;
sign=1;
}
void determine()      //决定计算后的位数
{
if(numdot6!=0)
{
  if(numdot1>9)numdot1-=10;
  wei6=numdot6;
  wei5=numdot5;
  wei4=numdot4;
  wei3=numdot3;
  wei2=numdot2;
  wei1=numdot1;
}

if(numdot6==0&&numdot5!=0)
{
  if(dotnum2!=0||dotnum1!=0)
  {
   wei6=numdot5;
   wei5=numdot4;
   wei4=numdot3;
   wei3=numdot2;
   wei2=numdot1;
   if(dotnum1!=9&&dotnum2>4)dotnum++;
   wei1=dotnum1;
  }
  else
  {
   wei6=20;
   wei5=numdot5;
   wei4=numdot4;
   wei3=numdot3;
   wei2=numdot2;
   wei1=numdot1;
  }
}
while(numdot6==0&&numdot5==0&&numdot4!=0)
{
  if(dotnum2!=0)
  {
   wei6=numdot4;
   wei5=numdot3;
   wei4=numdot2;
   wei3=numdot1;
   wei2=dotnum1;
   wei1=dotnum2;
   break;
  }
  if(dotnum1!=0)
  {
   wei6=20;
   wei5=numdot4;
   wei4=numdot3;
   wei3=numdot2;
   wei2=numdot1;
   wei1=dotnum1;
   break;
  }
  else
  {
   wei6=20;
   wei5=20;
   wei4=numdot4;
   wei3=numdot3;
   wei2=numdot2;
   wei1=numdot1;
   break;
  }
}
while(numdot6==0&&numdot5==0&&numdot4==0&&numdot3!=0)
{
  if(dotnum3!=0)
  {
   wei6=numdot3;
   wei5=numdot2;
   wei4=numdot1;
   wei3=dotnum1;
   wei2=dotnum2;
   wei1=dotnum3;
   break;
  }
  if(dotnum2!=0)
  {
   wei6=20;
   wei5=numdot3;
   wei4=numdot2;
   wei3=numdot1;
   wei2=dotnum1;
   wei1=dotnum2;
   break;
  }
  if(dotnum1!=0)
  {
   wei6=20;
   wei5=20;
   wei4=numdot3;
   wei3=numdot2;
   wei2=numdot1;
   wei1=dotnum1;
   break;
  }
  else
  {
   wei6=20;
   wei5=20;
   wei4=20;
   wei3=numdot3;
   wei2=numdot2;
   wei1=numdot1;
   break;
  }
}
while(numdot6==0&&numdot5==0&&numdot4==0&&numdot3==0&&numdot2!=0)
{
  if(dotnum4!=0)
  {
   wei6=numdot2;
   wei5=numdot1;
   wei4=dotnum1;
   wei3=dotnum2;
   wei2=dotnum3;
   wei1=dotnum4;
   break;
  }
  if(dotnum3!=0)
  {
   wei6=20;
   wei5=numdot2;
   wei4=numdot1;
   wei3=dotnum1;
   wei2=dotnum2;
   wei1=dotnum3;
   break;
  }
  if(dotnum2!=0)
  {
   wei6=20;
   wei5=20;
   wei4=numdot2;
   wei3=numdot1;
   wei2=dotnum1;
   wei1=dotnum2;
   break;
  }
  if(dotnum1!=0)
  {
   wei6=20;
   wei5=20;
   wei4=20;
   wei3=numdot2;
   wei2=numdot1;
   wei1=dotnum1;
   break;
  }
  else
  {
   wei6=20;
   wei5=20;
   wei4=20;
   wei3=20;
   wei2=numdot2;
   wei1=numdot1;
   break;
  }
}
while(numdot6==0&&numdot5==0&&numdot4==0&&numdot3==0&&numdot2==0&&numdot1!=0)
{
  if(dotnum5!=0)
  {
   wei6=numdot1;
   wei5=dotnum1;
   wei4=dotnum2;
   wei3=dotnum3;
   wei2=dotnum4;
   wei1=dotnum5;
   break;
  }
  if(dotnum4!=0)
  {
   wei6=20;
   wei5=numdot1;
   wei4=dotnum1;
   wei3=dotnum2;
   wei2=dotnum3;
   wei1=dotnum4;
   break;
  }
  if(dotnum3!=0)
  {
   wei6=20;
   wei5=20;
   wei4=numdot1;
   wei3=dotnum1;
   wei2=dotnum2;
   wei1=dotnum3;
   break;
  }
  if(dotnum2!=0)
  {
   wei6=20;
   wei5=20;
   wei4=20;
   wei3=numdot1;
   wei2=dotnum1;
   wei1=dotnum2;
   break;
  }
  if(dotnum1!=0)
  {
   wei6=20;
   wei5=20;
   wei4=20;
   wei3=20;
   wei2=numdot1;
   wei1=dotnum1;
   break;
  }
  else
  {
   wei6=20;
   wei5=20;
   wei4=20;
   wei3=20;
   wei2=20;
   wei1=numdot1;
   break;
  }
}  
while(intnum==0)
{
  if(dotnum5!=0)
  {
   wei6=numdot1;
   wei5=dotnum1;
   wei4=dotnum2;
   wei3=dotnum3;
   wei2=dotnum4;
   wei1=dotnum5;
   break;
  }
  if(dotnum4!=0)
  {
   wei6=20;
   wei5=numdot1;
   wei4=dotnum1;
   wei3=dotnum2;
   wei2=dotnum3;
   wei1=dotnum4;
   break;
  }
  if(dotnum3!=0)
  {
   wei6=20;
   wei5=20;
   wei4=numdot1;
   wei3=dotnum1;
   wei2=dotnum2;
   wei1=dotnum3;
   break;
  }
  if(dotnum2!=0)
  {
   wei6=20;
   wei5=20;
   wei4=20;
   wei3=numdot1;
   wei2=dotnum1;
   wei1=dotnum2;
   break;
  }
  if(dotnum1!=0)
  {
   wei6=20;
   wei5=20;
   wei4=20;
   wei3=20;
   wei2=numdot1;
   wei1=dotnum1;
   break;
  }
  else
  {
   wei6=20;
   wei5=20;
   wei4=20;
   wei3=20;
   wei2=20;
   wei1=numdot1;
   break;
  }
}
}
void equalf()           /*最后的计算*/
{
equal=1;
dotnum=0;
dot=0;
if(sign==1)
{
  if(dot==0)
  {
   floatnum2=0;
   intnum2=intsum();
  }
  num2=floatnum2+intnum2;
  if(add==1)num=num1+num2;
  if(sub==1)num=num1-num2;
  if(mul==1)num=num1*num2;
  if(div==1)num=num1/num2;
  intnum=(int)num;
  floatnum=(int)((num-intnum)*1000000);
  numdot1=intnum%10;if(floatnum!=0)numdot1+=10;
  numdot2=intnum/10%10;
  numdot3=intnum/100%10;
  numdot4=intnum/1000%10;
  numdot5=intnum/10000%10;
  numdot6=intnum/100000;   
  if(numdot6>9){beep();wei1=wei2=wei3=wei4=wei5=wei6=21;}
  else
  {
   dotnum1=floatnum/100000;
   dotnum2=floatnum%100000/10000;
   dotnum3=floatnum%10000/1000;
   dotnum4=floatnum%1000/100;
   dotnum5=floatnum%100/10;         
   dotnum6=floatnum%10;
   determine();
  }
}
}
void matrixkeyscan()         //键盘检测
{
uchar temp;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
  delayms(10);
  temp=P1;
  temp=temp&0xf0;
  if(temp!=0xf0)
  {
   temp=P1;
   switch(temp)         //第一排!!!
   {
    case 0xee:
     move();if(wei6!=20&&overflow==1)break;
     wei1=7;
     if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
     if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
     break;
    case 0xde:
     move();if(wei6!=20&&overflow==1)break;
     wei1=8;
     if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
     if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
     break;
    case 0xbe:
     move();if(wei6!=20&&overflow==1)break;
     wei1=9;
     if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
     if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
     break;
    case 0x7e:
     signdefaultf();div=1;
   }
   while(temp!=0xf0)
   {
    temp=P1;
    temp=temp&0xf0;
   }
  }
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
  delayms(10);
  temp=P1;
  temp=temp&0xf0;
  if(temp!=0xf0)
  {
   temp=P1;
   switch(temp)         //第二排!!!
   {
    case 0xed:
     move();if(wei6!=20&&overflow==1)break;
     wei1=4;
     if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
     if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
     break;
    case 0xdd:
     move();if(wei6!=20&&overflow==1)break;
     wei1=5;
     if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
     if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
     break;
    case 0xbd:
     move();if(wei6!=20&&overflow==1)break;
     wei1=6;
     if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
     if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
     break;
    case 0x7d:
     signdefaultf();mul=1;
   }
   while(temp!=0xf0)
   {
    temp=P1;
    temp=temp&0xf0;
   }
  }
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
  delayms(10);
  temp=P1;
  temp=temp&0xf0;
  if(temp!=0xf0)
  {
   temp=P1;
   switch(temp)         //第三排!!!
   {
    case 0xeb:
     move();if(wei6!=20&&overflow==1)break;
     wei1=1;
     if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
     if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
     break;
    case 0xdb:
     move();if(wei6!=20&&overflow==1)break;
     wei1=2;
     if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
     if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
     break;
    case 0xbb:
     move();if(wei6!=20&&overflow==1)break;
     wei1=3;
     if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
     if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
     break;
    case 0x7b:
     signdefaultf();sub=1;
   }
   while(temp!=0xf0)
   {
    temp=P1;
    temp=temp&0xf0;
   }
  }
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
  delayms(10);
  temp=P1;
  temp=temp&0xf0;
  if(temp!=0xf0)
  {
   temp=P1;
   switch(temp)         //第四排!!!
   {
    case 0xe7:
     move();if(wei6!=20&&overflow==1)break;
     wei1=0;
     if(sign==0&&dot==1)floatnum1+=floatsum(wei1);
     if(sign==1&&dot==1)floatnum2+=floatsum(wei1);
     break;
    case 0xd7:
     dot=1;
     if(sign==0)intnum1=intsum();
     else intnum2=intsum();
     wei1+=10;
     break;
    case 0xb7:
     equalf();
     break;        
    case 0x77:
     signdefaultf();add=1;
   }
   while(temp!=0xf0)
   {
    temp=P1;
    temp=temp&0xf0;
   }
  }
}
}
void zero()               //清零   (无)
{
add=sub=mul=div=dot=0;
while(1)
{
  wei6=wei5=wei4=wei3=wei2=20;
  wei1=0;
  matrixkeyscan();
  if(wei2==0){wei2=20;break;}
  display();
}
}
void main()//清零和重输功能暂时没有,需要加入别的按键
{
while(1)
{
  zero();
  while(1)         //缺少等于之后的重新运算能力,相除的时候不能显示小数部分
  {
   matrixkeyscan();
   display();
   
  }
}
}




评分

参与人数 1黑币 +5 收起 理由
jhhw + 5

查看全部评分

回复

使用道具 举报

ID:70453 发表于 2014-12-14 16:30 | 显示全部楼层
可能没有大神愿意花那么久的时间看。
回复

使用道具 举报

ID:70453 发表于 2014-12-14 16:32 | 显示全部楼层
我先贴这一部分的主要内容吧。
if(add==1)num=num1+num2;
                if(sub==1)num=num1-num2;
                if(mul==1)num=num1*num2;
                if(div==1)num=num1/num2;
                intnum=(int)num;
                floatnum=(int)((num-intnum)*1000000);
                numdot1=intnum%10;if(floatnum!=0)numdot1+=10;
                numdot2=intnum/10%10;
                numdot3=intnum/100%10;
                numdot4=intnum/1000%10;
                numdot5=intnum/10000%10;
                numdot6=intnum/100000;          
                if(numdot6>9){beep();wei1=wei2=wei3=wei4=wei5=wei6=21;}
                else
                {
                        dotnum1=floatnum/100000;
                        dotnum2=floatnum%100000/10000;
                        dotnum3=floatnum%10000/1000;
                        dotnum4=floatnum%1000/100;
                        dotnum5=floatnum%100/10;                                                    
                        dotnum6=floatnum%10;
                        determine();
                }
这是对最后的结果的数据处理。   把每一位都分为单独的数用以显示
回复

使用道具 举报

ID:70453 发表于 2014-12-14 16:32 | 显示全部楼层
f_s 发表于 2014-12-14 16:32
我先贴这一部分的主要内容吧。
if(add==1)num=num1+num2;
                if(sub==1)num=num1-num2;

不知道这样有没有错误
回复

使用道具 举报

ID:67796 发表于 2014-12-14 17:57 | 显示全部楼层
稍微看了下,你这代码没有用RPN,算是比较基础的,只能进行一些简单运算。

使用Waterfall Model开发出的软体往往会到最后测试时才发现连debug都无从下手。

建议用Evolutionary Model方法重新写一遍,从不断的smoke testing找寻出错的地方。

评分

参与人数 2黑币 +54 收起 理由
lzp17771832625 + 4 回帖助人的奖励!
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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