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

📄 calc.lst

📁 在51单片机上实现多功能计算器功能
💻 LST
字号:
C51 COMPILER V7.07   CALC                                                                  10/23/2007 21:19:49 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE CALC
OBJECT MODULE PLACED IN calc.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE calc.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include"calc.h"
   2          
   3          
   4          void main(void)
   5          {
   6   1              init(); //键盘定时扫描初始化
   7   1              status=0;
   8   1              display(0);
   9   1              //getkey();
  10   1              while(1)
  11   1              {
  12   2                      Refresh(ledbuf);
  13   2              }
  14   1      }
  15          
  16          void display(signed long x)
  17          {
  18   1              signed long data t;
  19   1              unsigned long data tc;
  20   1              int data i,p,tp;
  21   1              int fst=0;
  22   1              for(i=0;i<MAX_DISPLAY_CHAR;i++)
  23   1              {
  24   2                      ledbuf[i]=0xff;
  25   2              }
  26   1              t=x;
  27   1              if(x>=100000000||x<=-10000000){return;}//整数溢出
  28   1              else if(x>=10000000||x<=-1000000){i=8;}
  29   1              else if(x>=1000000||x<=-100000){i=7;}
  30   1              else if(x>=100000||x<=-10000){i=6;}
  31   1              else if(x>=10000||x<=-1000){i=5;}
  32   1              else if(x>=1000||x<=-100){i=4;}
  33   1              else if(x>=100||x<=-10){i=3;}
  34   1              else if(x>=10||x<0){i=2;}
  35   1              else{i=1;}
  36   1      
  37   1              if(x<0)
  38   1              {
  39   2                      ledbuf[--i]=0x2d;//负号处理
  40   2                      t*=-1;
  41   2              }
  42   1               
  43   1              for(p=i-1;p>=0;p--)
  44   1              {
  45   2                      tc=1;
  46   2                      for(tp=p;tp>0;tp--) tc*=10; 
  47   2                      ledbuf[p]=t/tc;
  48   2                      t=t-(ledbuf[p]*tc);
  49   2              }
  50   1              for(i=MAX_DISPLAY_CHAR-1;i>=0;i--)
  51   1              {
  52   2                      if(fst!=0||ledbuf[i]!=0||i==0)
  53   2                      {
  54   3                              ledbuf[i]=value2led(ledbuf[i]);
  55   3                              fst=1;
C51 COMPILER V7.07   CALC                                                                  10/23/2007 21:19:49 PAGE 2   

  56   3                      }
  57   2                      else 
  58   2                      {
  59   3                              ledbuf[i]=0xff;         
  60   3                      }
  61   2              }
  62   1              return;
  63   1      }
  64          
  65          char value2led(char ch)
  66          {
  67   1              switch(ch)
  68   1              {
  69   2                      case 0x00: return 0xc0;
  70   2                      case 0x01: return 0xf9;
  71   2                      case 0x02: return 0xa4;
  72   2                      case 0x03: return 0xb0;
  73   2                      case 0x04: return 0x99;
  74   2                      case 0x05: return 0x92;
  75   2                      case 0x06: return 0x82;
  76   2                      case 0x07: return 0xf8;
  77   2                      case 0x08: return 0x80;
  78   2                      case 0x09: return 0x90;
  79   2                      case 0x2d: return 0xbf;
  80   2              }
  81   1      }
  82          
  83          void getkey (void) interrupt 1 using 0
  84          //定时扫描键盘 
  85          {
  86   1              char data mykey;
  87   1              mykey = input();
  88   1              if(mykey==0)
  89   1              {
  90   2                      return;
  91   2              }
  92   1              else
  93   1              {
  94   2                      calc(mykey);
  95   2              }
  96   1        return;
  97   1       }
  98          
  99          void calc(char cur)
 100          {
 101   1              if(cur=='0')cur=0;
 102   1              if(cur>=0x00&&cur<=0x09)
 103   1                      digits(cur);
 104   1              else
 105   1                      operator(cur);
 106   1              return;
 107   1      }
 108          void digits(char dt)
 109          {
 110   1              if(status==0)
 111   1              {
 112   2                      if(lvalue>=10000000) return;
 113   2                      lvalue*=10;
 114   2                      lvalue+=dt;
 115   2                      display(lvalue);
 116   2              }
 117   1              else if(status==1)
C51 COMPILER V7.07   CALC                                                                  10/23/2007 21:19:49 PAGE 3   

 118   1              {
 119   2                      if(rvalue>=10000000) return;
 120   2                      rvalue*=10;
 121   2                      rvalue+=dt;
 122   2                      display(rvalue);
 123   2              }
 124   1              return;
 125   1      }
 126          void operator(char op)
 127          {
 128   1              status++;
 129   1              switch(op)
 130   1              {
 131   2                      case '+':
 132   2                      case '-':
 133   2                      case '*':
 134   2                      case '/':
 135   2                              if(status==1||status==0)
 136   2                              {
 137   3                                      lasttoken=op;
 138   3                              }
 139   2                              else if(status==2)
 140   2                              {
 141   3                                      deal();
 142   3                              }
 143   2                              status=1;
 144   2                              break;
 145   2                      case '=':
 146   2                              if(lasttoken==0) return;
 147   2                              deal();
 148   2                              status=0;
 149   2                              break;
 150   2                      case 'C':
 151   2                              lasttoken=op;
 152   2                              deal();
 153   2                              status=0;
 154   2                              break;
 155   2                      case 'S':
 156   2                              lasttoken=op;
 157   2                              deal();
 158   2                              status=0;
 159   2              }
 160   1              return;
 161   1      }
 162          
 163          void deal()
 164          {
 165   1              long result=0;
 166   1              long num;
 167   1              switch(lasttoken)
 168   1              {       
 169   2                      case '+':
 170   2                              result=lvalue+rvalue;
 171   2                              break;
 172   2                      case '-':
 173   2                              result=lvalue-rvalue;
 174   2                              break;
 175   2                      case '*':
 176   2                              result=lvalue*rvalue;
 177   2                              break;
 178   2                      case '/':
 179   2                              if(rvalue==0) return;
C51 COMPILER V7.07   CALC                                                                  10/23/2007 21:19:49 PAGE 4   

 180   2                              result=lvalue/rvalue;
 181   2                              break;
 182   2                      case 'C':
 183   2                              lasttoken=0;
 184   2                              break;
 185   2                      case 'S':
 186   2                              if(status==2&&rvalue!=0) num=rvalue;
 187   2                              else num=lvalue;
 188   2                              result=square((double)num);
 189   2                              lasttoken=0;                    
 190   2                              break;
 191   2              }
 192   1              if(result>=100000000)result=0;
 193   1              lvalue=result;
 194   1              display(lvalue);
 195   1              rvalue=0;
 196   1              return;
 197   1      }
 198          long absc(long dt)
 199          {
 200   1              if(dt>=0) return dt;
 201   1              else return dt*(-1);
 202   1      }
 203          
 204          int square(double dt)
 205          {
 206   1              double result;
 207   1              result=dt/2;
 208   1          while (absc(result*result-dt)>1)
 209   1          result=(result+dt/result)/2;
 210   1              return result;
 211   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1607    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     18      41
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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