电容测量仪程序设计
单片机程序
#include
#include
extern float sqrt(float x);
extern float exp(float x);
extern float tan(float x);
extern float cos(float x);
extern float sin(float x);
extern float log10(float x);
void reset();
void dis_error();
void calucate();
void delay();
void dis_num(float);
void scan_key();
char code aa[24]={10,7,8,9,14,15,20,4,5,6,13,17,21,1,2,3,10,18,22,0,11,16,12,19};
double xdata result,result1,result2;
char key_value,point_flag,calucate_flag,gg,yy,point_dig;
main()
{while(1)
{scan_key();
calucate(); }
}
///////////////////////////////
void reset()
{point_flag=0;
point_dig=0;
result2=0;
result1=0;}
//////////////////////////
void dis_error()
{P0=0x79;
P1=0x7f;
delay();}
//////////////////////////////
void calucate()
{
char ss;
P1=0xff;
P2=0xff;
if(key_value
{
if(point_flag==0)
{
result1=result1*10+key_value;
result=result1;
}
/////////////////////////////////////////////
else if(point_flag==1&&point_dig
{
point_dig++;
result1=result1*10+key_value;
result=result1;
for(ss=0;ss
{
result=result/10;
}
}
}
////////////////////////////////////////////////
else if(key_value==11&&point_flag==0)
{
point_flag=1; //小数点按下的标志
}
/////////////////////////////////////////////////
Else
if(key_value==12||key_value==13||key_value==14||key_value==15)
//+,-,*,/
{
result2=result;
result1=0;
result=result;
point_flag=0;
point_dig=0;
calucate_flag=key_value;
}
else if(key_value==16)
{
switch(calucate_flag)
{
case 12:result=result+result2;break; // +
case 13:result=result2-result;break; // -
case 14:result=result*result2;break; // *
case 15:
if(result==0)dis_error();
else
result=result2/result;
break;
default :;
}
calucate_flag=0;
result2=0;
result1=0;
point_flag=0;
point_dig=0;
}
else if(key_value==17)
{
if(result>=0)
{
result=sqrt(result);
}
else dis_error();
}
else if(key_value==10)
{
reset();
result=0;
}
else if(key_value==18)
{
result=exp(result);
reset();
}
else if(key_value==19)
{
result=tan(result);
reset();
}
else if(key_value==20)
{
result=cos(result);
reset();
}
else if(key_value==21)
{
result=sin(result);
reset();
}
else if(key_value==22)
{
result=log10(result);
reset();
}
key_value=99;
if(result=-1000000)
dis_num(result); //显示结果
else
{
dis_error();
}
}
void delay() //延时
{
int aa;
for(aa=0;aa
}
///////////////////////////////
void dis_num(double number) //显示
{
char Number[15],ii,jj,kk=0,hh=0;
long xdata number1,number2;
double xdata number3,number4;
if(number
{
number4=(-number);
} //正数
else
{number4=number; } //取整数部分
number1=(long)number4;
Number[14]=number1/10000000;
Number[13]=(number1%10000000)/1000000;
Number[12]=(number1%1000000)/100000;
Number[11]=(number1%100000)/10000;
Number[10]=(number1%10000)/1000;
Number[9]=(number1%1000)/100;
Number[8]=(number1%100)/10;
Number[7]=number1%10;
number3=(number4-number1)*10000000; //小数部分变整数
number2=(long)number3; //取整数部分
Number[6]=number2/1000000;
Number[5]=(number2%1000000)/100000;
Number[4]=(number2%100000)/10000;
Number[3]=(number2%10000)/1000;
Number[2]=(number2%1000)/100;
Number[1]=(number2%100)/10;
Number[0]=number2%10;
for(ii=0;ii
{
if(Number[ii])
break;
kk++;
}
for(jj=14;jj>=8;jj--)
{
if(Number[jj])
{
break;
}
hh++;
}
kk=(15-kk)-hh;
while(kk>8)
{
kk--;
ii++;
}
for(jj=0;jj
{
P0=0;
P1=~(0x01
switch(Number[ii++])
{
case 0:P0=0x3f;break;
case 1:P0=0x06;break;
case 2:P0=0x5b;break;
case 3:P0=0x4f;break;
case 4:P0=0x66;break;
case 5:P0=0x6d;break;
case 6:P0=0x7d;break;
case 7:P0=0x07;break;
case 8:P0=0x7f;break;
case 9:P0=0x6f;break;
default:P0=0;break;
}
if(ii==8)
P0=P0|0x80;
delay();
}
if(number
{
P0=0;
P1=~(0x01
P0=0x40;
delay();
}
P0=0x00;
}
void scan_key()
{
char code_l,pp;
char flag=0,code_h;
P0=0; // 关闭显示
P3=0xff;
P2=0x00;
if((P3&0xcf)!=0xcf) //有键按下
{
delay(); //延时消抖
if((P3&0xcf)!=0xcf)
{
gg=0;
code_h=0x01;
P3=0xff;
P2=0xfe;
while((P2&0x10)!=0x00) //是否过了第四行
{
for(pp=0;pp
{
if(pp==4||pp==5)
code_l=0x01
else
code_l=0x01
P3=0xff;
if((P3&code_l)==0)
{
flag=1;
key_value=aa[gg];
break;
}
gg++;
}
P2=0xff;
code_h=code_h
P2=~code_h;
if(flag==1)
{
flag=0;
break;
}
}
}
}
P2=0x00;
P3=0xff;
while((P3&0xff)!=0xff);
delay();
P0=0;
}