2016-12-15 115 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