2016-12-15 73 views
0

我想编程我自己的版本的变差表示爬升水槽以米/秒为单位。这些值显示在LCD模块屏幕上。在程序运行时,可以通过旋转的电位计缩小爬升值和吸入值。要显示的爬升值范围从climb: 0 m/sclimb: 300 m/s,并且下降值范围从sink: 0 m/ssink: -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是从电位器读取的数据。我可以让条形图的右侧工作,但不能让左侧工作。任何人都可以让我知道我的代码的任何问题,并解释让左侧工作的最佳方法。

在我的代码中不工作的部分是包含character2的for循环。

+0

您需要添加一些所需输出示例。例如,在休息时(零爬/下沉),你可能需要'░░░░█░░░░';最大爬升量为'█████',最大量为'█████░░░░'。或类似的东西。您可以复制粘贴Unicode [block element](https://en.wikipedia.org/wiki/Block_Elements)或[box drawing](https://en.wikipedia.org/wiki/Box-drawing_character)字符维基百科页面。还有StackOverflow [markdown编辑帮助](http://stackoverflow.com/editing-help)。 –

+0

您正在使用哪种LCD控制器? – 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您的循环与character2不起作用,因为它始终在'(1,2)'处开始绘制。你没有做任何事情来扭转方向。你的character2循环就像你的character1循环一样从左到右绘制。我在这里提出的修复技术上仍然从左到右绘制,但它并不总是从'(1,2)'开始。相反,它从'(1,scale_center - left_bar_length)'开始。这会产生错觉,它从右向左绘制,因为左侧栏的右侧边缘将始终与刻度的中心对齐。 – kkrambo