Двоичный код с фиксированной запятой на ЖК-дисплей

#c #binary #embedded #microcontroller #fixed

#c #двоичный #встроенный #микроконтроллер #исправлено

Вопрос:

Я так близок к тому, чтобы выводить данные на мой ЖК-дисплей по желанию. Проблема в том, что когда я извлекаю цифры из целого числа, чтобы цифры были целыми, а остаток — моей дробью, я, похоже, не могу получить правильный вывод.

До десятичного числа вывод выглядит нормально, но после — нет.

 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
};
  

Ниже приведен снимок экрана моего вывода, а столбец справа от меня — это то, что я должен получить.
ВЫВОД ИЗОБРАЖЕНИЯ

Комментарии:

1. Подумайте, что делает оператор по модулю и почему это вызывает вашу проблему.

2. sprintf попытается создать строки с нулевым завершением, но вы не используете нулевые терминаторы и не выделяете для них место.

Ответ №1:

Я исправил это, поиграв с операторами. Я изменил на следующее, и, похоже, он работает и получает желаемый результат примерно через 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)00;
   // 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