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

📄 sun.c

📁 这是自己用一个单片机做的计算器
💻 C
字号:


  #include <reg52.h>
  #include <stdio.h>
  #include <string.h>
  #include <intrins.h>
  #include <absacc.h>

  #include <main.h>

float f_data;
xdata  uchar indata[20];
xdata  uchar out_data[10];
code uchar p_float[7]={0x0f,0x17,0x1f,0x27,0x2f,0x37,0x3f};
code uchar sign[7]={0x0e,0x16,0x1e,0x26,0x2e,0x36,0x3e};
//////////////////////////////////////////////////////////

 ///***************************************************************//
 //7281
 //*****************************************************************//
void delay(unsigned int dd)
{
    unsigned int i;
    for(i=0;i<dd;i++);
	return;
}
 /***********************接受 符号*********************************************/
 /*****************************************************************************/
unsigned char receive(void)
{ unsigned char i,k=0;
  clk=0;
  clk=1;
  while(dat);
  clk=0;
  clk=1;
  for(i=0;i<8;i++)
     {  delay(4);
        k=k<<1;
        if(dat) k=k|0x01;	
        else k=k&0xfe;
        clk=0;
        clk=1;
      }
  return k;
}
/***********************************写入*******************************************/
/**********************************************************************************/
void wr_7281(unsigned char b)
{unsigned char i;
 do{
     clk=0;
     clk=1;
    }                        //B为控制字,C为数据
 while(dat);
 clk=0;
 clk=1;
 while(!dat);                //建立握手信?
 for(i=0;i<8;i++)
    { if(b<0x80)dat=0;
      else dat=1;
      clk=0;
      clk=1;
      b=b<<1;
      delay(2);
    }
  dat=1;
  delay(2);
  return ;
}
 /**********************************显示位**************************************/
 /******************************************************************************/
void setdisplay(uchar *p,uchar digit )
{ unsigned m,i;
  for(i=0;i<digit;i++)
      {
       m=i<<4;
       wr_7281(0x15);
       wr_7281(m|p[i]);
      }
  return;
}
//****************************************运算结果进行输出*************************
void LED_OUT()
{  uchar end_cunt,	p_cunt;	                    //分别为浮点数长度和小数点位置
   uchar i,j;
   if(f_data==0)                                //如果运算结果位0,则仅在最右一位LED显示一个0
      {
        out_data[0]=0;			   
        setdisplay(out_data,1 );
      }
   else if(f_data>0)                            //如果运算结果大于0
      {
        sprintf(indata,"%f",f_data);             //把一个浮点数复制给一个字符串变量
        if(f_data>99999999)
           {  wr_7281(0x18);                      //设置段显示
              wr_7281(0x00); //显示E 意思为错误或溢出
			  wr_7281(0x03); //显示E 意思为错误或溢出
			  wr_7281(0x04); //显示E 意思为错误或溢出
			  wr_7281(0x05); //显示E 意思为错误或溢出
			  wr_7281(0x06); //显示E 意思为错误或溢出
              return;
           }
        j=0;
        end_cunt=0;
        p_cunt=0;
        for(i=0;i<9;i++)
           { 
             if(indata[i]!=".")
               {  
                 if(indata[i]=="/0")
                    {
                      end_cunt=i;                // 保存浮点长度
                      break;
                    }
                 out_data[j]=indata[i];
                 j++;
                }
             if(indata[i]==".") 
                 p_cunt=i;                        //保存小数点位置
            }
         if(p_cunt==0 && end_cunt!=0)  //无小数点显示小于8位LED
           {
              setdisplay(out_data,end_cunt );
            }
         if( p_cunt!=0 && end_cunt!=0)  //有小数点显示小于8位LED
           {
              wr_7281(0x18);                           //设置成段显示
              wr_7281(p_float[end_cunt-p_cunt-2]);     //显示小数点
              setdisplay(out_data,end_cunt-1 );
            }
         if( p_cunt!=0 && end_cunt==0)  //有点超长
           {
             wr_7281(0x18);                      //设置成显示小数
             wr_7281(p_float[7-p_cunt]);         //显示小数点
              setdisplay(out_data,8 );
           }
        }
    else
        {
          sprintf(indata,"%f",f_data);
          if(f_data<-9999999)
             {wr_7281(0x18);                      //设置段显示
              wr_7281(0x00); //显示E 意思为错误或溢出
			  wr_7281(0x03); //显示E 意思为错误	或溢出
			  wr_7281(0x04); //显示E 意思为错误	或溢出
			  wr_7281(0x05); //显示E 意思为错误	或溢出
			  wr_7281(0x06); //显示E 意思为错误或溢出
               return;
             }
           j=0;
           end_cunt=0;
           p_cunt=0;
           for(i=0;i<8;i++)
               { 
                if(indata[i]!=".")
                   {  
                    if(indata[i]=="/0")
                       {
                        end_cunt=i;
                        break;
                       }
                    out_data[j]=indata[i];
                    j++;
                    }
                if(indata[i]==".") 
                   p_cunt=i;
                }
           if(p_cunt==0 && end_cunt!=0)  //无点不超长
             {
               wr_7281(0x18);                      //设置成段显示
               wr_7281(sign[end_cunt-1]);          //显示负号
               setdisplay(out_data,end_cunt);
              }
           if( p_cunt!=0 && end_cunt!=0)  //有点不超长
              {
               wr_7281(0x18);                       //设置成显示小数
               wr_7281(p_float[end_cunt-p_cunt-2]); //显示小数点
               wr_7281(sign[end_cunt-2]);           //显示负号
               setdisplay(out_data,end_cunt);
               }
           if( p_cunt!=0 && end_cunt==0)  //有点超长
              {
               wr_7281(0x18);                      //设置成段显示
               wr_7281(p_float[6-p_cunt]);         //显示小数点
               wr_7281(sign[6]);                   //最高位显示负号
               setdisplay(out_data,7);
              }
        }
    return;
}
 //*************************************************************************************
float add_all(uchar *p_i,uchar *p_f,uchar count)	//数组中十进制转化为浮点型数据
{
     float add_a; 
     uchar tr,i;
     for(i=0;i<(count+1)/2;i++)   //交换输入顺序
        {
             tr=p_i[i];
             p_i[i]=p_i[count-i];
             p_i[count-i]=tr;
        }
     add_a=p_i[7]*10000000+
           p_i[6]*1000000+
           p_i[5]*100000+
           p_i[4]*10000+
           p_i[3]*1000+
           p_i[2]*100+
           p_i[1]*10+
           p_i[0];
     add_a=add_a+
              p_f[0]*0.1+
              p_f[1]*0.01+
              p_f[2]*0.001+
              p_f[3]*0.0001+
              p_f[4]*0.00001+
              p_f[5]*0.000001+
              p_f[6]*0.0000001;
  return add_a;
}

⌨️ 快捷键说明

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