2011-12-19 104 views
-4

我需要一个问题,我使用PIC模拟器通过串口导入2个数字。首先我发送字节,例如5,然后发送发送2,并在第三步我发送char例如*,结果是5 * 2 = 10。一切都很好,直到我发送更大的数字超过255个。它说错误的输入,我知道我只能按字节发送255。但是我怎样才能导入更大的数字。代码中应该更改哪些内容才能处理更大的数字。一些想法???????非常感谢乘以两个大于255的数字

//================= 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。这是一个负载的代码wader通过... – Almo 2011-12-19 19:28:17

+0

我知道,但你怎么想导入到大于255的数字。是否有一些函数在c或其他? – user1106580 2011-12-19 19:31:24

+0

所有的代码仍然没有告诉我们“说错了什么”。我们需要知道这一点。 – 2011-12-19 19:40:36

回答

1

您可以使用一个事实,即

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

打破你的乘法成小块,但你仍然不得不面对的事实,最终的结果可能会大于什么适合你使用的任何类型。

+0

好主意,我会尝试发送这种格式的字符串。 – user1106580 2011-12-19 19:50:06

+0

但是当我发送字符串例如(5 * 10)* 6,是否有函数将字符串转换为int,然后计算语句?或不? – user1106580 2011-12-19 19:55:00

+0

对不起 - 我不知道你可以使用哪些功能;我只是建议一种方法来解决您的问题,以使用较小的操作数。如果你想做265 * 3,你可以做255 * 3和10 * 3并且自己将两个结果相加,注意处理任何溢出。尝试解决局限性总是很痛苦。祝你好运。 – Caleb 2011-12-19 20:06:08