for(keynum2--,i++,j=0;keynum2>0;j++,i++,keynum2--) point=point*10+num2[i]; for(;j>0;j--) point*=0.1;
lcdwrite_data(num); ans2=ans2+point; conflag=1;
break; //进行连续计算 } }
if(ac==1) {
ac=0;
continue; //清零后进行下一次运算 }
if(sign=='+') //计算结果 ans=ans1+ans2; if(sign=='-')
ans=ans1-ans2; if(sign=='*')
ans=ans1*ans2; if(sign=='/')
ans=ans1/ans2;
if(sign=='^') //计算多次方 ans=pow(ans1,ans2); if(sqrtflag2==1) //计算开方 ans=sqrt(ans);
lcd_setxy(1,0);
if((ans2==0&&sign=='/')||(ans<0&&(sqrtflag1==1||sqrtflag2==1))) lcdwrite_string(\或被开方数小于0时提示错误
else lcdwrite_float(ans); //显示结果
sqrtflag1=0,newcalc=1; //为新的一次运算准备 ans1=0; ans2=0;
for(i=0;i<8;i++) //清除按键缓存 num1[i]=0;
21
for(i=0;i<8;i++) num2[i]=0;
if(conflag==1) {
conflag=0; goto here; //跳转到连续运算 } } }
/*****初始化程序*****/ void init(void) {
delayms(100); //等待液晶初始化 lcd_init();
lcd_setxy(0,0); lcdwrite_data('0'); lcd_setxy(0,0); IT0=1;//下降沿触发 EX0=1;//开外部中断0 IT1=1;//下降沿触发 EX1=1;//开外部中断1 EA=1; //开中断 }
/***清零中断程序******/ void EX0_int() interrupt 0 {
lcdwrite_com(0x01); //显示清屏 lcd_setxy(0,0); lcdwrite_data('0'); lcd_setxy(0,0); num='N'; //数字初始化
keynum1=0,keynum2=0,sign=0; ans1=0,ans2=0,ans=0,point=0; conflag=0,newcalc=0; ac=1; }
/***中断程序******/
void EX1_int() interrupt 2 {
if(k==0)
22
{
k=1;
lcdwrite_com(0x08);//显示关 }
else { k=0;
lcdwrite_com(0x0c);//显示开 } }
/******显示7位小数*********/ void lcdwrite_float(float n) {
uchar i=0; uint j=0; long nxtemp; if(n==0) {
lcdwrite_data('0'); return; } if(n<0) {
lcdwrite_data('-'); n=0-n; }
nxtemp=n; //数据类型转换 n=n;//+0.000002;
lcdwrite_num(nxtemp); if((n-nxtemp)>0.000009) {
lcdwrite_data('.'); n=(n-nxtemp)*10000000; nxtemp=n;
lcdwrite_data(nxtemp/1000000+0x30);//显示第7位小数
if((nxtemp000000000000000/10!=0)||(nxtemp00000000000000/100!=0)||(nxtemp000000000000/1000!=0)||(nxtemp000000000/10000!=0)||(nxtemp00000/100000!=0))
lcdwrite_data(nxtemp00000/100000+0x30);//显示第6位小数
if((nxtemp000000000000000/10!=0)||(nxtemp00000%
23
10000000000/100!=0)||(nxtemp000000000000/1000!=0)||(nxtemp000000000/10000!=0))
lcdwrite_data(nxtemp000000000/10000+0x30);//显示第5位小数
if((nxtemp000000000000000/10!=0)||(nxtemp00000000000000/100!=0)||(nxtemp000000000000/1000!=0)) lcdwrite_data(nxtemp000000000000/1000+0x30);//显示第4位小数
if((nxtemp000000000000000/10!=0)||(nxtemp00000000000000/100!=0))
lcdwrite_data(nxtemp00000000000000/100+0x30);//显示第3位小数
if((nxtemp000000000000000/10!=0))
lcdwrite_data(nxtemp000000000000000/10+0x30);//显示第2位小数
// lcdwrite_data(nxtemp+0x30);//显示第1位小数 }
else
return; }
24