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

📄 main.lst

📁 采用51单片机开发板实现计算器
💻 LST
📖 第 1 页 / 共 2 页
字号:
 256   2                      Led_buf[i] = Ledcode[i_num/sit];
 257   2                      i_num -= i_num/sit*sit;
 258   2              }
 259   1              Led_buf[0] = Ledcode[i_num] & 0x7F;
 260   1              if (s_flag)
 261   1                      Led_buf[5] = Ledcode[11];
 262   1              else
 263   1                      Led_buf[5] = Ledcode[10];
 264   1              ET0 = 1;
 265   1      
 266   1      }
 267          
 268          /*
 269           * 制作数码管浮点数据
 270          */
 271          void make_led_fnumber(float f_num)
 272          {
 273   1              bit s_flag=0;
 274   1              int32 num;
 275   1              int16 sit;
 276   1              int8 i, decimal, dot_sit=0;
 277   1      
 278   1      
 279   1              if (f_num < 0)
 280   1              {
 281   2                      s_flag = 1;
 282   2                      f_num = -f_num;
 283   2              }
 284   1              
 285   1              num = (int32)(f_num*10000+0.5);
 286   1              for (decimal=4; decimal>0; decimal--)
 287   1              {
 288   2                      if (num % 10 != 0)
 289   2                              break;
 290   2                      num /= 10;
 291   2              }
 292   1              
 293   1              dot_sit = decimal;
 294   1              if (f_num >= 10000)
 295   1                      dot_sit = 0;
 296   1              else if (f_num >= 1000)
 297   1                      if (decimal >= 1)
 298   1                              dot_sit = 1;
 299   1              else if (f_num >= 100)
 300   1                      if (decimal >= 2)
 301   1                              dot_sit = 2;
 302   1              else if (f_num >= 10)
 303   1                      if (decimal >= 3)
C51 COMPILER V8.02   MAIN                                                                  12/24/2010 23:09:03 PAGE 6   

 304   1                              dot_sit = 3;
 305   1      
 306   1              for (i=0; i<dot_sit; i++)
 307   1                      f_num *= 10;
 308   1              num = (int32)(f_num+0.5);
 309   1      
 310   1              ET0 = 0;
 311   1              for (i=4, sit=10000; i>=1; i--, sit/=10)
 312   1              {
 313   2                      if (num >= sit)
 314   2                              break;
 315   2                      if (i == dot_sit)
 316   2                              break;
 317   2                      Led_buf[i] = Ledcode[10];
 318   2                      num -= num/sit*sit;
 319   2              }
 320   1              for (;i>=1; i--, sit/=10)
 321   1              {
 322   2                      Led_buf[i] = Ledcode[num/sit];
 323   2                      num -= num/sit*sit;
 324   2              }
 325   1              Led_buf[0] = Ledcode[num];
 326   1              Led_buf[dot_sit] &= 0x7F;
 327   1              if (s_flag)
 328   1                      Led_buf[5] = Ledcode[11];
 329   1              else
 330   1                      Led_buf[5] = Ledcode[10];
 331   1              ET0 = 1;
 332   1      
 333   1      }
 334          
 335          /*
 336           * 数码管显示
 337          */
 338          void show_num(uint8 *buf)
 339          {
 340   1              ENLED = 1;
 341   1              switch (Led_n)
 342   1              {
 343   2                      case 0: 
 344   2                              ADDR0 = 0;
 345   2                              ADDR1 = 0;
 346   2                              ADDR2 = 0;
 347   2                              P0 = buf[0];
 348   2                              break;
 349   2                      case 1: 
 350   2                              ADDR0 = 1;
 351   2                              ADDR1 = 0;
 352   2                              ADDR2 = 0;
 353   2                              P0 = buf[1];
 354   2                              break;
 355   2                      case 2: 
 356   2                              ADDR0 = 0;
 357   2                              ADDR1 = 1;
 358   2                              ADDR2 = 0;
 359   2                              P0 = buf[2];
 360   2                              break;
 361   2                      case 3: 
 362   2                              ADDR0 = 1;
 363   2                              ADDR1 = 1;
 364   2                              ADDR2 = 0;
 365   2                              P0 = buf[3];
C51 COMPILER V8.02   MAIN                                                                  12/24/2010 23:09:03 PAGE 7   

 366   2                              break;
 367   2                      case 4: 
 368   2                              ADDR0 = 0;
 369   2                              ADDR1 = 0;
 370   2                              ADDR2 = 1;
 371   2                              P0 = buf[4];
 372   2                              break;
 373   2                      case 5: 
 374   2                              ADDR0 = 1;
 375   2                              ADDR1 = 0;
 376   2                              ADDR2 = 1;
 377   2                              P0 = buf[5];
 378   2                              break;
 379   2              }
 380   1              ENLED = 0;
 381   1      
 382   1              if (Led_n >= 5)
 383   1                      Led_n = 0;
 384   1              else
 385   1                      Led_n++;
 386   1      }
 387          
 388          /*
 389           * 计算程序
 390          */
 391          void calculate(int8 key_val)
 392          {
 393   1              float ans;
 394   1              bit err=0;
 395   1      
 396   1              if ((key_val >= FADD) && (key_val <= FDIV))
 397   1              {
 398   2                      C_flag = key_val;
 399   2              }
 400   1              else if (key_val == FEQU)
 401   1              {
 402   2                      switch (C_flag)
 403   2                      {
 404   3                              case FADD:      ans = Tmp1+Tmp2; break;
 405   3                              case FSUB:      ans = Tmp1-Tmp2; break;
 406   3                              case FMUL:      ans = Tmp1*Tmp2; break;
 407   3                              case FDIV:      if (Tmp2 == 0)
 408   3                                                      {
 409   4                                                              err = 1;
 410   4                                                              break;
 411   4                                                      }
 412   3                                                      else
 413   3                                                      {
 414   4                                                              ans = Tmp1/Tmp2; 
 415   4                                                              break;
 416   4                                                      }
 417   3                      }
 418   2                      if (check_num(ans))
 419   2                              err = 1;
 420   2                      if (err)
 421   2                              make_led_error();
 422   2                      else
 423   2                              make_led_fnumber(ans);
 424   2                      C_flag = 0;
 425   2                      Tmp1 = 0;
 426   2                      Tmp2 = 0;
 427   2              }
C51 COMPILER V8.02   MAIN                                                                  12/24/2010 23:09:03 PAGE 8   

 428   1              else if (key_val == FRES)
 429   1              {
 430   2                      make_led_fnumber(0);
 431   2                      C_flag = 0;
 432   2                      Tmp1 = 0;
 433   2                      Tmp2 = 0;
 434   2              }
 435   1              else
 436   1              {
 437   2                      if (C_flag == 0)
 438   2                      {
 439   3                              ans = Tmp1;
 440   3                              ans *= 10;
 441   3                              ans += key_val;
 442   3                              if (check_num(ans))
 443   3                                      return;
 444   3                              else
 445   3                                      Tmp1 = ans;
 446   3                              make_led_inumber(Tmp1);
 447   3                      }
 448   2                      else
 449   2                      {
 450   3                              ans = Tmp2;
 451   3                              ans *= 10;
 452   3                              ans += key_val;
 453   3                              if (check_num(ans))
 454   3                                      return;
 455   3                              else
 456   3                                      Tmp2 = ans;
 457   3                              make_led_inumber(Tmp2);
 458   3                      }
 459   2      
 460   2              }
 461   1      
 462   1      }
 463          
 464          
 465          
 466          main()
 467          {
 468   1              int8 key_val;
 469   1      
 470   1              ADDR3 = 1;
 471   1              ENLED = 0;
 472   1      
 473   1              make_led_inumber(0);
 474   1      
 475   1          TMOD = 0x01;
 476   1          TH0 = 0xF8;       
 477   1          TL0 = 0xCC;
 478   1          TR0 = 1; 
 479   1              ET0 = 1;
 480   1              EA = 1;
 481   1      
 482   1              while (1)
 483   1              {
 484   2                      key_val = scan_key();
 485   2                      if (key_val == -1)
 486   2                              continue;
 487   2                      calculate(key_val);
 488   2      
 489   2              }
C51 COMPILER V8.02   MAIN                                                                  12/24/2010 23:09:03 PAGE 9   

 490   1      }
 491          
 492          
 493          void time0() interrupt 1
 494          {
 495   1              TR0 = 0;
 496   1              TH0 = 0xF8;
 497   1              TL0 = 0xCC;
 498   1      
 499   1              show_num(Led_buf);
 500   1      
 501   1              TR0 = 1;
 502   1      }
 503          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2082    ----
   CONSTANT SIZE    =     13    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16      30
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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