随便看看,发现我真菜,大体都可以了,一部分小问题懒得改......
没有备注
#include "reg51.h"
#include "intrins.h"
#include "1602.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define juzhen_key P1
#define juzhen_dig P0
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
sbit led=P2^4;
char dall[16]=" ";
char Disp[16]=" ";
char desip[16]=" ";
u8 keyvalue;
u8 wei=0;
u8 error=0;
float count[15];
char stytem[15];
bit flag=0;
bit pack=0;
bit flag1=0;
void delay(u16 i)
{
while(i--);
}
float text(u8 j,u8 k) // 1 8
{
u8 a,pointIndex=j,x=j,sec=0;
float tuer=0.0;
float p =0.0;
int y=0;
for(a=j;a<k;a++)
{
if(dall[a]=='.')
{
sec=1;
break;
}
}
if(sec==1)
{
while(x<k)
{
if(dall[x++]=='.')
break;
pointIndex++;
} // 1
if(dall[j]=='-')
{
for(a=j+1;a<k;a++)
{
if(a<pointIndex)
{
tuer=tuer*10+(dall[a]-48);
}
if(a>pointIndex)
{
y--;
p=pow(10,y);
tuer+=(dall[a]-48)*p;
}
tuer=tuer*(-1);
}
}
else if(dall[j]!='-')
{
for(a=j;a<k;a++)
{
if(a<pointIndex)
{
tuer=tuer*10+(dall[a]-48);
}
if(a>pointIndex)
{
y--;
p=pow(10,y);
tuer=tuer+(dall[a]-48)*p;
}
}
}
}
else if(sec==0)
{
if(dall[j]=='-')
{
for(a=j+1;a<k;a++)
{
tuer=tuer*10+(dall[a]-48);
}
}
else if (dall[j]!='-')
{
for(a=j;a<k;a++)
{
tuer=tuer*10+(dall[a]-48);
}
}
if(dall[j]=='-')
{
tuer=tuer*(-1);
}
}
return tuer;
}
void process(u8 i, u8 j) //??ò?×éà¨o?à?μ?êy?Y??DD′|àí 12 1
{
u8 k,e=0,hear_begin=j,p;
u8 hic=0;
for(k=j+1;k<=i;k++) // 7
{
if(dall[k]=='*'||dall[k]=='/'||dall[k]=='+'||dall[k]=='-'||dall[k]==')'||dall[k]=='=')
{
if(k<i)
{
count[e]=text(hear_begin,k); ///1 8 //
if(dall[k]!=')')
stytem[e]=dall[k];
hear_begin=k+1; //4
e++;
}
else if(k==i)
{
count[e]=text(hear_begin,k); // 4, 7
hear_begin=k;
}
}
}
if(e>0)
{
for(k=0;k<e;k++)
{
if(stytem[k]=='*')
{
count[k+1]=count[k+1]*count[k];
for(p=k;p>0;p--)
{
count[p]=count[p-1];
stytem[p]=stytem[p-1];
}
if(k<e-1)
{
hic++;
}
}
if(stytem[k]=='/')
{
count[k+1]=count[k]/count[k+1];
for(p=k;p>0;p--)
{
count[p]=count[p-1];
stytem[p]=stytem[p-1];
}
if(k<e-1)
{
hic++;
}
}
}
for(k=0;k<=e-hic;k++)
{
if(k<e-hic)
{
count[k]=count[hic+k];
stytem[k]=stytem[hic+k];
}
else if(k=e-hic)
{
count[k]=count[hic+k];
}
}
e=e-hic;
for(k=0;k<e;k++)
{
if(stytem[k]=='+')
{
count[k+1]=count[k+1]+count[k];
for(p=k;p>0;p--)
{
count[p]=count[p-1];
stytem[p]=stytem[p-1];
}
}
if(stytem[k]=='-')
{
count[k+1]=count[k]-count[k+1];
for(p=k;p>0;p--)
{
count[p]=count[p-1];
stytem[p]=stytem[p-1];
}
}
}
count[0]=count[e];
}
}
void priority()
{
u8 i , j ,longs , k ;
char ptr[12] ;
float pp;
if(flag==0)
{
for(i = 0 ; i < wei; i++)
{
if(dall[ i]==')')
{
for(j=i;j>=0;j--)
{
if(dall[j]=='(')
{
memset(ptr,0,sizeof(ptr));
process(i,j+1);
pp=count[0];
sprintf(ptr,"%.5f",pp);
longs=strlen(ptr);
if(longs<=(i-j+1))
{
for(k=0;k<longs;k++)
{
dall[k+j]=ptr[k];
}
for(k=0;k<wei-i;k++)
{
dall[j+longs+k]=dall[i+k+1];
}
wei=wei-(i-j-longs+1);
}
else
{
for(k=wei;k>i;k--)
{
dall[k+longs-i+j-1]=dall[k];
}
for(k=0;k<longs;k++)
{
dall[k+j]=ptr[k];
}
wei=wei+longs-i+j-1;
}
break;
}
}
}
}
process(wei, 0); //9
memset(ptr,0,sizeof(ptr));
pp=count[0];
sprintf(ptr,"%.5f",pp);
longs=strlen(ptr);
for(i=longs-1;i>longs-7;i--)
{
if(ptr[ i]=='0'||ptr[ i]=='.')
{
ptr[ i]=' ';
}
else if(ptr[ i]!='0'&&ptr[ i]!='.')
{
break;
}
}
for(k=0;k<longs;k++)
{
Disp[k]=ptr[k];
}
flag=1;
}
}
void bely() //??à¨o?????à¨o?á?±?μ?êy×?ó?×?·?μ??yè·é¨?è
{
u8 i;
for(i=0;i<wei;i++)
{
if((dall[ i]=='+'||dall[ i]=='-'||dall[ i]=='*'||dall[ i]=='/'||dall[ i]=='.')&&(dall[i+1]=='+'||dall[i+1]=='-'||dall[i+1]=='*'||dall[i+1]=='/'||dall[i+1]=='.'||dall[i+1]=='='))
{
error=9;
break;
}
if((dall[ i]=='+'||dall[ i]=='-'||dall[ i]=='*'||dall[ i]=='/')&&(dall[i+1]==')'))
{
error=9;
break;
}
if(dall[ i]=='('&&(dall[i+1]=='*'||dall[i+1]=='/'))
{
error=9;
break;
}
if((dall[ i]=='1'||dall[ i]=='2'||dall[ i]=='0'||dall[ i]=='3'||dall[ i]=='4'||dall[ i]=='5'||dall[ i]=='6'||dall[ i]=='7'||dall[ i]=='8'||dall[ i]=='9')&&(dall[i+1]=='('))
{
error=9;
break;
}
}
}
void handle() //×?·?′?±éàú,à¨o?′|àí
{
u8 i,j,k=0,you=10,pp=0;
if(flag1==0)
{
for(j=0;j<wei;j++)
{
if(dall[j]=='(')
{
you++;
}
if(dall[j]==')')
{
you--;
}
}if(you!=10)
{
error=9;
}
for(i=0;i<wei;i++) //±éàúà¨o? ?ò′í
{
if(error==9)
{
break;
}
if(dall[wei-2]=='('||dall[wei-1]=='(')
{
error=9;
break;
}
if((dall[ i]=='('&&dall[i+1]==')')||(dall[ i]==')'&&dall[i+1]=='('))
{
error=9;
break;
}
if(i==wei-1)
{
flag1=1;
}
if(dall[ i]=='(')
{
for(j=pp;j<wei;j++)
{
if(dall[j]==')')
{
if(j<i)
{
error=9;
break;
}
pp=j+1;
break;
}
}
}
}
bely();
if(error!=9)
{
priority();
}
}
}
void conversion()
{
switch(keyvalue)
{
case(1): dall[wei]='1'; desip[wei]='1'; break;
case(2): dall[wei]='2'; desip[wei]='2'; break;
case(3): dall[wei]='3'; desip[wei]='3'; break;
case(4): dall[wei]='+'; desip[wei]='+'; break;
case(5): dall[wei]='4'; desip[wei]='4'; break;
case(6): dall[wei]='5'; desip[wei]='5'; break;
case(7): dall[wei]='6'; desip[wei]='6'; break;
case(8): dall[wei]='-'; desip[wei]='-'; break;
case(9): dall[wei]='7'; desip[wei]='7'; break;
case(10): dall[wei]='8'; desip[wei]='8'; break;
case(11): dall[wei]='9'; desip[wei]='9'; break;
case(12): dall[wei]='*'; desip[wei]='*'; break;
case(13): dall[wei]='.'; desip[wei]='.'; break;
case(14): dall[wei]='0'; desip[wei]='0'; break;
case(15): dall[wei]='='; desip[wei]='='; break;
case(16): dall[wei]='/'; desip[wei]='/'; break;
}
if(dall[wei]!='=')
{
wei++;
}
keyvalue=0;
if(wei>16)
{
wei=16;
}
}
void keydown()
{
juzhen_key=0x0f;
if(juzhen_key!=0x0f)
{
delay(100);
if(juzhen_key!=0x0f)
{
juzhen_key=0x0f;
switch(juzhen_key)
{
case(0x07): keyvalue=1;break;
case(0x0b): keyvalue=2;break;
case(0x0d): keyvalue=3;break;
case(0x0e): keyvalue=4;break;
}
juzhen_key=0xf0;
switch(juzhen_key)
{
case(0x70): keyvalue=keyvalue + 0;break;
case(0xb0): keyvalue=keyvalue + 4;break;
case(0xd0): keyvalue=keyvalue + 8;break;
case(0xe0): keyvalue=keyvalue + 12;break;
}
while((juzhen_key!=0xf0)&&(juzhen_key!=0x0f));
conversion();
}
}
}
void key()
{
u8 qin;
if(k1==0||k2==0||k3==0||k4==0)
{
delay(10000);
if(k1==0)
{
dall[wei]='(';
desip[wei]='(';
wei++;
while(k1==0);
}
else if(k2==0)
{
dall[wei]=')';
desip[wei]=')';
wei++;
while(k2==0);
}
else if(k3==0)
{
wei--;
dall[wei]=' ';
desip[wei]=' ';
while(k3==0);
}
else if(k4==0)
{
flag=0;
flag1=0;
error=0;
for(qin=0;qin<16;qin++)
{
dall[qin]=' ';
desip[qin]=' ';
Disp[qin]=' ';
}
wei=0;
while(k4==0);
}
}
}
void xianshi()
{
u8 i;
LcdWriteCom(0x00+0x80);
for(i=0;i<16;i++) //??ê?μúò?DD
{
LcdWriteData(desip[ i]);
}
if(error==9)
{
Disp[0]='E';
Disp[1]='r';
Disp[2]='r';
Disp[3]='o';
Disp[4]='r';
LcdWriteCom(0x40+0x80); //??ê?μú?tDD
for(i=0;i<16;i++)
{
LcdWriteData(Disp[ i]);
}
}
if(flag==1)
{
LcdWriteCom(0x40+0x80); //??ê?μú?tDD
for(i=0;i<16;i++)
{
LcdWriteData(Disp[ i]);
}
}
}
void main()
{
LcdInit();
while(1)
{
if(pack==1)
{
led=0;
}
if(dall[wei]=='=')
{
handle();
}
keydown();
key();
xianshi();
}
}
|