2016-12-15 4 views
0

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

Что я хочу сделать, это отобразить их в виде гистограммы с нулевой точкой в ​​центре. Поскольку 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.

+0

Вам нужно добавить некоторые примеры желаемого результата. Например, в состоянии покоя (нулевой подъем/приемник) вам может понадобиться '██░░░░'; при максимальном подъеме '█████' и при максимальном погружении' █████░░░░'. Или что-то подобное. Вы можете скопировать-вставить Unicode [элемент блока] (https://en.wikipedia.org/wiki/Block_Elements) или [box drawing] (https://en.wikipedia.org/wiki/Box-drawing_character) символы из Страницы Википедии. Существует также StackOverflow [помощь по уменьшению маркировки] (http://stackoverflow.com/editing-help). –

+0

Какой ЖК-контроллер вы используете? – Uint32

+0

@NominalAnimal, как у вас есть, есть именно то, что я хочу. Единственное отличие состоит в том, что средняя нулевая точка занимает больший блок. У меня есть правая рука, но, как только она входит в левую руку, «снижается», на ЖК-дисплее отображаются блоки по всему экрану. –

ответ

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);   
} 
+0

К сожалению, гистограмма с левой стороны начинается посередине, а блоки заполняются слева, так как уменьшается значение DELVAL. @kkrambo –

+0

Я отредактировал вопрос, чтобы показать раздел, который не работает @kkrambo –

+0

@ user_1 Ваша петля с символом2 не работает, потому что она всегда начинает рисовать на '(1, 2)'. Вы не сделали ничего, чтобы изменить направление. Ваш цикл character2 рисует слева направо так же, как ваш цикл character1. Исправление, которое я представил здесь, по-прежнему технически рисует слева направо, но оно не всегда начинается с '(1, 2)'. Вместо этого он начинается с '(1, scale_center - left_bar_length)'. Это даст иллюзию, что он рисуется справа налево, потому что правый край левой полосы всегда будет выровнен с центром шкалы. – kkrambo

Смежные вопросы