文字LED跑馬燈的作法有好幾種,縱向的比橫向的好做,但網路上能找到的本質上都是以查表法的方式來完成

 

但查表法有幾個問題:


1.需事先把每個字的點陣資料完成,字數少時還好,字數一多就很難做了,點陣資料是否正確很難比對


2.點陣資料是寫死的,也就是若是點陣資料沒有的字就不可能顯示,勢必重新寫過把字加進去


3.就因為點陣資料是寫死的,顯示的點陣字體大小也是固定的,若要改變點陣字體大小,資料來源陣列必需重做


4.網路上找到的多數是跑英文和數字,因為英文和數字加起來頂多30多個字,查表法比較好做。那中文字呢?常用中文就有幾千個,真要做成查表用的資料來源陣列是一大工程


另外網路上的例子多是轉換資料和顯示同時動作,有時會有文字移動停頓的問題

 

那要如何克服以上的缺點,讓改字改陣列大小變的容易呢?想到的方法就是先把文字輸出成點陣圖型,再把點陣圖形文字轉換成布林陣列,最後再來顯示跑馬燈

 

 

經過幾次測試改寫完成的程式有幾項特點:


1.跑馬燈的文字可由使用者自行輸入,只要作業系統能輸入的文字都可以跑,要跑符號或日文也是可以


2.在跑文字的中途可以按暫停,更改完輸入文字後,以新的文字重新跑


3.要更改顯示點陣字體大小只需更改4個位置的程式參數,和調整程式面板上LED陣列即可


4.字體要特殊效果(斜體、粗體、加底線、使用特殊字型)只需更改程式參數即可

 

 

程式的操作流程:


1.先在文字輸入框輸入要顯示的文字


2.按輸入確定按鈕,中央的LED看板開始由右向左顯示移動文字。輸入確定按鈕自動隱藏。這時可用速度控制旋鈕控制文字移動速度


3.按暫停鈕LED看板文字停止移動,輸入確定按鈕恢復顯示。這時可在文字輸入框重新輸入要顯示的文字


4.按STOP鈕看板文字停止移動,輸入確定按鈕恢復顯示,程式停止

 

 

以下說明程式的構成:

 


首先是程式面板

20091017-14  

 

上方是1個輸入確定按鈕和文字輸入框,要另加輸入確定按鈕的原因是預防輸入文字時誤動作。另外輸入確定按鈕在跑馬燈動作時會隱藏,以免二次觸發造成程式當機

 

中央是由LED元件構成的LED看板陣列,我是設定成64×16的大小,最多顯示4個全形字(每個全形字由16×16的點陣構成)。若要調整建議寬是高的整數倍,這樣全形字顯示比較完整

 

下方暫停鈕可暫停跑馬燈動作,並恢復輸入確定按鈕的顯示。STOP鈕可停止跑馬燈動作並恢復顯示輸入確定按鈕。速度控制旋鈕則可以控制跑馬燈的移動速度

 

 

 

完整的程式碼如下:

20091017-06  

 

程式的主要部份以Flat Sequence Structure元件分成左右2個部份,左邊是把文字轉換成布林點陣資料,右邊是橫式文字跑馬燈的主程式

 

 

首先文字轉換成布林點陣資料我是用輸入確定按鈕的Mouse Down事件來觸發動作,之所以不用Value Change事件,是因為Value Change事件會有觸發不確實的問題

20091017-07  

 

 

觸發之後先以Empty String/Path?元件判定文字輸入框內是否有文字(半形字空白也算有文字),用Case Structure元件來區隔,有文字時輸出為False,此時才開始用While Loop迴圈的移位暫存器(Shift Register)轉換文字。字串進入迴圈前在字串後再加1個半形字空白,作為文字循環顯示時的區隔,若拿掉則字串的首尾會接連著顯示

20091017-08  

 

 

轉換的一開始是把字串一一分離成單一字元,這裡有要注意的重點是中文或符號等全形字算2個字元,英文數字等半形字算1個字元,分離時要分開處理。先以Replace Substring元件取出第1個字元,再以Printable?元件判定是半形或全形字,若是半形字則輸出為True。半形字用Replace Substring元件取出1個字元,全形字用Replace Substring元件取出2個字元。當字串的字全取出後停止迴圈

20091017-09  

 

 

再來是用Draw Text in Rect.vi元件來把文字轉換成圖型資料。這裡有5項設定部份,由下往上說明:

20091017-10  

 

1.BG color(transparent)圖形背景顏色,我是設定成白色,其他顏色也可以,重點是不能和文字同色


2.text color(black)文字顏色,我是設定成黑色,因為黑色在轉換成數值時是0,後續程式比較好處理


3.rect繪圖範圍指定的是左(left)上(top)和右(right)下(bottom),左(left)上(top)維持為0不改。下(bottom)配合字型大小修改,如字型設定為16則下(bottom)也必需設定為16;右(right)比較麻煩,若字體沒有任何特殊效果則配合字型大小修改,如字型設定為16則右(right)也必需設定為16。若有使用粗體字效果,則右(right)設定為字型大小的1.125倍取整數,如字型設定為16則右(right)必需設定為18。若有使用斜體字效果,則右(right)設定為字型大小的1.5倍取整數,如字型設定為16則右(right)必需設定為24。若不按照此方式設定,則字的右邊會有一部份被截掉


4.desired font(Application)這裡一定要設定為User-specified Font,這樣才能使用自己設定的字型參數


5.[user-specified font]字型參數,這裡能設定的有5項,依序是:


    a.Font Name:字型名稱,要作業系統有安裝的字型才能設定,中文字不能使用英文字型,建議用細明體轉換後的點陣比較方正


    b.Size字型大小,有中文字建議設為16(含)以上,這樣筆劃多的字才不會變成一團


    c.Italic?斜體字,字會向右傾斜,所以繪圖範圍的寬度必需加大1.5倍取整數


    d.Underline?加底線,會在每個字底下加一條橫線(半形空白字也會)


    e.Bold?粗體字,字會在豎和斜的筆劃上加粗(橫的筆劃不會),所以繪圖範圍的寬度必需加大1.125倍取整數

 

 

轉出來的圖形資料還要再轉換才能成為布林陣列資料

20091017-11  

 

這裡用Picture to Pixmap.vi和Unflatten Pixmap.vi元件先把圖形資料轉換成數值陣列,這數值陣列是由顏色的表示值構成。之前的步驟把字設定成黑色(顏色數值0),這時再用Equal To 0?元件把數值陣列中的0全轉為True,以外的數值全轉為False


轉換出來的布林點陣資料都是一樣大小,這樣半形字的右邊會多出一個半形字空白,所以必需再用Delete From Array元件來去除多出的那一半。Delete From Array元件length這一項設定的數值必須是繪圖範圍右(right)這個數值的一半,如繪圖範圍右(right)的數值為16,則length必需設定為8


處理後的布林陣列必需再以Transpose 2D Array元件轉換方向,再以Build Array元件串聯成單一陣列輸出,這樣做是方便下一步驟的跑馬燈程式處理

 

 

在進入下一步驟前必需將輸入確定按鈕隱藏,因為跑馬燈在動作時若再觸發這個按鈕的事件會造成程式錯誤當機,隱藏按鈕可避免這個問題

20091017-12  

 

 

右邊的跑馬燈程式我是用While Loop迴圈的移位暫存器(Shift Register)來處理,移位暫存器的初始值是用Initialize Array元件創建1個全部由False組成的64×16大小的布林陣列,用來作為LED顯示陣列的基礎

20091017-13  

 

迴圈內使用Timeout事件來控制顯示速度,這樣做在暫停及STOP的控制上會比較簡單


跑馬燈的主要部份使用插入刪除法:先用Index Array元件將轉換好後的布林陣列按順序取出資料(取完後從頭再開始),再用Insert Into Array元件將取出的資料插入顯示陣列的最右邊,接著用Delete From Array元件刪除顯示陣列的最左邊,如此就可讓文字從右邊往左邊移動


迴圈停止時則強制顯示輸入確定按鈕元件

 

跑馬燈還有其他的移動方法,但用插入刪除法可避免陣列很大時出現顯示有時停頓的問題

 

 

以下是程式試跑的畫面

20091017-01  

 

20091017-02  

 

20091017-03  

 

20091017-04  

 

20091017-05  

 

 

 

針對"小黑~"的問題補充說明:


修改程式要達成的效果:由字串最尾端開始,從左邊跑向右邊,循環顯示

 

 


修改重點:

 

1.原本用來隔開字串的空白從插入後面改成插入前面

20091017-15  

 

 

2.字串點陣反向重組,原本點陣的右邊改到左邊,左邊改到右邊,這樣每個字的點陣輸出順序正好相反

20091017-16  

 

 

3.顯示部分改成插入陣列左邊的前端,刪除陣列右邊的後端

20091017-17  

,

未出師的小工程師 發表在 痞客邦 PIXNET 留言(0) 人氣()