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

📄 calculator_1.lst

📁 keil开发51加减乘计算器 都说单片机做乘法很吃力 自己做了一个乘法计算器 感觉还可以 至少我没感觉有多慢
💻 LST
字号:
C51 COMPILER V8.02   CALCULATOR_1                                                          12/08/2008 15:19:11 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE CALCULATOR_1
OBJECT MODULE PLACED IN calculator_1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE calculator_1.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1           /***********计算器************/
   2           /*****可处理小数的乘法运算****/
   3           /**数码管动态显示六位数字*****/
   4           /**P0段选P1位选P2矩阵键盘(4*4)*/
   5           /*********0 1 2 3*************/
   6           /*********4 5 6 7*************/
   7           /*********8 9 .clr************/
   8           /*********+ - * =*************/
   9          #include<reg52.h>
  10          #include<intrins.h>
  11          #define uchar unsigned char
  12          #define uint unsigned int
  13          
  14          uchar code wordcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  15          0x07,0x7f,0x6f,0x71};
  16          
  17          long int weiq[]={1,10,100,1000,10000,100000};     //位权
  18          float weiqp[]={0.1,0.01,0.001,0.0001,0.00001,0.0000001};
  19          uchar duan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  20          uchar a[6];
  21          uchar b[6];
  22          uchar c[6];
  23          
  24          uchar disi;             //显示标志在中断显示正使用记录显示到哪一位                                              
  25          float af,bf,cf; //参加运算的浮点数
  26             
  27          char key;               //键值
  28          char abs;               //a,b,s的标志 
  29          char addsub;    //加减运算标志1加 2减 3乘
  30          uchar apoint,bpoint,cpoint;        // 小数点的位置1-6 1表示有一位整数 6表示6位整数 没有小数
  31          uchar adeepth,bdeepth,cdeepth; //数组深度可以理解为要显示的位数
  32          
  33          /******延时******/
  34          void delay(uchar xms)
  35          {
  36   1              uint i,j;
  37   1              for(i=xms*10;i>0;i--)
  38   1                      for(j=20;j>0;j--);
  39   1      }
  40          
  41          /******键盘扫描翻转法******/
  42          /********无键按下返回-5****/
  43          /******判断是否大于0*******/
  44          char keyscan()
  45          {
  46   1              uchar line=0,row=0,P2temp;
  47   1              P2=0xf0;
  48   1              P2temp=P2;
  49   1              if(P2temp!=0xf0)
  50   1              {
  51   2                      TR0=0;
  52   2                      delay(10);
  53   2                      TR0=1;
  54   2                      if(P2temp!=0xf0)
  55   2                      {
C51 COMPILER V8.02   CALCULATOR_1                                                          12/08/2008 15:19:11 PAGE 2   

  56   3                              switch(P2temp)
  57   3                              {
  58   4                                      case 0x70:row=1;break;
  59   4                                      case 0xb0:row=2;break;
  60   4                                      case 0xd0:row=3;break;
  61   4                                      case 0xe0:row=4;break;
  62   4                              }
  63   3                      }
  64   2                      P2=0x0f;
  65   2                      P2temp=P2;
  66   2                      switch(P2temp)
  67   2                      {
  68   3                              case 0x07:line=1;break;
  69   3                              case 0x0b:line=2;break;
  70   3                              case 0x0d:line=3;break;
  71   3                              case 0x0e:line=4;break;
  72   3                      }
  73   2              }
  74   1              return((row-1)*4+line-1);
  75   1      }
  76          
  77          
  78          /*******将数组的六个数转换成一个浮点数********/
  79          float convent(uchar *array,uchar point,uchar deepth)
  80          {
  81   1              uchar i;
  82   1              float temp=0;
  83   1              for(i=0;i<point;i++)                                     //计算整数部分
  84   1              {
  85   2                      temp=temp+array[i]*weiq[point-1-i];
  86   2              }
  87   1              for(i=0;i<deepth-point;i++)
  88   1              {                                                                           //计算小数部分
  89   2                  temp=temp+array[point+i]*weiqp[i];
  90   2              }
  91   1              return(temp);
  92   1      }
  93          /******获得结果的小数点位置******/
  94          void getcpoint()
  95          {
  96   1              if(cf>0&&cf<10)cpoint=1;
  97   1              else if (cf>=10&&cf<100)cpoint=2;
  98   1              else if (cf>=100&&cf<1000)cpoint=3;
  99   1              else if (cf>=1000&&cf<10000)cpoint=4;
 100   1              else if (cf>=10000&&cf<100000)cpoint=5;
 101   1              else if (cf>=100000&&cf<1000000)cpoint=6;
 102   1                      
 103   1      }
 104          
 105          /********分离每位数用于显示********/
 106          void cut()
 107          {
 108   1              uchar i;
 109   1              long int cut ;
 110   1              cdeepth=6;                                      
 111   1              cut=cf*weiq[6-cpoint];          // 先乘一系数取六位整数
 112   1              c[0]=cut/weiq[5];                   //最高位
 113   1              for(i=1;i<6;i++)
 114   1              {
 115   2                      c[i]=(cut%weiq[6-i])/weiq[5-i];
 116   2              }
 117   1              if(c[5]==0)                                
C51 COMPILER V8.02   CALCULATOR_1                                                          12/08/2008 15:19:11 PAGE 3   

 118   1              {
 119   2                      cdeepth=5;
 120   2                      if(c[4]==0)
 121   2                      {
 122   3                              cdeepth=4;
 123   3                              if(c[3]==0)
 124   3                              {
 125   4                                      cdeepth=3;
 126   4                                      if(c[2]==0)
 127   4                                      {
 128   5                                              cdeepth=2;
 129   5                                              if(c[1]==0)
 130   5                                              {
 131   6                                                      cdeepth=1;
 132   6                                                      if(c[0]==0)
 133   6                                                      cdeepth=0;
 134   6                                              }
 135   5                                      }
 136   4                              }
 137   3                      }
 138   2              }
 139   1      }
 140          
 141          /**********运算**********/
 142          void opreat()
 143          {
 144   1              af=convent(a,apoint,adeepth);  //计算出浮点数
 145   1              bf=convent(b,bpoint,bdeepth);
 146   1              if(addsub==1)
 147   1              cf=af+bf;
 148   1              if(addsub==2)
 149   1              cf=af-bf;
 150   1              if(addsub==3)
 151   1              cf=af*bf;
 152   1              getcpoint();
 153   1              cut();
 154   1      }
 155          
 156          
 157          void init()
 158          {
 159   1              uchar i;
 160   1              TMOD=0x01;      //定时器0 工作方式1
 161   1              TH0=0xf8;
 162   1              TL0=0xcc;       //2ms
 163   1              EA=1;
 164   1              ET0=1;
 165   1              TR0=1;
 166   1              for(i=0;i<6;i++)
 167   1              {
 168   2                      a[i]=0;
 169   2                      b[i]=0;
 170   2                      c[i]=0;
 171   2              }
 172   1              apoint=0;
 173   1              bpoint=0;
 174   1              cpoint=0;
 175   1              adeepth=0;
 176   1              bdeepth=0;
 177   1              cdeepth=0;
 178   1              addsub=0;
 179   1              abs=0;
C51 COMPILER V8.02   CALCULATOR_1                                                          12/08/2008 15:19:11 PAGE 4   

 180   1      //      disi=0;
 181   1      }
 182          main()
 183          {
 184   1              char P2temp;
 185   1              init();
 186   1              while(1)
 187   1              {
 188   2                      key=keyscan();
 189   2                      do
 190   2                      {
 191   3                              P2=0xf0;
 192   3                              P2temp=P2;
 193   3                      }
 194   2                      while((P2temp&0xf0)!=0xf0);
 195   2      
 196   2                      if(key<=9&&key>=0)
 197   2                      {
 198   3                              if(abs==0&&adeepth<=6)          //六位数未满 接收数
 199   3                              {       
 200   4                                      if(adeepth==0&&key==0)
 201   4                                      {
 202   5                                              apoint=1;
 203   5                                              adeepth=1;
 204   5                                      }
 205   4                                      else
 206   4                                      {                                               //将数存到a
 207   5                                              a[adeepth]=key;
 208   5                                              adeepth++;
 209   5                                      }
 210   4                              }
 211   3                              if(abs==1&&bdeepth<=6)          //将数传到b
 212   3                              {
 213   4                                      if(bdeepth==0&&key==0)
 214   4                                      {
 215   5                                              bpoint=1;
 216   5                                              bdeepth=1;
 217   5                                      }
 218   4                                      else
 219   4                                      {
 220   5                                              b[bdeepth]=key;
 221   5                                              bdeepth++;
 222   5                                       }
 223   4                              }
 224   3                                                      
 225   3                      }
 226   2                      if(key==10)
 227   2                      {                                                               //小数点 记录小数点的位置
 228   3                              if(abs==1&&bpoint==0)bpoint=bdeepth;
 229   3                              if(abs==0&&apoint==0)apoint=adeepth;            
 230   3                      }
 231   2                      if(key==12&&abs==0)
 232   2                      {
 233   3                              abs=1;                                  //加号
 234   3                              addsub=1;                                       //加减标志 1加2 减
 235   3                      }
 236   2                      if(key==13&&abs==0)
 237   2                      {
 238   3                              abs=1;                                          //减
 239   3                              addsub=2;
 240   3                      }
 241   2                      if(key==14&&abs==0)
C51 COMPILER V8.02   CALCULATOR_1                                                          12/08/2008 15:19:11 PAGE 5   

 242   2                      {
 243   3                              abs=1;                                          //减
 244   3                              addsub=3;
 245   3                      }
 246   2                      if(key==15&&abs==1)
 247   2                      {
 248   3                              if(apoint==0)apoint=adeepth;
 249   3                              if(bpoint==0)bpoint=bdeepth;
 250   3                              opreat();
 251   3                              abs=2;
 252   3                      }
 253   2                      if(key==11)init();
 254   2              }
 255   1      }
 256          
 257          void display() interrupt 1
 258          {
 259   1              TH0=0xF8;
 260   1              TL0=0xcc;
 261   1              if(abs==0)
 262   1              {
 263   2                      if(disi!=adeepth)
 264   2                      {
 265   3                         P1=duan[adeepth-disi-1];
 266   3                         if((apoint!=0)&&(disi==apoint-1))                    //有小数点
 267   3                                P0=wordcode[a[disi]]|0x80;
 268   3                         else
 269   3                                P0=wordcode[a[disi]];
 270   3                         disi++;  
 271   3                      }
 272   2                      else disi=0;
 273   2              }
 274   1              if(abs==1)
 275   1              {
 276   2                      if(disi!=bdeepth)
 277   2                      {
 278   3                         P1=duan[bdeepth-disi-1];
 279   3                         if((bpoint!=0)&&(disi==bpoint-1))                    //有小数点
 280   3                                P0=wordcode[b[disi]]|0x80;
 281   3                         else
 282   3                                P0=wordcode[b[disi]];
 283   3                         disi++;  
 284   3                      }
 285   2                      else disi=0;
 286   2              }
 287   1              if(abs==2)
 288   1              {
 289   2                      if(disi!=cdeepth)
 290   2                      {
 291   3                         P1=duan[cdeepth-disi-1];
 292   3                         if((cpoint!=0)&&(disi==cpoint-1))                    //有小数点
 293   3                                P0=wordcode[c[disi]]|0x80;
 294   3                         else
 295   3                                P0=wordcode[c[disi]];
 296   3                         disi++;  
 297   3                      }
 298   2                      else disi=0;
 299   2              }               
 300   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V8.02   CALCULATOR_1                                                          12/08/2008 15:19:11 PAGE 6   

   CODE SIZE        =   1467    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     94      18
   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 + -