老师布置的第二次作业源程序-关于浮点型数据在数码管上的计算440573420
老师布置的第二次作业源程序-关于浮点型数据在数码管上的计算。最近写好了一个源代码,帖出来希望大家给点建议,哪里需要改进的。单片机控制的。功能:按键#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
{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;
}
}
编程方面,哪些代码有冗余的,啰嗦的,请大家批评指出,谢谢了。
数据正在载入中..



