老师布置的第二次作业源程序-关于浮点型数据在数码管上的计算

            老师布置的第二次作业源程序-关于浮点型数据在数码管上的计算。最近写好了一个源代码,帖出来希望大家给点建议,哪里需要改进的。单片机控制的。功能:按键#0-进入设置状态,按键#1移位(小数点跟着移动),按键#2-设置数字大小,按键#3-按一次计算高四位与低四位的和,再按一次计算高四位和低四位的差。(小数点为3位,整数为5位)如#####.###

 

#include
#include
#include
#define hi 0x3c
#define lo 0xb0
#define uchar unsigned char
#define uint unsigned int
sbit P20=P2^0;sbit P21=P2^1;sbit P22=P2^2;
sbit P24=P2^4;sbit P25=P2^5;sbit P26=P2^6;sbit P27=P2^7;
unsigned char code ledk[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
sbit P37=P3^7;sbit P10=P1^0;
sbit clk=P0^7;sbit sda=P0^6;         
unsigned char key,mask=0xee,key_flag,key_count,set_flag=0,hl_set_flag=0,t0_count,l_flag=0,h_flag=1;
char l_set_no=0,h_set_no=4;
char disp[8]={0,0,0,0,0,0,0,0};
char disp_result[8]={0,0,0,0,0,0,0,0};

//=============================
 /*按键四加减*/
void piggy(l_flag)         
{ uchar i,j,k,t,h,g,f;//i-用于一般循环,j-判断是否为作减法,k-判断减法结果是否为负数,t-用来存储最大小数位,h -判断个位是否为0,g-似乎没用,f来标志个位为0时,disp_result[5]==16;
 float hfour,lfour,sum=0;
 long int num,l_num;
 f=0;
 j=0;k=0;
 lfour=disp[0]+disp[1]*10+disp[2]*100+disp[3]*1000;
 lfour=lfour*pow(10,-l_set_no);//转为浮点型
 hfour=disp[4]+disp[5]*10+disp[6]*100+disp[7]*1000;
 hfour=hfour*pow(10,-(h_set_no-4));//转为浮点型
 switch(l_flag)
{   case 1:sum=hfour+lfour;g=1;break;
    case 2:sum=hfour-lfour;j=1;g=1;if((hfour-lfour)<0){k=1;sum=fabs(sum);}break; //abs取浮点型绝对值把小数点后的去掉 ,fabs为浮点型取绝对值
   default:break;
}
 /*假设上步得到580.14*/
 //if(disp_result[4]==17){disp_result[4]=16;}
 if(l_set_no>=(h_set_no-4))
 t=l_set_no;
 else t=h_set_no-4;
 l_num=(int)((sum-(int)sum)*pow(10,t));///低3位的整型,若是580.14,结果为14
 num=(long int)sum; //强制转换为整型,高五位的整型,580
   disp_result[7]=num/10000;
   disp_result[6]=num/1000%10;
   disp_result[5]=num/100%10;
   disp_result[4]=num/10%10;
   disp_result[3]=num%10;
   if(disp_result[3]==0)
   {h=1;}    //判断个位为0
   /*以上的为高五位的各位*/
   if(t==1)
   {disp_result[2]=l_num%10;
    disp_result[1]=0;
 disp_result[0]=0;
   }
   else if(t==2)
   {disp_result[2]=l_num/10;
    disp_result[1]=l_num%10;
 disp_result[0]=0;
   }
   else if(t==3)
   {
    disp_result[2]=l_num/100;
 disp_result[1]=l_num/10%10;
 disp_result[0]=l_num%10;
   } 
   //disp_result[2]=disp_result[2]|0x80;
  /* for(i=0;i   {
     disp_result[i]=0;
   }*/
   /*去除无效0*/
   if(g==1){
   for(i=7;i>2;i--)
   { if(disp_result[i]!=0)break;
     else disp_result[i]=16;
   }
   g=0;
   }
   //if(g==1)disp_result[3]=0;
     /* if(g==1)
 {
   for(i=7;i>0;i--)
   { if(disp_result[i]!=16&&disp_result[i+1]==16)
     {disp_result[i+1]=0;break; }
   }
   }*/
   /*添加负号*/
  // if(j==1)
   if(j==1&k==1)
 {
 //if(h==1){disp_result[3]=0;disp_result[4]=17;h=0;}
   for(i=7;i>0;i--)
    
   { 
     if(h==1)
  {disp_result[3]=0;disp_result[4]=17;h=0;f=1;}
  else{
     if(disp_result[i]!=16&&disp_result[i+1]==16)
     {disp_result[i+1]=17;break; }
  j=0; }}
   if(f==1)disp_result[5]=16;
  
   //}
   }
  
 if(h==1){disp_result[3]=0;}
}
 
void delay (unsigned int n)
{unsigned int i,j;
 for(i=0;i   for(j=0;jvoid shift(dd)
  {unsigned char j=0;
 while(j<8){if((dd&0x80)!=0)sda=1;else sda=0;
       clk=0; clk=1; dd<<=1;j++;} }
//---------disp-----------
void display( )
{uchar i;
 
 for(i=0;i<=7;i++)
 {if(h_flag==1){if(i>3){if((set_flag==1 && hl_set_flag%2==1) && t0_count<7 && i==h_set_no)shift(ledk[16]);
            else
   {if(i==h_set_no)shift(ledk[disp[i]]|0x80);
   else shift(ledk[disp[i]]);
   
   }}
    else {if((set_flag==1 && hl_set_flag%2==0) && t0_count<7 && i==l_set_no)shift(ledk[16]);
         else
   {if(i==l_set_no)shift(ledk[disp[i]]|0x80);
   else
   shift(ledk[disp[i]]);
   }
   }
   }
 else {if(i==3)
     shift(ledk[disp_result[i]]|0x80);
      else shift(ledk[disp_result[i]]);
}//新加有语句
 P20=i&0x04;P21=i&0x02;P22=i&0x01;
   delay(15); }
}
 
//-------key
unsigned char get_char(void)
{unsigned char key_code;
  static unsigned char column=0;
  if (P37==0 && key_flag==1){key_code=column;key_flag=0;key_count=0;}
     else key_code=0xff;
  mask=_crol_(mask,1);
  P24=mask&0x10;P25=mask&0x20;P26=mask&0x40;P27=mask&0x80;
  column++;
  if(column>3)column=0;
  return(key_code);}
void key_func(key)
 {switch (key)
   {case 0:  set_flag=1;h_flag=1;hl_set_flag++;break; //可以利用l_set_no,h_set_no控制小数点
    case 1:  if(hl_set_flag%2==0){l_set_no++;if(l_set_no>3)l_set_no=0;}
              else {h_set_no++;if(h_set_no>7)h_set_no=4;}
             break;
    case 2:  if(hl_set_flag%2==0){disp[l_set_no]++;if(disp[l_set_no]>9)disp[l_set_no]=0;}
              else {disp[h_set_no]++;if (disp[h_set_no]>9)disp[h_set_no]=0;}
             break;
 case 3:  set_flag=0;h_flag=0;l_flag++;if(l_flag>2)l_flag=1;piggy(l_flag);break;//新加有语句
    default: break;               }  }
void t0() interrupt 1
 {TH0=hi;TL0=lo;key_count++;t0_count++;
   if(t0_count==20)t0_count=0;
   if(key_count>10)key_count=10;}
//---------
void main(void)
 {TMOD=0x11;TH0=hi;TL0=lo;EA=1;ET0=1;TR0=1;
   P10=0;
   while(1)
     {key=get_char( );key_func(key);
     display();
     if(key_flag==0 && key_count>=10)key_flag=1;
  }    
 }

编程方面,哪些代码有冗余的,啰嗦的,请大家批评指出,谢谢了。

投 票

觉得本文不错,投一票   

评 论


验证码: 看不清?换一张