/* 现在问题是小数运算结果为乱码,为什么 */
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#include <math.h>
//pow函数
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
int num , firstflot , secondflot = 0 , thirdflot=0 , fourflot=0 , k=0, fiveflot=0 , sixflot=0 , sevenflot=0 , eightflot=0 ;
uint x= 0 ,m=0 , z = 0 , n = 0 ;
int a=0 , b=0 ,c=0 , d=0, e=0 , f = 0 , g = 0 , h = 0 ,i = 0 , p = 0 ;
int num1 ; //num1起暂时存储作用
/******************************************************************************
firstflot是数字标志位,secondflot是功能键按下标志位,thirdflot是第二次输入标志位,
fourflot是等号标志位,fiveflot是归零标志位,sixflot是删除键标志位,sevenflot
是负数标志位,eightflot是小数点标志位。 k是四功能键选择
第一个数 : a是整数个数,b是小数个数,c是整数,d是小数 。
第二个数 : e是整数个数,f是小数个数,g是整数,h是小数 。
i用于计算小数和 ,p用于计算整数和 。
*****************************************************************************/
void delay( uint m ) //延时函数
{
uint x , y ;
for( x = m ; x > 0 ; x--)
for( y = 110 ; y > 0 ; y--);
}
void keyscan() //扫描键盘
{
int temp ;
P2=0x7f;
temp=P2;
temp=temp&0x0f; //判断第一行按键
if(temp != 0x0f )
{
delay( 10 ) ;
temp = P2 ; //重读P2口值
temp = temp & 0x0f ;
if( temp != 0x0f )
{
temp = P2 ;
switch(temp)
{
case 0x77: num=1; //1
firstflot=1 ;
break;
case 0x7b: num=2; //2
firstflot=1 ;
break;
case 0x7d: num=3; //3
firstflot=1 ;
break;
case 0x7e : k++;
if(k==1)
{
num1='+';
}
if(k==2)
{
num1=0 ;
num1='-' ;
}
if(k==3)
{
num1=0;
num1='*';
}
if(k==4)
{
num1=0;
num1='/';
}
secondflot=1;
eightflot=0;
break ;
}
while(temp != 0x0f) //等待按键释放
{
temp = P2;
temp = temp & 0x0f;
}
}
}
P2 = 0xbf ; //扫描第二行键盘
temp = P2 ;
temp = temp & 0x0f;
if( temp != 0x0f )
{
delay( 10 ) ; //消抖
temp = P2 ;
temp = temp & 0x0f ;
if( temp != 0x0f )
{
temp = P2 ;
switch( temp )
{
case 0xb7: num=4; //4
firstflot=1 ;
break;
case 0xbb: num=5; //5
firstflot=1 ;
break;
case 0xbd: num=6; //6
firstflot=1 ;
break;
case 0xbe : sixflot=1 ; //删除
break ;
}
while( temp != 0x0f )
{
temp = P2 ;
temp = temp & 0x0f ;
}
}
}
P2 = 0xdf ; //扫描第三行键盘
temp = P2 ;
temp = temp & 0x0f ;
if( temp != 0x0f )
{
delay( 10 ) ; //消抖
temp = P2 ;
temp = temp & 0x0f ;
if( temp != 0x0f )
{
temp = P2 ;
switch( temp )
{
case 0xd7: num=7; //7
firstflot=1 ;
break;
case 0xdb: num=8; //8
firstflot=1 ;
break;
case 0xdd: num=9; //9
firstflot=1 ;
break;
case 0xde: eightflot=1; /*.*/
break ;
}
while( temp != 0x0f )
{
temp = P2;
temp = temp & 0x0f ;
}
}
}
P2 = 0xef ; //扫描第四行键盘
temp = P2 ;
temp = temp & 0x0f ;
if( temp != 0x0f )
{
delay( 10 ) ; //消抖
temp = P2 ;
temp = temp & 0x0f;
if( temp != 0x0f )
{
temp = P2 ;
switch( temp )
{
case 0xe7: num = '$' ; //归0
fiveflot=1;
break;
case 0xeb: num = 0 ; //0
firstflot=1 ;
break;
case 0xed: num = '=' ; //=
fourflot=1;
secondflot=1; //重置标志位,显示最终小数
thirdflot=0;
break;
}
while( temp != 0x0f )
{
temp = P2;
temp = temp & 0x0f ;
}
if(fiveflot==1){
x=0;
k=0;
m=n=0;
a=b=c=d=e=f=g=h=i=p=0;
secondflot=thirdflot=fourflot=fiveflot=sevenflot=eightflot=0 ;
num1=0;}
}
}
}
void jisuan()
{
if(secondflot==0) //第一位数
{
if(firstflot==1&&eightflot==0) //无小数点
{
m=m*10+num;
num = 0;
firstflot =0 ;
}
if(firstflot==1&&eightflot==1) //小数点按下
{
m=m*10+num;
num = 0;
firstflot=0;
b++;
}
if(sixflot==1)
{
m=m/10;
sixflot=0;
if(eightflot==1&&b>0) //如果有小数删除,则删除一位
b--;
if(b==0)
eightflot=0;
}
x=m;
}
if(secondflot==1&&sixflot==1&&thirdflot==0)
{
k=0;
secondflot=sixflot=0;
}
if(secondflot==1) //第二个数
{
if(firstflot==1&&eightflot==0)
{
n = n*10 + num ;
num = 0 ;
firstflot = 0 ;
thirdflot=1;
}
if(eightflot==1&&firstflot==1)
{
f++; //小数位数
n = n*10 + num ;
num = 0 ;
firstflot = 0 ;
}
if(sixflot==1) //shanchu
{
n=n/10 ;
sixflot=0;
if(eightflot==1&&f>0)
f--;
if(f==0)
eightflot=0;
}
x=n;
}
if(fourflot==1) //等号按下
{
switch(num1)
{
case '+' :
if(b<f) //第一位小数位数小于第二位小数 m=m*(pow(10,f)+0.1);
else
n=n*(pow(10,b)+0.1);
z=m+n;
break ;
}
x=z;
}
}
void display()
{
if(x<10)
{
if(sevenflot==1)
{
P0=0xbf;
P1=0x40;
delay(1);
P1=0x00;
delay(1) ;
}
P0=0x7f ;
P1=table[x];
delay(1);
P1=0x00;
delay(1) ;
}
if(x>10&&x<100)
{
if(sevenflot==1)
{
P0=0xdf;
P1=0x40;
delay(1);
P1=0x00;
delay(1) ;
}
P0=0x7f;
P1=table[x%10];
delay(1);
P1=0x00;
delay(1) ;
P0=0xbf;
P1=table[x/10];
delay(1);
P1=0x00;
delay(1) ;
}
if(x>100&&x<1000)
{
if(sevenflot==1)
{
P0=0xef;
P1=0x40;
delay(1);
P1=0x00;
delay(1) ;
}
P0=0xdf ;
P1=table[x/100];
delay(1);
P1=0x00;
delay(1) ;
P0=0xbf;
P1=table[x%100/10];
delay(1);
P1=0x00;
delay(1) ;
P0=0x7f ;
P1=table[x%100%10];
delay(1);
P1=0x00;
delay(1) ;
}
if(x>=1000&&x<10000)
{
if(sevenflot==1)
{
P0=0xf7;
P1=0x40;
delay(1);
P1=0x00;
delay(1) ;
}
P0=0xef ;
P1=table[x/1000];
delay(1);
P1=0x00;
delay(1) ;
P0=0xdf ;
P1=table[x%1000/100];
delay(1);
P1=0x00;
delay(1) ;
P0=0xbf;
P1=table[x%1000%100/10];
delay(1);
P1=0x00;
delay(1) ;
P0=0x7f ;
P1=table[x%1000%100%10];
delay(1);
P1=0x00;
delay(1) ;
}
if(x>=10000&&x<100000)
{
if(sevenflot==1)
{
P0=0xfb;
P1=0x40;
delay(1);
P1=0x00;
delay(1) ;
}
P0=0xf7 ;
P1=table[x/10000];
delay(1);
P1=0x00;
delay(1) ;
P0=0xef ;
P1=table[x%10000/1000];
delay(1);
P1=0x00;
delay(1) ;
P0=0xdf ;
P1=table[x%10000%1000/100];
delay(1);
P1=0x00;
delay(1) ;
P0=0xbf;
P1=table[x%10000%1000%100/10];
delay(1);
P1=0x00;
delay(1) ;
P0=0x7f ;
P1=table[x%10000%1000%100%10];
delay(1);
P1=0x00;
delay(1) ;
}
if(b>0&&secondflot==0) //显示第一位小数
{
switch(b)
{
case 1 : P0=0xbf ;
break;
case 2 : P0=0xdf;
break ;
case 3 : P0=0xef;
break ;
case 4 : P0=0xf7 ;
break ;
}
P1=0x80 ;
delay(1);
P1=0x00;
delay(1);
}
if(f>0&&thirdflot==1)
{
switch(f)
{
case 1 : P0=0xbf ;
break;
case 2 : P0=0xdf;
break ;
case 3 : P0=0xef;
break ;
case 4 : P0=0xf7 ;
break ;
}
P1=0x80;
delay(1);
P1=0x00;
delay(1);
}
if((b>0||f>0)&&sevenflot==1)
{
if(b>f)
{
switch(b)
{
case 1 : P0=0xbf ;
break;
case 2 : P0=0xdf;
break ;
case 3 : P0=0xef;
break ;
case 4 : P0=0xf7 ;
break ;
}
P1=0x80 ;
delay(1);
P1=0x00;
delay(1);
}
else
{
switch(f)
{
case 1 : P0=0xbf ;
break;
case 2 : P0=0xdf;
break ;
case 3 : P0=0xef;
break ;
case 4 : P0=0xf7 ;
break ;
}
P1=0x80;
delay(1);
P1=0x00;
delay(1);
}
}
}
void main()
{
while(1)
{
keyscan() ;
jisuan() ;
display() ;
}
}
|