⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 caculator.c

📁 基于单片机最小系统的开发的计算器
💻 C
字号:
#include <reg51.h>
#include <absacc.h>
#include <math.h>
#define uchar unsigned char
#define scan XBYTE[0xa100] // /*键盘*/

sbit p1_7=P1^7;
sbit p1_6=P1^6;

bit vkey=0;
bit ss=0; /*显示数组标志位*/
  
bdata uchar sss[]={1,1}; /*是否显示标志位*/

bdata uchar knot[]={0,0};//小数点标志位

uchar n=0;/*显示位数*/
uchar mmm[]={0,0};/*x,y的位数*/

float x,y;/*两个操作数*/

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0x46,0xa1,0x86,0x8e,0xee,0xbf};//16,17 是 R,-
uchar idata *d=table;

uchar key;  /*键值*/
uchar leddata0[9];
uchar leddata1[9];

void delay(unsigned int xx)  /*延迟xx ms */
{uchar j;
 while(xx--){
   for(j=0;j<125;j++)
   {;}
}
return;
}

void disp0(uchar n)
{
 if(knot[0]!=n)
 {XBYTE[0xa000+n]=table[leddata0[n]];}
 else
 {XBYTE[0xa000+n]=table[leddata0[n]]+0x80;}
 return;
}

void disp1(uchar n)
{if(knot[1]!=n)
 {XBYTE[0xa000+n]=table[leddata1[n]];}
 else
 {XBYTE[0xa000+n]=table[leddata1[n]]+0x80;}
 return;
}

void myled(void) interrupt 1   /*中断显示一位LED*/
{TH0=0x0e0;
 TL0=0x18;
 TR0=1;
 n=n%8;
 if(!ss)disp0(n);
 if(ss)disp1(n);
 n++;
 return;
}

void error(void)
{ EA=0;
  while(1){
  XBYTE[0Xa004]=0x86;
  delay(1);
  XBYTE[0xa003]=0x0ce;
   delay(1);
   XBYTE[0xa002]=0x0ce;
   delay(1);
   XBYTE[0xa001]=0xc0;
   delay(1);
   XBYTE[0xa000]=0x0ce;
   delay(1);
  }
   return;
}

void scan1(void)
{p1_7=p1_6=0;
 key=scan;
 p1_7=p1_6=1;
 key=~key;
 return;
}

void scan0(void)
{p1_6=0;
 p1_7=1;
 key=scan;
 key=~key;
 p1_6=1;
 if(key!=0)
 { switch(key)
   {
    case 1 : key=0;break;
    case 2 : key=1;break;
    case 4 : key=2;break;
    case 8 : key=3;break;
    case 16 :key=4;break;
    case 32 :key=5;break;
    case 64 :key=6;break;
    case 128 :key=7;break;
    }
    return;
  }
 p1_6=1;
 p1_7=0;
 key=scan;
 key=~key;
 p1_7=1;
  if(key!=0)
  {switch(key)
   {
    case 1 : key=8;break;
    case 2 : key=9;break;
    case 4 : key=0x0a;break;
    case 8 : key=0x0b;break;
    case 16 :key=0x0c;break;
    case 32 :key=0x0d;break;
    case 64 :key=0x0e;break;
    case 128 :key=0x0f;break;
    }
 return;
}
 
 return;
}

void led8()
{uchar k,pot=0;
 float temp;
 sss[0]=0xff;
 temp=x;
 while(temp<10000000)
 {temp=temp*10;
  pot++;
  }
  if(pot<=7)
  {for(k=0;k<=7;k++) /*有整数位*/
    {leddata0[k]=((signed long)temp)%10;
     temp=((signed long)temp)/10;
    }
   knot[0]=pot;
  //for(k=0;k<=pot;k++)knot[0]=knot[0]*2;
  }
  else
   { for(k=7;k>=15-pot;k--)
      {leddata0[k]=0;
       temp=((signed long)temp)/10;
      }
     for(k=0;k<=14-pot;k++)
      {leddata0[k]=((signed long)temp)%10;
       temp=((signed long)temp)/10;
      }
      knot[0]=7;
      return;
 }
  return;
  }
  

void myadd(void)
{x=x+y;
 if(x>=100000000) error();
 led8();
 return;
}

void mysub(void)
{uchar k,pot=0;
 float temp;
 
 x=x-y;
 if(x>=0)
  {if(x>=100000000) error();
   led8();
   return;
  }
  else
   {temp=-x;
    if(temp>=10000000)error();
    leddata0[7]=17;
    while(temp<1000000)
     {temp=temp*10;
      pot++;
     }
     if(pot<=6)
     {for(k=0;k<=6;k++)
       {leddata0[k]=((signed long)temp)%10;
        temp=((signed long)temp)/10;
       }
    knot[0]=pot;
     }
     else
    {for(k=6;k>=13-pot;k--)
       {leddata0[k]=0;
        temp=((signed long)temp)/10;
       }
     for(k=0;k<=12-pot;k++)
       {leddata0[k]=((signed long)temp)%10;
       temp=((signed long)temp)/10;
      }
      knot[0]=6;
      
    }
    return;
  }
 return;
 }

void mymul(void)
{x=x*y;
 if(x>100000000)error();
 led8();
 return;
}

void mydiv(void)
{x=x/y;
 if(x>=100000000) error();
 led8();
 return;
}

main()
{uchar k=0,keynum,cal,sum,ii,knotnum[2]={0,0};
 float keynum0;
 bit myequ=0,myknot=0;
 TMOD=0x00;
 EA=1;
 ET0=1;
 TH0=0xe0;
 TL0=0x18;
 TR0=1;
 while(1)
 {
  scan1();
  if(key!=0)
   {delay(10);
    scan1();
    if(key!=0)
      {vkey=1; //有键按
       scan0();
       keynum=key;
       while(vkey){scan1();if(key==0)vkey=0;}
     //  leddata0[k]=keynum;
     //  k++;
       switch(keynum)
        {
          case 0x0a: cal=0;ss=1;myknot=0;break;
          case 0x0b: cal=1;ss=1;myknot=0;break;
          case 0x0c: cal=2;ss=1;myknot=0;break;
          case 0x0d: cal=3;ss=1;myknot=0;break;
          case 0x0e: myequ=1;
                     switch(cal)
                          { case 0: myadd();ss=0;break;
                            case 1: mysub();ss=0;break;
                            case 2: mymul();ss=0;break;
                            case 3: mydiv();ss=0;break;
                          }
          case 0x0f: if(!myknot&!myequ)
                      {myknot=1;
                       //if(!ss)
                       // {knot[0]=1;
                       //  for(k=1;k<=mmm[0];k++)knot[0]=knot[0]*2;
                       // }
                      // if(ss)
                       //   { knot[1]=1;
                      //      for(k=1;k<=mmm[1];k++)knot[1]=knot[1]*2;
                       //   }
                        break;
                      }
                      break;
          default:
                  if(myequ)ss=1;
                  if(!myknot)
                  {sum=1;
                    {if(!ss)ii=0;
                     if(ss) ii=1;
                     if(mmm[ii]>7) error();
                     if(!ss){
                       for(k=6;k>=1;k--)
                       leddata0[k+1]=leddata0[k];
                       leddata0[1]=leddata0[0];
                       leddata0[0]=keynum;
                       x=x*10+keynum;
                       }
                     if(ss){
                       for(k=6;k>=1;k--)
                       leddata1[k+1]=leddata1[k];
                       leddata1[1]=leddata1[0];
                       leddata1[0]=keynum;
                       y=y*10+keynum;
                       }
                       mmm[ii]++;
                       for(k=0;k<mmm[ii];k++) sum=sum*2;
                         if(!ss)   sss[0]=sss[0]+sum;
                         if(ss)    sss[1]=sss[1]+sum;
                         }
                  }
                 if(myknot)
                   {sum=1;
                      {if(!ss)ii=0;
                       if(ss) ii=1;
                       if(mmm[ii]>7)error();
                       if(!ss){
                       for(k=6;k>=1;k--)
                       leddata0[k+1]=leddata0[k];
                       leddata0[1]=leddata0[0];
                       leddata0[0]=keynum;
                       keynum0=keynum;
                       knotnum[ii]++;
                       for(k=0;k<knotnum[ii];k++)keynum0=keynum0*0.1;
                       x=x+keynum0;
                       knot[0]++;
                       //leddata0[0]=knot[0];
                       }
                     if(ss){
                       for(k=6;k>=1;k--)
                       leddata1[k+1]=leddata1[k];
                       leddata1[1]=leddata1[0];
                       leddata1[0]=keynum;
                       keynum0=keynum;
                       knotnum[ii]++;
                       for(k=0;k<knotnum[ii];k++)keynum0=keynum0*0.1;
                       y=y+keynum0;
                       knot[1]++;
                       }
                       mmm[ii]++;
                       for(k=0;k<mmm[ii];k++)sum=sum*2;
                       sss[ii]=sss[ii]+sum;
                      }
        }
      }
    }
 }
 }                    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -