微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LED大屏幕异步控制器多窗口显示的设计与实现

LED大屏幕异步控制器多窗口显示的设计与实现

时间:11-18 来源:互联网 点击:

reen 用于保存整屏幕的前一帧信息。

又由于MCU 对显存只能进行字操作, 并且多个窗口之间可能会出现区域重叠, 所以如果各窗口的特技运算都直接在screen 区域上进行, 则窗口重叠部分信息可能会发生混乱。因此如图5 所示, 也需要在缓存中为每个窗口划分出一块存储器空间(area 1, area 2, 。.., area n), 用于保存本窗口显示的前一帧信息。这样在特技运算时, 首先要在area 区域中对各窗口数据进行运算得到各窗口的下一帧信息, 然后将area 区域中数据写入该窗口在screen 区域中的相应地址以保存整屏幕最新一帧信息, 最后把screen 中相应数据写入显存从而完成显示。

4.4 软件设计:

基于上述方案, MCU 程序的设计变得非常简洁。程序结构如图6 所示, 控制器上电后, 首先进行系统初始化, 然后从FLASH 中读取屏参数, 进行参数初始化。接着建立任务TaskControl, TaskControl 拥有比各窗口显示任务都要高的优先级, 它主要用于对各窗口显示任务进行实时管理。每隔一段时间TaskControl 就要对reset 标志进行一次查询, 如果reset=1, 它会删除原先建立的各窗口显示任务, 然后从FLASH 中读取新的窗口个数, 依此建立新任务, 将每个窗口的显示交由单个窗口显示任务来控制。

下面是任务TaskControl 的程序演示:

void TaskControl(void *pdata){

uint8 taskNum;

pdata=pdata;

RESET:

reset=0; //reset 标志清零

for(taskNum=3;taskNum<18;taskNum++){ // 删除原先建立的窗口任务

OSTaskDel(taskNum); // 窗口显示任务优先级从3 开始}// 最多允许设置16 个窗口

taskNum=flashReadWord(AREA_NUM_ADDR);// 从FLASH中读取屏幕窗口个数

if(taskNum>0) // 根据窗口数建立窗口显示任务

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 标志为1, 程序复位

OSTimeDlyHMSM(0,0,1,0);}

}

窗口显示任务用于实现各窗口内容的显示。它根据各窗口显示方式的不同在其相应area 区域中进行下一帧数据的运算,然后调用areaToScreen()和screenToCpld()进行显示。在完成一帧数据的显示后, 调用一次OSTimeDlyHMSM()使当前任务进入等待状态同时进行一次任务调度, 将系统控制权交给处于就绪状态的窗口显示任务中优先级最高的那个, 由此完成窗口显示任务之间的切换。我们也可以通过调整OSTimeDlyHMSM()的参数来改变各窗口相临两帧显示信息之间的时间间隔, 从而可调整各窗口特技显示的效果, 比如移动显示的移动速度。下面是其中一个窗口显示任务的程序演示:

void Task0(void *pdata){

pdata=pdata;窗口参数初始化;while(1){uint16 i;

for(i=0;i< 总帧数;i++){下一帧数据的运算; // 在area 区域中进行

areaToScreen(); // 将数据从area 读出写入screen

screenToCpld(); // 将screen 中相应数据写入显存完成一帧数据的显示OSTimeDlyHMSM(0,0,0,displaySpeed*20); // 任务调度

}

}

}

5 结束语

充分利用32位微处理器的高性能和实时操作系统高效的任务调度算法, 实现了单屏幕多窗口的任意位置显示。使得屏幕显示变得更加丰富灵活, 也使得很多以往只能使用同步控制器或者多个异步控制器的场合可用单块异步控制器来替代, 从而降低了系统的成本。

本文作者创新点:实现了LED 大屏幕单屏幕多个窗口任意位置的显示, 并且可实现多窗口重叠显示及“画中画”等显示效果。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top