2011-12-19 8 views
-4

私は問題があります。私はシリアルポートで数値をインポートするためにPICシミュレータを使用します。最初にバイト5を送信し、次に送信した2を送信し、3番目のステップでchar *などを送信し、結果は5 * 2 = 10となります。間違ったエントリーがあると私は255バイトしか送信できないことを知っています。しかし、どうすれば大きな数をインポートできますか。より大きな数字のためには、コード内で何を変更する必要がありますか。いくつかのアイデア???????おかげでたくさん255より大きい2つの数値を掛ける

//================= konfigure LCD display 
    // port for data PORTB 
    sbit LCD_RS at RB4_bit; 
    sbit LCD_EN at RB5_bit; 
    sbit LCD_D4 at RB0_bit; 
    sbit LCD_D5 at RB1_bit; 
    sbit LCD_D6 at RB2_bit; 
    sbit LCD_D7 at RB3_bit; 

    sbit LCD_RS_Direction at TRISB4_bit; 
    sbit LCD_EN_Direction at TRISB5_bit; 
    sbit LCD_D4_Direction at TRISB0_bit; 
    sbit LCD_D5_Direction at TRISB1_bit; 
    sbit LCD_D6_Direction at TRISB2_bit; 
    sbit LCD_D7_Direction at TRISB3_bit; 
    //========================================================= 

    //===========variables 
    char operation; 
    int nbr1=0,nbr2=0,result=0,rest=0; 
    char txt[16],br[7]; 
    //========================================================= 

    //======== delete empty spaces 
    void empty_spaces(char array[]){ 
    int j=0,i=0,n=0; 
    n=strlen(array); 
    while(i<n){ 
     if(array[i]==' '){ 
      j=i; 
      while(j<n){ 
       array[j]=array[j+1]; 
       ++j; 
      } 
      --n; 
     }else 
      ++i; 
    } 
    if(n>15) 
      n=15; 
    array[n]='\0'; 
    } 
    //========================================================= 

    //========function back int from the imported char 

    int back_char(char operation){ 
     if(operation=='+') 
      return 1; 
     if(operation=='-') 
      return 2; 
     if(operation=='*') 
      return 3; 
     if(operation=='/') 
      return 4; 
     if(operation=='%') 
      return 5; 
     return 0; 
    } 
    //========================================================= 

    //============= init lcd display and serial port 
    void inicijalizacija(){ 
     PORTB = 0xFF; 
     TRISB = 0x00; 
     ANSEL = 0x00; 
     ANSELH = 0x00; 
     C1ON_bit = 0; 
     C2ON_bit = 0; 
     UART1_Init(9600); 
     Delay_ms(100); 
     Lcd_Init(); 
     Lcd_Cmd(_LCD_CLEAR); 
     Lcd_Cmd(_LCD_CURSOR_OFF); 
    } 
    //========================================================= 

    void main(){ 
     inicijalizacija(); 
     //============= enter first number 
     UART1_Write_Text("first num:"); 
     UART1_Write(10); 
     UART1_Write(13); 
      do{ 
      }while(!UART1_Data_Ready()); 
     nbr1=UART1_Read(); 
     IntToStr(nbr1,br); 
     strcpy(txt,"Num1:"); 
     strcat(txt,br); 
     empty_spaces(txt); 
     Lcd_Out(1,1,txt); 
     Delay_ms(1); 


     //=============enter second number 
     UART1_Write_Text("second num:"); 
     UART1_Write(10); 
     UART1_Write(13); 
      do{ 
      }while(!UART1_Data_Ready()); 
     nbr2=UART1_Read(); 
     IntToStr(nbr2,br); 
     strcpy(txt,"Num2:"); 
     strcat(txt,br); 
     empty_spaces(txt); 
     Lcd_Out(1,10,txt); 
     Delay_ms(1); 
     //============================================================== 

     //enter operation 

     UART1_Write_Text("operation(+,-,/,*,%):"); 
     UART1_Write(10); 
     UART1_Write(13); 
      do{ 
      }while(!UART1_Data_Ready()); 
     operation=UART1_Read(); 
     strcpy(txt,"oper:"); 
     switch(back_char(operation)){ 
      case 0: strcat(txt," ");break; 
      case 1: 
        strcat(txt,"+"); 
        result=nbr1+nbr2; 
        break; 
      case 2: 
        strcat(txt,"-"); 
        result=nbr1-nbr2; 
        break; 
      case 3: 
        strcat(txt,"*"); 
        result=nbr1*nbr2; 
        if(nbr2!=result/nbr1) 
         operation=' '; 
        break; 
      case 4: 
        strcat(txt,"/"); 
        if(nbr2==0) 
         operation=' '; 
        else{ 
         result=nbr1/nbr2; 
         rest=nbr1%nbr2; 
        } 
        break; 
      case 5: 
        strcat(txt,"%"); 
        if(nbr2==0) 
         operation=' '; 
        else 
         result=nbr1%nbr2; 
        break; 
      } 
     empty_spaces(txt); 
     Lcd_Out(2,1,txt); 
     Delay_ms(1); 
     //============================================================== 

     //============= Print result 

     if(back_char(operation)!=0){ 
      IntToStr(result,br); 
      strcpy(txt,"Rez:"); 
      strcat(txt,br); 
      empty_spaces(txt); 
      if(back_char(operation)!=4) 
       Lcd_Out(2,7,txt); 
      else{      // Dokolku vrednosta od funkcijata vrati_znak(operacija) e 4 
       IntToStr(rest,br);  // se raboti za delenje 
       empty_spaces(br); 
       strcat(txt,"~"); 
       strcat(txt,br); 
       Lcd_Out(2,5,txt); 
      } 
     }else 
      Lcd_Out(2,7,"error!"); 
     Delay_ms(1); 
     //============================================================== 
    } 
+0

Woa。これは、コードをロードしてウェイをすることです... – Almo

+0

私はあなたが255より大きい数値へのインポートについて考えていることを知っています.Cや他の何かの関数がありますか? – user1106580

+0

このコードでは、まだ「間違った入力」とは何も表示されません。私たちはそれを知る必要があります。 –

答えて

1

あなたが小さな塊にあなたの乗算を破る

(a + b) * c == (a * c) + (b * c) 

という事実を使用することができますが、あなたはまだ最終結果はより大きいかもしれないという事実に対処する必要がありますどのような種類のものを使用しているかに合っています。

+0

良いアイデア、私は今この形式で文字列を送信しようとします。 – user1106580

+0

しかし、例えば(5 * 10)* 6のように文字列を送信すると、文字列をintに変換してから文を計算する機能がありますか?か否か? – user1106580

+0

申し訳ありません - ご利用いただける機能がわかりません。私はちょうど小さなオペランドを使用するためにあなたの問題を分割する方法を提案しています。 265 * 3を実行したい場合は、255 * 3と10 * 3を行い、オーバーフローに注意して2つの結果を一緒に追加します。限界を回避しようとするのはいつも苦しいです。がんばろう。 – Caleb

関連する問題