這是一個計算器的功能,串口輸入,數(shù)碼管顯示結果并在串口處顯示,為什么串口和數(shù)碼管都沒有反應??求大神解答
#include<reg52.h>
#include<stdio.h>
#include<ctype.h>//字符類別測試函數(shù)庫
#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];//標志字符是運算符號還是數(shù)字
float t[MAXNUM];//存放轉換結果
uchar j=0;//標志t數(shù)組中元素的位置
uchar k=0;//標志t數(shù)組中元素的個數(shù)
uchar a=0,p=0,q=0;//機動變量
uchar flag1,flag,flag3;//表明是否存在運算符
uchar bracket1[2];//表明前括號的位置
uchar bracket2[2];//表明后括號的位置
uchar count=0;//表示單個括號的個數(shù)
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);
//函數(shù)聲明
void zzz(char s[]);//字符串轉化為整型
void priority();//判斷優(yōu)先級
void merge();//合并運算
void merge2();//針對括號的合并運算
void brack();//括號的單獨運算
void calculate(uint suan);//計算
void judge(); //判斷執(zhí)行的運算類型
float power(float a,float b); //求階次方函數(shù)
void zzz(char s[]) //字符串轉化為整型
{
char n;
while(s[i])
{
if(isdigit(s[i]))
{
for(n=0;isdigit(s[i]);i++)//若數(shù)字為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()//判斷優(yōu)先級
{
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() //判斷執(zhí)行的運算類型
{
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];//表示結果的字符數(shù)組
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--);
}
|