1、引言
以往的LED 異步控制器只能把一個屏幕作為一個完整的區(qū)域來進(jìn)行顯示, 或者簡單的加上時間區(qū)域或游走字幕區(qū)域,這樣對于用戶來講往往缺乏足夠的靈活性, 尤其在屏幕較大的時候。針對以上情況, 本文提出了一款基于32 位高性能ARM處理器和uc/OS- II 的設(shè)計方案。它充分利用了uc/OS-II 高效的多任務(wù)管理功能和ARM處理器強(qiáng)大的運算能力, 實現(xiàn)了單屏幕多窗口的任意位置顯示, 使得顯示內(nèi)容變得更加豐富, 顯示方式變得更加靈活。
2、LED控制系統(tǒng)的工作原理
典型的LED 異步控制系統(tǒng)主要由PC 應(yīng)用軟件、通信模塊、數(shù)據(jù)處理模塊、掃描控制模塊、驅(qū)動模塊和LED 屏幾部分組成,如圖1 所示。
首先, PC 應(yīng)用軟件將文本或圖片轉(zhuǎn)化為具有特定格式的點陣信息。然后, 通過通信模塊將此點陣信息發(fā)送給數(shù)據(jù)處理模塊。數(shù)據(jù)處理模塊對這些點陣信息進(jìn)行各種特技處理, 最后通過掃描控制模塊和驅(qū)動模塊將畫面在LED 屏上進(jìn)行正確顯示。
本文所指的LED 異步控制器包括通信模塊、數(shù)據(jù)處理模塊和掃描控制模塊三部分。
3、控制器軟件部分的設(shè)計
本控制器的硬件結(jié)構(gòu)如圖2 所示。數(shù)據(jù)處理模塊由MCU,一片SRAM和一片F(xiàn)LASH 存儲器組成。MCU 選用PHILIPS 的基于32 位ARM內(nèi)核的LPC2214 處理器, 它有著豐富的外圍接口資源和強(qiáng)大的運算能力, 是整個控制器的核心。SRAM作為MCU 進(jìn)行特技處理時的緩存使用。FLASH 存儲器用于存儲點陣信息和一些必要的參數(shù)。
掃描控制模塊由CPLD 和顯存組成。顯存為一片SRAM, 它用于保存當(dāng)前顯示的一幀點陣信息。CPLD 通過地址總線和16位數(shù)據(jù)總線與MCU 相連, 它把從MCU 接收到的16 位數(shù)據(jù)按指定地址寫入顯存, 然后再按一定的尋址方式從顯存中讀出點陣信息進(jìn)行掃描。MCU 只能通過CPLD 對顯存進(jìn)行以字(2byte)為單位的寫操作。通信模塊包括以太網(wǎng)模塊和串口通信模塊, 用于實現(xiàn)PC 與控制器之間的RS232、RS485 以及工業(yè)以太網(wǎng)通信。
4、控制器軟件部分的設(shè)計
為了實現(xiàn)單屏幕、多窗口任意位置的顯示, 軟件部分我們基于uc/OS- II 進(jìn)行設(shè)計, 這樣可以充分利用操作系統(tǒng)高效的任務(wù)調(diào)度算法, 將每個窗口的顯示都交由單個任務(wù)來完成, 從而極大地提高系統(tǒng)的運行速度和可靠性, 并且使得程序的開發(fā)和擴(kuò)展變得更加方便。
在進(jìn)行具體的程序設(shè)計之前, 首先要確定數(shù)據(jù)的組織方案。
因為好的數(shù)據(jù)組織方案, 對于程序編寫來說往往可以達(dá)到事半功倍的效果。
4.1 顯存的數(shù)據(jù)組織方案:
對于雙色屏, 一個像素點需要紅、綠兩位數(shù)據(jù)來描述。為了便于處理, 我們將橫向連續(xù)的8 個像素點組成一個字(2byte)來進(jìn)行存儲, 其中一個字節(jié)為紅數(shù)據(jù), 一個字節(jié)為綠數(shù)據(jù)。數(shù)據(jù)存儲順序為從左到右, 從上到下。如圖3 所示, 假如屏幕寬度為160 個像素點, 顯存起始地址為0x83000000, 則屏幕第一行的前8 個像素點映射到顯存中地址為0x83000000 和0x83000001 的兩個字節(jié), 第二行的前8 個像素點映射到顯存中地址為0x83000028 和0x83000029 的兩個字節(jié), 依此類推。
由于窗口大小可以任意設(shè)置, 窗口的位置可以任意擺放。
所以對于單個窗口而言, 它在顯存中的映射可能并非是字(2byte)對齊的。以圖4 為例, 在一個大小為160(寬)×96(高)的屏幕上開設(shè)一個左上角坐標(biāo)為(20,16), 大小為86×47 的窗口, 則此窗口第一行的前4 個像素點在顯存中的映射為地址是0x83000282 和0x83000283 的兩個字節(jié)的低4 位, 所以這個窗口在顯存中的映射并不是字對齊的。由于MCU 只能以字(2byte)為單位對顯存進(jìn)行操作, 所以PC 軟件在對該窗口進(jìn)行點陣信息轉(zhuǎn)換時, 如果直接對區(qū)域1 (窗口的實際大小)進(jìn)行轉(zhuǎn)換存儲,則在對該窗口進(jìn)行特技處理時會存在大量的位運算, 這樣會大大降低運算效率, 從而影響特技效果的顯示, 這樣就很難滿足用戶對特技顯示效果的要求。
為了解決上述問題, 可以將區(qū)域1 橫向擴(kuò)展成起點坐標(biāo)為(16,16), 大小為96×47 的區(qū)域2。易知, 區(qū)域2 在顯存中的映射是字對齊的。為了避免運算時的位操作, PC 軟件在對區(qū)域1 進(jìn)行點陣信息轉(zhuǎn)換時, 可按區(qū)域2 來進(jìn)行, 只是需將區(qū)域1 的擴(kuò)展部分的數(shù)據(jù)全填為1。這樣處理會犧牲掉一小部分FLASH 存儲器空間, 但卻可避免特技處理時大量的位運算, 從而大大提高運算效率, 因此這樣做是值得的。
4.3 緩存數(shù)據(jù)的組織方案:
由于MCU 只能對顯存進(jìn)行寫操作, 而在進(jìn)行特技運算時,往往需要前一幀信息才能得到下一幀的信息。所以, 首先, 需要在緩存中劃分出一塊和顯存大小相等, 地址一一對應(yīng)的區(qū)域screen 用于保存整屏幕的前一幀信息。
又由于MCU 對顯存只能進(jìn)行字操作, 并且多個窗口之間可能會出現(xiàn)區(qū)域重疊, 所以如果各窗口的特技運算都直接在screen 區(qū)域上進(jìn)行, 則窗口重疊部分信息可能會發(fā)生混亂。因此如圖5 所示, 也需要在緩存中為每個窗口劃分出一塊存儲器空間(area 1, area 2, ..., area n), 用于保存本窗口顯示的前一幀信息。這樣在特技運算時, 首先要在area 區(qū)域中對各窗口數(shù)據(jù)進(jìn)行運算得到各窗口的下一幀信息, 然后將area 區(qū)域中數(shù)據(jù)寫入該窗口在screen 區(qū)域中的相應(yīng)地址以保存整屏幕最新一幀信息, 最后把screen 中相應(yīng)數(shù)據(jù)寫入顯存從而完成顯示。
4.4 軟件設(shè)計:
基于上述方案, MCU 程序的設(shè)計變得非常簡潔。程序結(jié)構(gòu)如圖6 所示, 控制器上電后, 首先進(jìn)行系統(tǒng)初始化, 然后從FLASH 中讀取屏參數(shù), 進(jìn)行參數(shù)初始化。接著建立任務(wù)TaskCONtrol, TaskControl 擁有比各窗口顯示任務(wù)都要高的優(yōu)先級, 它主要用于對各窗口顯示任務(wù)進(jìn)行實時管理。每隔一段時間TaskControl 就要對reset 標(biāo)志進(jìn)行一次查詢, 如果reset=1, 它會刪除原先建立的各窗口顯示任務(wù), 然后從FLASH 中讀取新的窗口個數(shù), 依此建立新任務(wù), 將每個窗口的顯示交由單個窗口顯示任務(wù)來控制。
下面是任務(wù)TaskControl 的程序演示:
void TaskControl(void *pdata){
uint8 taskNum;
pdata=pdata;
RESET:
reset=0; //reset 標(biāo)志清零
for(taskNum=3;taskNum<18;taskNum++){ // 刪除原先建立的窗口任務(wù)
OSTaskDEL(taskNum); // 窗口顯示任務(wù)優(yōu)先級從3 開始}// 最多允許設(shè)置16 個窗口
taskNum=flashReadWord(AREA_NUM_ADDR);// 從FLASH中讀取屏幕窗口個數(shù)
if(taskNum>0) // 根據(jù)窗口數(shù)建立窗口顯示任務(wù)
OSTaskCreate(task0,(void*)0,&task0Stk[TaskStkLength- 1],3);
if(taskNum>1)
OSTaskCreate(task1,(void*)0,&task1Stk[TaskStkLength- 1],4);
...
while(1){if(reset) goto RESET; //reset 標(biāo)志為1, 程序復(fù)位
OSTimeDlyHMSM(0,0,1,0);}
}
窗口顯示任務(wù)用于實現(xiàn)各窗口內(nèi)容的顯示。它根據(jù)各窗口顯示方式的不同在其相應(yīng)area 區(qū)域中進(jìn)行下一幀數(shù)據(jù)的運算,然后調(diào)用areaToScreen()和screenToCpld()進(jìn)行顯示。在完成一幀數(shù)據(jù)的顯示后, 調(diào)用一次OSTimeDlyHMSM()使當(dāng)前任務(wù)進(jìn)入等待狀態(tài)同時進(jìn)行一次任務(wù)調(diào)度, 將系統(tǒng)控制權(quán)交給處于就緒狀態(tài)的窗口顯示任務(wù)中優(yōu)先級最高的那個, 由此完成窗口顯示任務(wù)之間的切換。我們也可以通過調(diào)整OSTimeDlyHMSM()的參數(shù)來改變各窗口相臨兩幀顯示信息之間的時間間隔, 從而可調(diào)整各窗口特技顯示的效果, 比如移動顯示的移動速度。下面是其中一個窗口顯示任務(wù)的程序演示:
void Task0(void *pdata){
pdata=pdata;窗口參數(shù)初始化;while(1){uint16 i;
for(i=0;i< 總幀數(shù);i++){下一幀數(shù)據(jù)的運算; // 在area 區(qū)域中進(jìn)行
areaToScreen(); // 將數(shù)據(jù)從area 讀出寫入screen
screenToCpld(); // 將screen 中相應(yīng)數(shù)據(jù)寫入顯存完成一幀數(shù)據(jù)的顯示OSTimeDlyHMSM(0,0,0,displaySpeed*20); // 任務(wù)調(diào)度
}
}
}
5 結(jié)束語
實現(xiàn)了單屏幕多窗口的任意位置顯示。使得屏幕顯示變得更加豐富靈活, 也使得很多以往只能使用同步控制器或者多個異步控制器的場合可用單塊異步控制器來替代, 從而降低了系統(tǒng)的成本。
(本文轉(zhuǎn)自電子工程世界:http://www.eeworld.com.cn/LED/2011/1226/article_6127.html)
導(dǎo)航:單基色LED顯示屏 | 雙基色LED顯示屏 | LED條屏 | 全彩LED顯示屏 | 室內(nèi)LED顯示屏 | LED廣告屏 | 室外LED顯示屏 | LED電子顯示屏 | LED幕墻 | LED顯示屏出租 | LED驅(qū)動 |
設(shè)為首頁
| 網(wǎng)站建設(shè) | 商務(wù)信息
| LED顯示屏資訊 |
本站動態(tài)
| 關(guān)于LED大屏網(wǎng)
| 網(wǎng)站RSS | 網(wǎng)站地圖
| 友情鏈接
本站實名:LED大屏網(wǎng) | LED大屏幕 | LED顯示屏 | 國際域名:www.rwq8y.cn 版權(quán)所有© 2004-2011 深圳中投網(wǎng)絡(luò)信息技術(shù)有限公司 郵箱:LED-100@3v.cn 客服QQ: 電話:+86-755-33019199(十二線) 傳真:+86-755-33010910 |