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

📄 calculator.lst

📁 基于51单片机的1602显示的计算器
💻 LST
📖 第 1 页 / 共 2 页
字号:
 241   1              RW = 0;
C51 COMPILER V7.50   CALCULATOR                                                            09/29/2007 20:36:00 PAGE 5   

 242   1              E = 0;
 243   1              Read_Busy();
 244   1              E = 1;
 245   1      }
 246          
 247          /******************************************************************************/
 248          void Write_Data(unsigned char lcddata)//写数据函数
 249          {       
 250   1              Lcd_Data = lcddata;
 251   1              RS = 1;
 252   1              RW = 0;
 253   1              E = 0;
 254   1              Read_Busy();
 255   1              E = 1;
 256   1      }
 257          
 258          /******************************************************************************/
 259          void Init_LCD_Cal(void)//初始化LCD
 260          {
 261   1              Delay_1ms(400);   //稍微延时,等待LCM进入工作状态
 262   1              Write_Comm(0x01);//清显示
 263   1      
 264   1          Write_Comm(0x38);    // 8位 2行.
 265   1          Write_Comm(0x0c);   // 
 266   1          Write_Comm(0x07);   // 显示模式,从左至右增加
 267   1          Write_Comm(0x80+0x10);    // 定义首地址.
 268   1      }
 269          
 270          /******************************************************************************/
 271          void Init_LCD_Logo(void)//初始化LCD
 272          {
 273   1              Delay_1ms(400);   //稍微延时,等待LCM进入工作状态
 274   1              Write_Comm(0x01);//清显示
 275   1      
 276   1              Write_Comm(0x38);//8位2行5*8
 277   1              Write_Comm(0x06);//文字不动,光标右移
 278   1              Write_Comm(0x0c);//显示开/关,光标开闪烁开
 279   1      }
 280          
 281          /******************************************************************************/
 282          void Init_Timer0(void)//定时器0初始化
 283          {
 284   1              TMOD=0x01;
 285   1              TH0=TH0_TL0 / 256;
 286   1              TL0=TH0_TL0 % 256;
 287   1              TR0=1;
 288   1              ET0=1;
 289   1              EA=1;
 290   1      }
 291          
 292          /******************************************************************************/
 293          void Display(char *buf)//显示函数
 294          { 
 295   1              unsigned char i;
 296   1              
 297   1              Write_Comm(0x01);//clearscreen,清屏命令
 298   1              Write_Comm(0x80+0x10);
 299   1      
 300   1              for (i=0 ; buf[i] != 0; i++)
 301   1                      Write_Data(buf[i]);    
 302   1      }
 303          
C51 COMPILER V7.50   CALCULATOR                                                            09/29/2007 20:36:00 PAGE 6   

 304          /******************************************************************************/
 305          void Display_Logo(unsigned char code *DData)//显示LOGO
 306          {
 307   1              unsigned char  j;
 308   1        
 309   1              for(j=0;j<16;j++)
 310   1          {
 311   2              Write_Data(DData[j]); //显示单个字符
 312   2                      Delay(30);
 313   2              }
 314   1      }
 315          
 316          /*******************************************************************************/
 317          void Digit_input_calcul(void)//字符输入
 318          {
 319   1              static unsigned char pos;
 320   1              float tmp;
 321   1      
 322   1              unsigned int last_op = 0;
 323   1      
 324   1              Write_Data('0');        //上电显示" 0 "
 325   1              pos = 0;//位置为0
 326   1      
 327   1              while(1)
 328   1              {
 329   2                      Key_value = Test_key();//判断是数字还是运算符号,具有等待功能
 330   2      
 331   2                      if((Key_value == '.') || ((Key_value >= '0') && (Key_value <= '9')))//如果是数字或小数点
 332   2                      {
 333   3                              if (pos != Max_disp_buff )  //最大计算位
 334   3                      { 
 335   4                                      number[pos++] = Key_value;
 336   4                              number[pos] = 0;
 337   4                      Display(number);
 338   4                      }
 339   3                      }
 340   2                      else //如果输入的是运算符号(+,-,*,/,=)
 341   2                      {
 342   3      
 343   3                              tmp = atof(number);//atof函数就是把字符转换成双精度的值
 344   3      
 345   3                              if((Key_value == '+') || (Key_value == '-') || (Key_value == '*') || (Key_value == '/'))
 346   3                              {
 347   4                                      left_value = tmp;
 348   4                                      last_op = Key_value;
 349   4                              }
 350   3                              else if (Key_value == '=')
 351   3                              {
 352   4                                      right_value = tmp;
 353   4      
 354   4                                  Fun_calculator(last_op);//计算
 355   4                              }
 356   3                              
 357   3                              pos = 0;//从新归位,输入右值
 358   3              }//else
 359   2              }//for
 360   1      }
 361          
 362          /**********************************************************************************/
 363          void Fun_calculator(unsigned int fuhao)//运算函数
 364          {
 365   1              bit result = 1;
C51 COMPILER V7.50   CALCULATOR                                                            09/29/2007 20:36:00 PAGE 7   

 366   1      
 367   1              switch(fuhao)
 368   1              {
 369   2                      case '+': left_value += right_value;result = 1;break;
 370   2                      case '-': left_value -= right_value;result = 1;break;
 371   2                      case '*': left_value *= right_value;result = 1;break;
 372   2                      case '/': 
 373   2                              if(right_value != 0)
 374   2                              {
 375   3                                      left_value /= right_value;
 376   3                                      result = 1;
 377   3                              }
 378   2                              else
 379   2                                      result = 0;//出错
 380   2                              break;
 381   2                      default : break;
 382   2              }
 383   1      
 384   1              if(result == 1)
 385   1                      Calculator_output(left_value);
 386   1              else 
 387   1                      Display("*ERROR*");
 388   1      }
 389          
 390          /******************************************************************************/
 391          void Calculator_output(float value)//输出计算结果函数
 392          {
 393   1              unsigned char buff[Max_disp_buff + 1];//定义显示缓冲
 394   1              unsigned char p1=0, p=0;
 395   1              float divisor = 100000000;//除数
 396   1              float digit = 0;
 397   1      
 398   1              if(value >= 0)
 399   1                      buff[p++] = ' ';
 400   1              else
 401   1              {       
 402   2                      buff[p++] = '-';
 403   2                      value = -value;
 404   2              }
 405   1      
 406   1              if(value >= divisor )
 407   1                      buff[p++]='E';
 408   1              else
 409   1                      while((p < Max_disp_buff ) && (divisor > 1 || value >= 0.00000001))
 410   1                      {
 411   2                              divisor /= 10;
 412   2                              digit = floor(value/divisor);//小于指定数的最小整数
 413   2                              if (divisor < 1 && divisor > 0.01)
 414   2                  buff[p++] = '.';
 415   2                      if (digit != 0 || divisor < 10)
 416   2                      { 
 417   3                                      buff[p++] = digit + '0';
 418   3                      p1 = 1;        
 419   3                      }
 420   2                      else if (p1)
 421   2                      buff[p++] = '0';
 422   2                      value -= digit*divisor;
 423   2                      }
 424   1              buff[p] = 0;           
 425   1              Display(buff);
 426   1      }
 427          
C51 COMPILER V7.50   CALCULATOR                                                            09/29/2007 20:36:00 PAGE 8   

 428          /******************************************************************************/
 429          void Show_logo(void)//显示开机画面
 430          {
 431   1              Write_Comm(0x80);//写入"welcome to"首地址(第一行)
 432   1              Display_Logo(welcome);
 433   1      
 434   1              Write_Comm(0xc0);//写入"website"首地址(第2行)
 435   1              Display_Logo(website);
 436   1              Delay(200);
 437   1      
 438   1              Write_Comm(0x01);//清屏
 439   1      
 440   1              Write_Comm(0x80);//写入"designed "首地址(第一行)
 441   1              Display_Logo(designed);
 442   1      
 443   1      
 444   1              Write_Comm(0xc0);//写入"whoami"首地址(第2行)
 445   1              Display_Logo(whoami);
 446   1              Delay(200);
 447   1      
 448   1              Write_Data(0x01);//清屏
 449   1      }
 450          
 451          /******************************************************************************/
 452          void main(void)//主函数
 453          {
 454   1              Init_Timer0();//初始化T0
 455   1              Init_LCD_Logo(); //初始化 Logo
 456   1      
 457   1              Show_logo();//开机画面显示
 458   1              
 459   1              Init_LCD_Cal(); //初始化 LCM
 460   1              Digit_input_calcul();//计算值输入函数
 461   1      }
 462          
 463                  
 464          
 465          
 466                          
 467          
 468          
 469                  
 470          
 471           


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1380    ----
   CONSTANT SIZE    =     96    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     23      38
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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