Обратное направление гистограммы в C

Я хочу запрограммировать свою собственную версию вариометра для отображения набора высоты и погружения в метрах / секунду. Значения отображаются на экране ЖК-модуля. Значения набора высоты и снижения уменьшаются с потенциометра, который я могу вращать для изменения значений во время работы программы. Значения набора высоты для отображения в диапазоне от climb: 0 m/s в climb: 300 m/s и значения приемника варьируются от sink: 0 m/s в sink: -300 m/s, Этот бит в порядке.

То, что я хочу сейчас сделать, это отобразить их в виде гистограммы с нулевой точкой в ​​центре. Как climb увеличивается до 300, блоки справа от нулевой точки заполняются соответственно слева направо. Когда sink значение уменьшается до -300. Я хочу, чтобы блоки с левой стороны нулевой точки заполнялись соответственно справа налево, по существу, изменяя направление правой стороны.

   climb = (DELVAL*600ul + 1023/2)/1023;               
   sink =  (DELVAL*600ul + 1023/2)/1023;

   climb2 = ((DELVAL-511.5)*600ul + 1023/2)/1023;                        
   sink2 =  ((DELVAL+511.5)*600ul + 1023/2)/1023;

   if (DELVAL > 511.5)
   {
        sprintf(buf, "Climb: +%d  m/s ", climb-300);                
        lcd_putxy(2,0,buf);
        for (delay = 0; delay < 50000; delay++);                   
   }
   if (DELVAL < 511.5)
   {
        sprintf(buf, "Sink: -%d   m/s ", ~sink+300);                
        lcd_putxy(2,0,buf);
        for (delay = 0; delay < 50000; delay++);
   }
   character1 = climb2 / 35;
   character2 = sink2 / 35;

      lcd_move(1,10);                                  

   for (i = 0; i < character1; i++)                            
   {

      lcd_putchar(0xD0);                                      
   }
      lcd_putstr("  ");                                      

  for (delay = 0; delay < 50000; delay++);            

  lcd_move(1,2);                                      

  for (i = 0; i < character2; i++)                     
  {    
       lcd_putchar(0xD0);         
  } 
   for (delay = 0; delay < 50000; delay++);

DELVAL это данные, считанные с потенциометра. Я могу заставить работать правую часть гистограммы, но не могу работать с левой стороны. Может кто-нибудь сообщить мне о любых проблемах с моим кодом и объяснить лучший метод, чтобы заставить работать левую сторону.

Часть, которая не работает в моем коде, это цикл for, содержащий character2,

1 ответ

Вы не описали, что не работает. Но я предполагаю, что левая сторона нарисована слева направо, а не справа налево, как вы и предполагали. Где вы намеревались поменять направление левой стороны?

Попробуйте это для реверса левой стороны. Обратите внимание, что если бы вы использовали больше описательных имен переменных, комментариев и меньше магических чисел, ваш код был бы намного проще для понимания.

int left_bar_length = character2;
int max_bar_length = 300 / 35;
int left_scale_edge = 2;
int scale_center = left_scale_edge + max_bar_length;

// Move cursor to left end of left bar.
lcd_move(1, scale_center - left_bar_length);                                      

// Draw the left bar.
for (i = 0; i < left_bar_length; i++)                     
{    
     lcd_putchar(0xD0);         
} 
Другие вопросы по тегам