2016-10-02 90 views
0

我非常接近根据需要在液晶显示器上输出。问题是,当我从整数中提取数字以将数字作为整数并将余数作为分数时,我似乎无法得到正确的输出。固定点二进制到液晶显示器

在小数点之前输出看起来不错,但之后没有。

void ST7735_uBinOut8(uint32_t n){ 
     uint32_t value2; 

    value2 = n; 

    char integer2[2]; 
    char fraction2[4]; 
    uint32_t f_part2 = abs(value2)%256; 
    uint32_t i_part2 = ((abs(value2)) /256) ; 

    if (abs(value2) > 256000U) 
    { 
     integer2[0] = '*'; 
       integer2[1] = '*'; 

      fraction2[0] = '*'; 
      fraction2[1] = '*'; 
      fraction2[2] = '*'; 
      fraction2[3] = '*'; 

    } 
    else 
    { 
     if (abs(value2) < 256000U) 
     sprintf(integer2, "%d", i_part2); 
     sprintf(fraction2, "%.3d", f_part2); 
     } 
    printf("%s.%s", integer2, fraction2); 

下面是我通过这个函数的值:

outTestCaseType2 outTests2[14]={ 
{  0, " = 0.00?\r" }, //  0/256 = 0.00 
{  4, " = 0.01?\r" }, //  4/256 = 0.01 
{ 10, " = 0.03?\r" }, //  10/256 = 0.03 
{ 200, " = 0.78?\r" }, // 200/256 = 0.78 
{ 254, " = 0.99?\r" }, // 254/256 = 0.99 
{ 505, " = 1.97?\r" }, // 505/256 = 1.97 
{ 1070, " = 4.17?\r" }, // 1070/256 = 4.17 
{ 5120, " = 20.00?\r" }, // 5120/256 = 20.00 
{ 12184, " = 47.59?\r" }, // 12184/256 = 47.59 
{ 26000, " = 101.56?\r" }, // 26000/256 = 101.56 
{ 32767, " = 127.99?\r" }, // 32767/256 = 127.99 
{ 34567, " = 135.02?\r" }, // 34567/256 = 135.02 
{255998, " = 999.99?\r" }, // 255998/256 = 999.99 
{256000, " = ***.**?\r" } // error 
}; 

下面是我的输出的屏幕截图,并在我的右侧列是什么,我应该得到的。 OUTPUT IMG

+0

思模运算做什么以及为什么会导致您的问题。 –

+0

'sprintf'将尝试创建以空字符结尾的字符串,但是您不使用空终止符,也不为它们分配空间。 – Lundin

回答

0

我通过与运营商一起玩来修复它。我改为如下,它似乎工作,得到我想要的输出后,像4小时,但我敢肯定,4小时走向我学习,这是一个noob的斗争,但它的确定。

void ST7735_uBinOut8(uint32_t n){ 
     uint32_t value2; 

    value2 = (n*1000)/256; 

    char integer2[2]; 
    char fraction2[4]; 
    uint32_t f_part2 = abs(value2)%1000; 
    uint32_t i_part2 = ((abs(value2)) /1000) ; 

    //f_part2 = abs(f_part2)%1000; 
    // i_part2 = abs(i_part2) /1000 ; 

    if (abs(n) >= 256000U) 
    { 
     integer2[0] = '*'; 
       integer2[1] = '*'; 

      fraction2[0] = '*'; 
      fraction2[1] = '*'; 
      fraction2[2] = '*'; 
      fraction2[3] = '*'; 

    } 
    else 
    { 
     if (abs(n) < 256000U) 
     sprintf(integer2, "%d", i_part2); 
     sprintf(fraction2, "%.3d", (f_part2)); 
     } 
    printf("%s.%.2s", integer2, fraction2); 

} 

这是我现在的输出:IMG