微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 初学者简易计算器程序纠错 求大神指导

初学者简易计算器程序纠错 求大神指导

时间: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);
                }
        }
}

发时间看看      

发时间看看,很不一般

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top