編程提示:DDFBDNFDFDH.C(192): warning C291: not every exit path returns a value 高手幫我修改哈,程序如下:#include<reg51.H>
//#include<stdio.h>
#define LEDS 8
/***按鍵程序***/
char keyscan();
/***顯示程序***/
void display();
char dsp[9]={0,0,12,12,12,12,12,12,12}; //初始化顯示數(shù)組
/***計算程序***/
void calculate(char k,char c1[8],char c2[8]);
/***片選***/
unsigned char code Select[]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/***碼選***/
unsigned char code LED_CODES[]=
{0xC0,0xF9,0xA4,0xB0,0x99, //0-4
0x92,0x82,0xF8,0x80,0x90, //5-9
0x86,0xAF,0xFF,0x7F,0xBF,}; //E,r,空格,.,-
/***main函數(shù)***/
void main(void)
{
char i,j,k,c;
char a[8],b[8];
/***定時1ms***/
TMOD=0;
TL0=-(1000/256);
TH0=-(1000%256);
EA = 1; //總中斷開關
ET0 = 1; //開中斷
TR0 = 1; //啟用計數(shù)器0
KSC:do
{
for(i=1;i<9;i++) //數(shù)字錄入循環(huán)
{
dsp[0]=keyscan();
if(c==2&&dsp[0]<10) //此段代碼驗證是否有舊的計算結(jié)果在顯示,且不再參與新計算
{
dsp[1]=dsp[0];
for(j=2;j<9;j++)
dsp[j]=12;
c=0;
}
else if(c==2&&dsp[0]>9) //舊的計算結(jié)果將參與新的計算,作為第一個數(shù)
{
c=0;
}
if(dsp[0]==0&&dsp[1]==0&&dsp[2]==12) //個位為0且十位為空時按下0,按鍵無效,跳回KSC等待正確輸入
{
/***goto跳轉(zhuǎn)標志***/
goto KSC;
}
else if(dsp[0]>9) break; //有操作符按下,跳出數(shù)字錄入循環(huán)
else
{for(j=i;j>0;j--)
dsp[j]=dsp[j-1]; //移位,以正確顯示數(shù)字
}
}
if(i==9) //判斷是否輸入8個有效數(shù)字,是則等待操作符,否則直接判斷操作符
{
do //使用do while無論是否第一個數(shù)都取一次操作符
{
dsp[0]=keyscan(); //獲取操作符號
if(dsp[0]==14||dsp[0]<10) //按下C或者第9位數(shù)字清零
{
dsp[1]=0;
for(i=2;i<9;i++)
dsp=12;
c=0;
}
}while((dsp[0]==15)&&(c==0)); //等號被按下,等待新的操作符(僅對第一個數(shù)字有效)
}
else if(dsp[0]==14) //按下C清零
{
dsp[1]=0;
for(i=2;i<9;i++)
dsp=12;
c=0;
}
while(dsp[0]==15&&c==0) //未輸滿8位且是第一個數(shù)字即按下等號,等待非等號操作符
{
dsp[0]=keyscan(); //獲取操作符號
if(dsp[0]==14||dsp[0]<10) //按下C或者數(shù)字都進行清零,重新輸入a
{
dsp[0]=14; //將dsp[0]置為14,防止因數(shù)字清零未能攔截
dsp[1]=0;
for(i=2;i<9;i++)
dsp=12;
c=0;
}
}
}while(dsp[0]==14); //數(shù)字輸入未完成即按下C,重新等待輸入
do
{
if(c==0) //沒有數(shù)字輸入
{
k=dsp[0]; //存計算符(循環(huán)內(nèi)已排除C、=、數(shù)字)
for(i=0;i<8;i++) //將第一個數(shù)存入a[8]
{
a=dsp[i+1];
}
dsp[1]=0; //清零
for(i=2;i<9;i++)
dsp=12;
c=1; //已輸入a
/***goto跳轉(zhuǎn)標志***/
goto KSC;
}
else if(c==1)
{
for(i=0;i<8;i++) //將第二個數(shù)存入b[8]
{
b=dsp[i+1];
}
c=2; //已輸入b
if(dsp[0]!=15) //b輸完后操作符不是等號
{
calculate(k,a,b);
for(i=0;i<8;i++) //將計算結(jié)果存入a[8],a值更新
{
a=dsp[i+1];
}
k=dsp[0]; //更新計算符
c=1;
/***goto跳轉(zhuǎn)標志***/
goto KSC;
}
}
}while((dsp[0]==15)&&(c<2)); //直到ab輸入完成且按下等號
calculate(k,a,b); //進行最后計算
/***goto跳轉(zhuǎn)標志***/
goto KSC; //跳回KSC,等待新一輪計算
while(1); //防止程序跑飛
}
char keyscan()
{
char KeyL;
char KeyR;
char j;
do
{
do
{
P3=0xF0;
P3=P3|0xF0;//行掃描11110000
if(P3!=0xF0)
{
KeyL=P3;
P3=0x0F;
P3=P3|0x0F;//列掃描00001111
KeyR=P3;
}
}while(KeyL==0xF0||KeyR==0x0F);
for(j=0;j<12;j++) //延時0.001s=1ms
{;}
}while(P3!=0x0F);
switch(KeyL&KeyR)
{
case 0x28:{return 0;}
case 0x11:{return 1;}
case 0x21:{return 2;}
case 0x41:{return 3;}
case 0x12:{return 4;}
case 0x22:{return 5;}
case 0x42:{return 6;}
case 0x14:{return 7;}
case 0x24:{return 8;}
case 0x44:{return 9;}
case 0x81:{return 10;}//加法(第一行,第四列)
case 0x82:{return 11;}//減法(第二行,第四列)
case 0x84:{return 12;}//乘法(第三行,第四列)
case 0x88:{return 13;}//除法(第四行,第四列)
case 0x18:{return 14;}//清零(第四行,第一列)
case 0x48:{return 15;}//計算結(jié)果(第四行,第三列)
}
}
void display() interrupt 1 using 1 //利用定時器中斷實現(xiàn)間時顯示
{
char i,j,h;
ET0=0;
for(j=8;j>0;j--) //掃描8次
{
for(i=7;i>=0;i--) //從高位到低位掃描顯示
{
P2=0;
P1=LED_CODES[dsp[8-i]];
P2=Select;
for(h=0;h<8;h++)
{;}
}
}
TL0=-(1000/256);
TH0=-(1000%256);
ET0=1;
}
void calculate(char k,char a[8],char b[8])
{
char r[8];
long i,x,y;
i=0;
x=0;
y=0;
for(i=7;i>0;i--) //數(shù)值轉(zhuǎn)化,將代表空格的12轉(zhuǎn)化為數(shù)字0,因為個位不顯示空格,默認為0,所以不轉(zhuǎn)化
{
while(a==12)a=0;
while(b==12)b=0;
}
x=a[4];
x=10000*x;
x=x+a[0]+a[1]*10+a[2]*100+a[3]*1000+a[5]*100000+a[6]*1000000+a[7]*10000000;
y=b[4];
y=10000*y;
y=y+b[0]+b[1]*10+b[2]*100+b[3]*1000+b[5]*100000+b[6]*1000000+b[7]*10000000;
if(k==10)//加法運算
{
x=x+y;
if(x>99999999) //大于8位,顯示“Err”
{
r[0]=11; //r
r[1]=11; //r
r[2]=10; //E
r[3]=12; //空格
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
}
}
if(k==11)//減法運算
{
if(x<y)
{
x=y-x;
if(x>9999999)
{
r[0]=11; //r
r[1]=11; //r
r[2]=10; //E
r[3]=12; //空格
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
for(i=7;i>0;i--) //將有效數(shù)字的高一位轉(zhuǎn)化為-號
{
if(r==0&&r[i-1]!=0)
{
r=14;
break;
}
}
}
}
else
{
x=x-y;
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
}
}
if(k==12)//乘法運算
{
i=x;
x=x*y;
if(y==0)
{
x=0;
}
else if(x>99999999||x<i) //積大于99999999或者小于乘數(shù)都認為是異常,存在其他可能的溢出,須自行辨別
{
r[0]=11; //r
r[1]=11; //r
r[2]=10; //E
r[3]=12; //空格
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
}
}
if(k==13)//除法運算
{
if(y==0) //被除數(shù)不能為0
{
r[0]=11; //r
r[1]=11; //r
r[2]=10; //E
r[3]=12; //空格
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
x=x/y;
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
}
}
for(i=7;i>0;i--) //數(shù)值轉(zhuǎn)化,將高位的無效數(shù)字0轉(zhuǎn)化為空格符12
{
if(r==0)
r=12;
else
break;
}
for(i=0;i<8;i++) //將計算結(jié)果存入dsp[9],顯示數(shù)更新
{
dsp[i+1]=r;
}
}
|