久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4412|回復: 0
收起左側(cè)

計算器編程

[復制鏈接]
ID:41700 發(fā)表于 2012-6-13 13:05 | 顯示全部樓層 |閱讀模式
 編程提示: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;
 }
}

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产91色在线 | 亚洲 | 超碰国产在线 | 精品1区2区| 久久成人精品视频 | 国产精品视频网站 | 久草在线中文888 | 国产成人在线观看免费 | 国产精品一区二区av | 99re在线视频 | 亚洲午夜精品在线观看 | 91精品国产欧美一区二区 | 精品乱子伦一区二区三区 | 九九热国产精品视频 | 婷婷久久综合 | 狠狠操狠狠操 | 欧美精品一二三 | 夜夜骚| 看片天堂| 五月婷婷丁香 | 国产成人自拍一区 | 自拍偷拍视频网 | 亚洲伊人久久综合 | 久久精品久久久久久 | 日韩欧美中文字幕在线观看 | 男女视频在线观看 | 精品久久99| 久久精品综合 | 久久精品网 | 91伊人 | 成人网av| 亚洲成色777777在线观看影院 | 免费1区2区3区| 久久久久久久一区二区三区 | av中文字幕在线 | 国产精品一区二区三区四区 | 亚洲一区二区免费 | av三级| 中文字幕不卡视频在线观看 | 密色视频 | 女人天堂av | 精品免费国产一区二区三区四区 |