这是一个计算器的功能,串口输入,数码管显示结果并在串口处显示,为什么串口和数码管都没有反应??求大神解答
#include<reg52.h>
#include<stdio.h>
#include<ctype.h>//字符类别测试函数库
#define uchar unsigned char
#define uint unsigned int
#define MAXNUM 6
sbit dula=P2^6;
sbit wela=P2^7;
//初始化
uchar Run[MAXNUM] ="7+8*9=";//设定的运算表达式
uchar mark[MAXNUM];//标志字符是运算符号还是数字
float t[MAXNUM];//存放转换结果
uchar j=0;//标志t数组中元素的位置
uchar k=0;//标志t数组中元素的个数
uchar a=0,p=0,q=0;//机动变量
uchar flag1,flag,flag3;//表明是否存在运算符
uchar bracket1[2];//表明前括号的位置
uchar bracket2[2];//表明后括号的位置
uchar count=0;//表示单个括号的个数
uchar i=0,qw=0;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar code temp[]={0xfe,0xfd,0xfb,0xf7};
void delay(uint z);
//函数声明
void zzz(char s[]);//字符串转化为整型
void priority();//判断优先级
void merge();//合并运算
void merge2();//针对括号的合并运算
void brack();//括号的单独运算
void calculate(uint suan);//计算
void judge(); //判断执行的运算类型
float power(float a,float b); //求阶次方函数
void zzz(char s[]) //字符串转化为整型
{
char n;
while(s[i])
{
if(isdigit(s[i]))
{
for(n=0;isdigit(s[i]);i++)//若数字为0~9
{n=n*10+(s[i]-'0');}
mark[j]='1';
t[j++]=n;
k++;
}
if(!isdigit(s[i]))
{
mark[j]='0';
if(s[i]=='.')
{
n=46;
t[j++]=n;
k++;
}
if(s[i]=='+')
{
n=43;
t[j++]=n;
k++;
}
if(s[i]=='-')
{
n=45;
t[j++]=n;
k++;
}
if(s[i]=='*')
{
n=42;
t[j++]=n;
k++;
}
if(s[i]=='/')
{
n=47;
t[j++]=n;
k++;
}
if(s[i]=='(')
{
n=40;
t[j++]=n;
k++;
bracket1[count++]=j-1;
}
if(s[i]==')')
{
n=41;
t[j++]=n;
k++;
bracket2[--count]=j-1;
}
if(s[i]=='=')
{
j--;
break;
}
}
i++;
}
}
void priority()//判断优先级
{
while(flag1==1)
{
flag1=0;
if(t[j]==40)//括号运算
{
a=j;
for(j=a+1;j<k;j++)
{
if(t[j]==40)
{
flag1=1;
break;
}
}
j=a;
if(flag1==0)
{
flag3=1;
calculate(0);
count--;
}
count++;
flag1=0;
}
if(t[j]==42)//乘法运算
{
a=j;
for(j=p;j<q;j++)
{
if(t[j]==40&&j==bracket1[0])
{
flag1=1;
break;
}
}
j=a;
if(flag1==0)
{calculate(1);}
flag1=0;
}
if(t[j]==47)//除法运算
{
a=j;
for(j=p;j<q;j++)
{
if(t[j]==40&&j==bracket1[count])
{
flag1=1;
break;
}
}
j=a;
if(flag1==0)
{calculate(2);}
flag1=0;
}
if(t[j]==43)//加法运算
{
a=j;
for(j=p;j<q;j++)
{
if(t[j]==42||t[j]==47||(t[j]==40&&j==bracket1[count]))
{
flag1=1;
break;
}
}
j=a;
if(flag1==0)
{calculate(3);}
flag1=0;
}
if(t[j]==45)//减法运算
{
a=j;
for(j=p;j<q;j++)
{
if(t[j]==42||t[j]==47||(t[j]==40&&j==bracket1[count]))
{
flag1=1;
break;
}
}
j=a;
if(flag1==0)
{calculate(4);}
flag1=0;
}
}
}
void merge()//合并运算
{
for( j=a;j<k;j++)
{t[j]=t[j+2];}
k-=2;
j=p;
}
void merge2()//针对括号的合并运算
{
for(j=bracket1[count];j<k;j++)
{
t[j]=t[j+1];
}
k--;
bracket2[count]--;
for(j=bracket2[count];j<k;j++)
{
t[j]=t[j+1];
}
k--;
count=0;
j=0;
}
void brack()//括号的单独运算
{
j=a;
for(j=bracket1[count]+1;j<bracket2[count];j++)
{
if((mark[j]=='0'&&j>bracket1[count]+1)&&t[j]!=3)
{
p=bracket1[count]+1;
q=bracket2[count];
flag1=1;
priority();
flag3=0;
}
}
}
void calculate(uint suan)//计算
{
switch(suan)
{
case 0:
brack();
merge2();
j=0;
break;
case 1:
j=a;
t[j-1]=t[j-1]*t[j+1];
merge();
if(flag3==1)
{
bracket2[count]-=2;
bracket2[count-1]-=2;
}
j=p;
break;
case 2:
j=a;
t[j-1]=t[j-1]/t[j+1];
merge();
if(flag3==1)
{
bracket2[count]-=2;
bracket2[count-1]-=2;
}
j=p;
break;
case 3:
j=a;
t[j-1]=t[j-1]+t[j+1];
merge();
if(flag3==1)
{
bracket2[count]-=2;
bracket2[count-1]-=2;
}
j=p;
break;
case 4:
j=a;
t[j-1]=t[j-1]-t[j+1];
merge();
if(flag3==1)
{
bracket2[count]-=2;
bracket2[count-1]-=2;
}
j=p;
break;
default:break;
}
}
void judge() //判断执行的运算类型
{
for(j=0;j<k;j++)
{
if(mark[j]=='0')
{
p=0;
q=k;
flag1=1;
priority();
}
}
}
void serial() interrupt 4 //串口接收
{
if(RI)
{
Run[qw]=SBUF;
if(Run[qw]=='=')
{
flag=1;
i=qw;
qw=0;
}
RI=0;
qw++;
}
}
void main()
{
float answer=0;//标注结果
uchar e,L,num=0;
uchar ans[5];//表示结果的字符数组
TMOD=0x20;
TH1=0xF3;
TL1=0xF3;
TR1=1;
SM0=0;
SM1=1;
REN=1;
SCON=0x50;
EA=1;
ES=1;
while(1)
{
if(flag==1)
{
ES=0;
zzz(Run);
judge();
answer=t[0];
L=sprintf(ans,"%.2f",answer); //字符串长度
for(e=0;e<L;e++)
{
SBUF=ans[e];
wela=1;
P0=temp[num++];
wela=0;
dula=1;
P0=ans[e];
dula=0;
delay(50);
while(!TI);
TI=0;
}
flag=0;
ES=1;
for(e=0;e<L;e++)
{ans[e]='\0';}
}
i=0;
}
}
void delay(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
|