基于51单片机和四位数码管的智能计算器算法

   前段时间,本人写了基于51单片机和四位数码管的智能计算器算法,由于时间关系,算法没能实现小数部分,但已为小数部分留出空间,有兴趣的可以添加进去

下面是源代码(矩阵键盘的检测部分参考了普中科技的实验例程)

                                                                             

#include "reg52.h"            
#include "math.h"
                                                                                                                                                                                                                                                                                                                                                                                                                                     
typedef unsigned int u16;      
typedef unsigned char u8;

#define GPIO_DIG P0
#define GPIO_KEY P1

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
float m,l;
int t;
char  a, j;
char  b[4];
char  n=0, fuhao;
char  bj=0, xs, xsbj, xsb=0, x,xa;


u8  KeyValue;    
u8  DisplayData[4];


u8 data  smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f};//显示0~F的值
u8 data smgxiaoshu[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
                    0xff,0xef};
void delay(u16 i)
{
    while(i--);    
}


void KeyDown(void)
{
    char c=0;
    
    GPIO_KEY=0x0f;
    if(GPIO_KEY!=0x0f)//读取按键是否按下
    {
        delay(1000);//延时10ms进行消抖
        if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
        {    
            //测试列
            GPIO_KEY=0X0F;
            switch(GPIO_KEY)
            {
                case(0X07):    KeyValue=0;break;
                case(0X0b):    KeyValue=1;break;
                case(0X0d): KeyValue=2;break;
                case(0X0e):    KeyValue=3;break;
            }
            //测试行
            GPIO_KEY=0XF0;
            switch(GPIO_KEY)
            {
                case(0X70):    KeyValue=KeyValue;break;
                case(0Xb0):    KeyValue=KeyValue+4;break;
                case(0Xd0): KeyValue=KeyValue+8;break;
                case(0Xe0):    KeyValue=KeyValue+12;break;
            }
            while((c<50)&&(GPIO_KEY!=0xf0))    
            {
                delay(1000);
                c++;
            }
            switch(KeyValue)
            {
              case 0:  a=7;break;
              case 1:  a=8;break;
              case 2:  a=9;break;
              case 3:  a=-1;break;
              case 4:  a=4;break;
              case 5:  a=5;break;
              case 6:  a=6;break;
              case 7:  a=-2;break;
              case 8:  a=1;break;
              case 9:  a=2;break;
              case 10: a=3;break;
              case 11: a=-3;break;
              case 12: a=-4;break;
              case 13: a=0;break;
              case 14: a=-5;break;
              case 15: a=-6;break;
            }
            if(a>=0)
            {
               n++;
            }
            if(a<0&&a!=-5&&a!=-4)
            {
               n=0;
            }
            
        }
    }
}


void DigDisplay()
{
    u8 i;
    for(i=0;i<4;i++)
    {
        switch(i)    
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            
        }
        P0=DisplayData[i];
        delay(100); //间隔一段时间扫描    
        P0=0x00;//消隐
    }
}

void shuruzhi()
{
   int i;
 
   switch(n)
    {
        case 0:
               DisplayData[0]=0x00;DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=0x00;
               i=0; break;
        case 1:
               if(i==0)
              {
                
                     b[0]=a;
                  DisplayData[0]=smgduan[a]; DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=0x00;
                   i++ ;
                   x=1;
                }
                   break;
        case 2:
               if(i==1)
               {
               b[1]=b[0];b[0]=a;
               DisplayData[1]=DisplayData[0];DisplayData[2]=0x00;DisplayData[3]=0x00;DisplayData[0]=smgduan[a];
               i++;
               x=2;
               }
               break;
        case 3:
               
               if(i==2)
               {    
               b[2]=b[1];b[1]=b[0];b[0]=a;
               DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[0]=smgduan[a];DisplayData[3]=0x00;
               i++;
               x=3;
               }
               break;
        case 4:
               if(i==3)
               {
               b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;
               DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[0]=smgduan[a];
               i++;
               x=4;
               }
               break;
               
      }
      if(a==-4)
      {
           DisplayData[0]=smgxiaoshu[b[0]];
            xs=a;
         xsbj=x;
      }
      if(n==1)
      {
        b[1]=0;b[2]=0;b[3]=0;
      }      
      if(n==2)
      {
        b[2]=0;b[3]=0;
      }
      if(n==3)
      {
          b[3]=0;
      }
          if(a<0)
        {
          if(xs==-4)
          {
          xsbj=x-xsbj;
          if(xs==-4&&xsbj!=0)
          {
             if(xsbj==1)
             {
               l=b[3]*100+b[2]*10+b[1]*1+b[0]*0.1;
             }
             if(xsbj==2)
             {
               l=b[3]*10+b[2]*1+b[1]*0.1+b[0]*0.01;
             }
             if(xsbj==3)
             {
               l=b[3]*1+b[2]*0.1+b[1]*0.01+b[0]*0.001;
             }
             xsbj=0;
          }
          xa=xs;
          xs=0;
          }
         else
             l=b[3]*1000+b[2]*100+b[1]*10+b[0];

        }       

}
void yunsuan()
{
  if(bj==0&&a<0)
  {
     m=l;
     bj++;
     fuhao=a;
     a=11;
  }
  else
  {
     if(a!=-5&&a<0&&a!=-4)
     {
          switch(fuhao)
          {
             case -1:
                     m=m+l;
                     fuhao=a;
                     a=11;
                     break;
             case -2:
                      m=m-l;
                      fuhao=a;
                      a=11;
                      break;
             case -3:
                     m=m*l;
                     fuhao=a;
                     a=11;
                     break;
            case -6:
                    m=m/l;
                    fuhao=a;
                    a=11;
                    break;
          }
     }
     if(a==-5)
     {    
           switch(fuhao)
          {
             case -1:
                     m=m+l;
                     fuhao=-1;
                     a=11;
                     break;
             case -2:
                      m=m-l;
                      fuhao=-2;
                      a=11;
                      break;
             case -3:
                     m=m*l;
                     fuhao=-3;
                     a=11;
                     break;
            case -6:
                    m=m/l;
                    fuhao=-6;
                    a=11;
                    break;
          }
        if(m<0)
        {
          if(xs==-4)
          {
            t=-m*100;
          }
          else
          {
            t=-m;
          if(t<10)
          {  
             DisplayData[3]=0x00;                                                    
             DisplayData[2]=0x00;
             DisplayData[1]=0x40;
             DisplayData[0]=smgduan[(((t%1000)%100)%10)];

          }
           if(t<100&&t>=10)
          {
             DisplayData[3]=0x00;
               DisplayData[2]=0x40;
             DisplayData[1]=smgduan[(((t%1000)%100)/10)];
             DisplayData[0]=smgduan[(((t%1000)%100)%10)];  
          }
           if(t<1000&&t>=100)
          {
            DisplayData[3]=0x40;
               DisplayData[2]=smgduan[((t%1000)/100)];
              DisplayData[1]=smgduan[(((t%1000)%100)/10)];
            DisplayData[0]=smgduan[(((t%1000)%100)%10)];   
          }
          }
          }
        else
        {
           if(xa==-4)
          {
            t=m*100;
            xa=0;
          }
          else
          {
            t=m;
          }
           if(t<10)
          {  
             DisplayData[3]=0x00;                                                    
             DisplayData[2]=0x00;
             DisplayData[1]=0x00;
             DisplayData[0]=smgduan[(((t%1000)%100)%10)];

          }
          if(t>=10&&t<100)
          {
             DisplayData[3]=0x00;
               DisplayData[2]=0x00;
             DisplayData[1]=smgduan[(((t%1000)%100)/10)];
             DisplayData[0]=smgduan[(((t%1000)%100)%10)];  
          }
          if(t>=100&&t<1000)
          {
            DisplayData[3]=0x00;
               DisplayData[2]=smgduan[((t%1000)/100)];
              DisplayData[1]=smgduan[(((t%1000)%100)/10)];
            DisplayData[0]=smgduan[(((t%1000)%100)%10)];   
          }
          if(t>=1000&t<10000)
          {
            DisplayData[3]=smgduan[(t/1000)];
               DisplayData[2]=smgduan[((t%1000)/100)];
              DisplayData[1]=smgduan[(((t%1000)%100)/10)];
            DisplayData[0]=smgduan[(((t%1000)%100)%10)];
          }
          }
        }
         }
 
}



void main()
{    char i,t=0;
    
    for(i=0;i<4;i++)
    {
      DisplayData[0]=0x3f;
      b[i]=0;
    }  


   while(1)
   {
      KeyDown();
      shuruzhi();
      yunsuan();
      DigDisplay();
  }
}
如需借用请标明出处!


  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值