main.lst

来自「手把手教你单片机」· LST 代码 · 共 542 行 · 第 1/2 页

LST
542
字号
 255   2                      Led_buf[i] = Ledcode[i_num/sit];
 256   2                      i_num -= i_num/sit*sit;
 257   2              }
 258   1              Led_buf[0] = Ledcode[i_num] & 0x7F;
 259   1              if (s_flag)
 260   1                      Led_buf[5] = Ledcode[11];
 261   1              else
 262   1                      Led_buf[5] = Ledcode[10];
 263   1              ET0 = 1;
 264   1      
 265   1      }
 266          
 267          /*
 268           * 制作数码管浮点数据
 269          */
 270          void make_led_fnumber(float f_num)
 271          {
 272   1              bit s_flag=0;
 273   1              int32 num;
 274   1              int16 sit;
 275   1              int8 i, decimal, dot_sit=0;
 276   1      
 277   1      
 278   1              if (f_num < 0)
 279   1              {
 280   2                      s_flag = 1;
 281   2                      f_num = -f_num;
 282   2              }
 283   1              
 284   1              num = (int32)(f_num*10000+0.5);
 285   1              for (decimal=4; decimal>0; decimal--)
 286   1              {
 287   2                      if (num % 10 != 0)
 288   2                              break;
 289   2                      num /= 10;
 290   2              }
 291   1              
 292   1              dot_sit = decimal;
 293   1              if (f_num >= 10000)
 294   1                      dot_sit = 0;
 295   1              else if (f_num >= 1000)
 296   1                      if (decimal >= 1)
 297   1                              dot_sit = 1;
 298   1              else if (f_num >= 100)
 299   1                      if (decimal >= 2)
 300   1                              dot_sit = 2;
 301   1              else if (f_num >= 10)
 302   1                      if (decimal >= 3)
 303   1                              dot_sit = 3;
C51 COMPILER V7.08   MAIN                                                                  12/21/2010 08:24:33 PAGE 6   

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

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

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

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


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 + =
减小字号Ctrl + -
显示快捷键?