Обратное направление гистограммы в 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);
}