这是自己用一个单片机做的计算器

源代码在线查看: b.lst

软件大小: 4727 K
上传用户: yufei66900
关键词: 单片机 计算器
下载地址: 免注册下载 普通下载 VIP

相关代码

				C51 COMPILER V8.08   B                                                                     03/18/2009 02:33:59 PAGE 1   
				
				
				C51 COMPILER V8.08, COMPILATION OF MODULE B
				OBJECT MODULE PLACED IN b.OBJ
				COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE b.c BROWSE DEBUG OBJECTEXTEND
				
				line level    source
				
				   1          
				   2          
				   3            #include 
				   4            #include 
				   5            #include 
				   6            #include 
				   7            #include 
				   8          
				   9            #include 
				  10          
				  11          float f_data;
				  12          xdata  uchar indata[20];
				  13          xdata  uchar out_data[10];
				  14          code uchar p_float[7]={0x0f,0x17,0x1f,0x27,0x2f,0x37,0x3f};
				  15          code uchar sign[7]={0x0e,0x16,0x1e,0x26,0x2e,0x36,0x3e};
				  16          //////////////////////////////////////////////////////////
				  17          
				  18           ///***************************************************************//
				  19           //7281
				  20           //*****************************************************************//
				  21          void delay(unsigned int dd)
				  22          {
				  23   1          unsigned int i;
				  24   1          for(i=0;i				  25   1              return;
				  26   1      }
				  27           /***********************接受 符号*********************************************/
				  28           /*****************************************************************************/
				  29          unsigned char receive(void)
				  30          { unsigned char i,k=0;
				  31   1        clk=0;
				  32   1        clk=1;
				  33   1        while(dat);
				  34   1        clk=0;
				  35   1        clk=1;
				  36   1        for(i=0;i				  37   1           {  delay(4);
				  38   2              k=k				  39   2              if(dat) k=k|0x01;       
				  40   2              else k=k&0xfe;
				  41   2              clk=0;
				  42   2              clk=1;
				  43   2            }
				  44   1        return k;
				  45   1      }
				  46          /***********************************写入*******************************************/
				  47          /**********************************************************************************/
				  48          void wr_7281(unsigned char b)
				  49          {unsigned char i;
				  50   1       do{
				  51   2           clk=0;
				  52   2           clk=1;
				  53   2          }                        //B为控制字,C为数据
				  54   1       while(dat);
				  55   1       clk=0;
				C51 COMPILER V8.08   B                                                                     03/18/2009 02:33:59 PAGE 2   
				
				  56   1       clk=1;
				  57   1       while(!dat);                //建立握手信?
				  58   1       for(i=0;i				  59   1          { if(b				  60   2            else dat=1;
				  61   2            clk=0;
				  62   2            clk=1;
				  63   2            b=b				  64   2            delay(2);
				  65   2          }
				  66   1        dat=1;
				  67   1        delay(2);
				  68   1        return ;
				  69   1      }
				  70           /**********************************显示位**************************************/
				  71           /******************************************************************************/
				  72          void setdisplay(uchar *p,uchar digit )
				  73          { unsigned m,i;
				  74   1        for(i=0;i				  75   1            {
				  76   2             m=i				  77   2             wr_7281(0x15);
				  78   2             wr_7281(m|p[i]);
				  79   2            }
				  80   1        return;
				  81   1      }
				  82          //****************************************运算结果进行输出*************************
				  83          void LED_OUT()
				  84          {  uchar end_cunt,      p_cunt;                     //分别为浮点数长度和小数点位置
				  85   1         uchar i,j;
				  86   1         if(f_data==0)                                //如果运算结果位0,则仅在最右一位LED显示一个0
				  87   1            {
				  88   2              out_data[0]=0;                     
				  89   2              setdisplay(out_data,1 );
				  90   2            }
				  91   1         else if(f_data>0)                            //如果运算结果大于0
				  92   1            {
				  93   2              sprintf(indata,"%f",f_data);             //把一个浮点数复制给一个字符串变量
				  94   2              if(f_data>99999999)
				  95   2                 {  wr_7281(0x18);                      //设置段显示
				  96   3                    wr_7281(0x00); //显示E 意思为错误或溢出
				  97   3                                wr_7281(0x03); //显示E 意思为错误或溢出
				  98   3                                wr_7281(0x04); //显示E 意思为错误或溢出
				  99   3                                wr_7281(0x05); //显示E 意思为错误或溢出
				 100   3                                wr_7281(0x06); //显示E 意思为错误或溢出
				 101   3                    return;
				 102   3                 }
				 103   2              j=0;
				 104   2              end_cunt=0;
				 105   2              p_cunt=0;
				 106   2              for(i=0;i				 107   2                 { 
				 108   3                   if(indata[i]!=".")
				 109   3                     {  
				 110   4                       if(indata[i]=="/0")
				 111   4                          {
				 112   5                            end_cunt=i;                // 保存浮点长度
				 113   5                            break;
				 114   5                          }
				 115   4                       out_data[j]=indata[i];
				 116   4                       j++;
				 117   4                      }
				C51 COMPILER V8.08   B                                                                     03/18/2009 02:33:59 PAGE 3   
				
				 118   3                   if(indata[i]==".") 
				 119   3                       p_cunt=i;                        //保存小数点位置
				 120   3                  }
				 121   2               if(p_cunt==0 && end_cunt!=0)  //无小数点显示小于8位LED
				 122   2                 {
				 123   3                    setdisplay(out_data,end_cunt );
				 124   3                  }
				 125   2               if( p_cunt!=0 && end_cunt!=0)  //有小数点显示小于8位LED
				 126   2                 {
				 127   3                    wr_7281(0x18);                           //设置成段显示
				 128   3                    wr_7281(p_float[end_cunt-p_cunt-2]);     //显示小数点
				 129   3                    setdisplay(out_data,end_cunt-1 );
				 130   3                  }
				 131   2               if( p_cunt!=0 && end_cunt==0)  //有点超长
				 132   2                 {
				 133   3                   wr_7281(0x18);                      //设置成显示小数
				 134   3                   wr_7281(p_float[7-p_cunt]);         //显示小数点
				 135   3                    setdisplay(out_data,8 );
				 136   3                 }
				 137   2              }
				 138   1          else
				 139   1              {
				 140   2                sprintf(indata,"%f",f_data);
				 141   2                if(f_data				 142   2                   {wr_7281(0x18);                      //设置段显示
				 143   3                    wr_7281(0x00); //显示E 意思为错误或溢出
				 144   3                                wr_7281(0x03); //显示E 意思为错误     或溢出
				 145   3                                wr_7281(0x04); //显示E 意思为错误     或溢出
				 146   3                                wr_7281(0x05); //显示E 意思为错误     或溢出
				 147   3                                wr_7281(0x06); //显示E 意思为错误或溢出
				 148   3                     return;
				 149   3                   }
				 150   2                 j=0;
				 151   2                 end_cunt=0;
				 152   2                 p_cunt=0;
				 153   2                 for(i=0;i				 154   2                     { 
				 155   3                      if(indata[i]!=".")
				 156   3                         {  
				 157   4                          if(indata[i]=="/0")
				 158   4                             {
				 159   5                              end_cunt=i;
				 160   5                              break;
				 161   5                             }
				 162   4                          out_data[j]=indata[i];
				 163   4                          j++;
				 164   4                          }
				 165   3                      if(indata[i]==".") 
				 166   3                         p_cunt=i;
				 167   3                      }
				 168   2                 if(p_cunt==0 && end_cunt!=0)  //无点不超长
				 169   2                   {
				 170   3                     wr_7281(0x18);                      //设置成段显示
				 171   3                     wr_7281(sign[end_cunt-1]);          //显示负号
				 172   3                     setdisplay(out_data,end_cunt);
				 173   3                    }
				 174   2                 if( p_cunt!=0 && end_cunt!=0)  //有点不超长
				 175   2                    {
				 176   3                     wr_7281(0x18);                       //设置成显示小数
				 177   3                     wr_7281(p_float[end_cunt-p_cunt-2]); //显示小数点
				 178   3                     wr_7281(sign[end_cunt-2]);           //显示负号
				 179   3                     setdisplay(out_data,end_cunt);
				C51 COMPILER V8.08   B                                                                     03/18/2009 02:33:59 PAGE 4   
				
				 180   3                     }
				 181   2                 if( p_cunt!=0 && end_cunt==0)  //有点超长
				 182   2                    {
				 183   3                     wr_7281(0x18);                      //设置成段显示
				 184   3                     wr_7281(p_float[6-p_cunt]);         //显示小数点
				 185   3                     wr_7281(sign[6]);                   //最高位显示负号
				 186   3                     setdisplay(out_data,7);
				 187   3                    }
				 188   2              }
				 189   1          return;
				 190   1      }
				 191           //*************************************************************************************
				 192          float add_all(uchar *p_i,uchar *p_f,uchar count)        //数组中十进制转化为浮点型数据
				 193          {
				 194   1           float add_a; 
				 195   1           uchar tr,i;
				 196   1           for(i=0;i				 197   1              {
				 198   2                   tr=p_i[i];
				 199   2                   p_i[i]=p_i[count-i];
				 200   2                   p_i[count-i]=tr;
				 201   2              }
				 202   1           add_a=p_i[7]*10000000+
				 203   1                 p_i[6]*1000000+
				 204   1                 p_i[5]*100000+
				 205   1                 p_i[4]*10000+
				 206   1                 p_i[3]*1000+
				 207   1                 p_i[2]*100+
				 208   1                 p_i[1]*10+
				 209   1                 p_i[0];
				 210   1           add_a=add_a+
				 211   1                    p_f[0]*0.1+
				 212   1                    p_f[1]*0.01+
				 213   1                    p_f[2]*0.001+
				 214   1                    p_f[3]*0.0001+
				 215   1                    p_f[4]*0.00001+
				 216   1                    p_f[5]*0.000001+
				 217   1                    p_f[6]*0.0000001;
				 218   1        return add_a;
				 219   1      }
				 220          
				
				
				MODULE INFORMATION:   STATIC OVERLAYABLE
				   CODE SIZE        =   1654    ----
				   CONSTANT SIZE    =     22    ----
				   XDATA SIZE       =     30    ----
				   PDATA SIZE       =   ----    ----
				   DATA SIZE        =      4      25
				   IDATA SIZE       =   ----    ----
				   BIT SIZE         =   ----    ----
				END OF MODULE INFORMATION.
				
				
				C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)
							

相关资源