c - 定点二进制到 LCD

标签 c binary embedded microcontroller fixed

我已经非常接近在 LCD 上按预期输出了。问题是,当我从整数中提取数字以将数字作为整数并将余数作为我的分数时,我似乎无法获得正确的输出。

在小数点之前,输出看起来很好,但在小数点之后,则不然。

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

最佳答案

我通过与运算符(operator)一起解决了这个问题。我更改为如下,它似乎可以工作并在 4 小时后获得我想要的输出,但我确信 4 小时有助于我学习,这是菜鸟的挣扎,但没关系。

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

关于c - 定点二进制到 LCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39820872/

相关文章:

在 C 中将字符数组集中到单个字符数组中

c - ARM 程序集 : How to pass and make use of a array of pointers inside an ARM Assembly function

assembly - 二进制到BCD转换

c - AT91SAM7X-EK 评估板

c - 安全关键系统中的封装

c - STM32F207 I2C 测试失败

android - 如何将openssl集成到Android中?

c++ - 堆栈销毁期间自动堆​​清理

binary - 如何将十进制数计算为 8 位多余的二进制数?

c - Linux二进制串行读取问题