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

[摘要]    介绍一种应用广泛的LED大屏幕异步控制器的设计方案。该系统采用高性能32位ARM微处理器为其控制核心,并且基于uc/OS-II进行软件设计。可实现单屏幕多窗口任意位置的显示,使得屏幕显示变得丰富灵活。
[关键词]     LED大屏幕; 多窗口显示; ARM微处理器; 异步控制器

1         引言:

以往的LED异步控制器只能把一个屏幕作为一个完整的区域来进行显示,或者简单的加上时间区域或游走字幕区域,这样对于用户来讲往往缺乏足够的灵活性,尤其在屏幕较大的时候。针对以上情况,本文提出了一款基于32位高性能ARM处理器和uc/OS-II的设计方案。它充分利用了uc/OS-II高效的多任务管理功能和ARM处理器强大的运算能力,实现了单屏幕多窗口的任意位置显示,使得显示内容变得更加丰富,显示方式变得更加灵活。

2     LED控制系统的工作原理:

典型的LED异步控制系统主要由PC应用软件、通信模块、数据处理模块、扫描控制模块、驱动模块和LED屏几部分组成,如图1所示。

首先,PC应用软件将文本或图片转化为具有特定格式的点阵信息。然后,通过通信模块将此点阵信息发送给数据处理模块。数据处理模块对这些点阵信息进行各种特技处理,最后通过扫描控制模块和驱动模块将画面在LED屏上进行正确显示。本文所指的LED异步控制器包括通信模块、数据处理模块和扫描控制模块三部分。

3           控制器软件部分的设计:

本控制器的硬件结构如图2所示。数据处理模块由MCU,一片SRAM和一片FLASH存储器组成。MCU选用PHILIPS的基于32位ARM内核的LPC2214处理器,它有着丰富的外围接口资源和强大的运算能力,是整个控制器的核心。SRAM作为MCU进行特技处理时的缓存使用。FLASH存储器用于存储点阵信息和一些必要的参数。

扫描控制模块由CPLD和显存组成。显存为一片SRAM,它用于保存当前显示的一帧点阵信息。CPLD通过地址总线和16位数据总线与MCU相连, 它把从MCU接收到的16位数据按指定地址写入显存,然后再按一定的寻址方式从显存中读出点阵信息进行扫描。MCU只能通过CPLD对显存进行以字(2byte)为单位的写操作。

通信模块包括以太网模块和串口通信模块,用于实现PC与控制器之间的RS232、RS485以及工业以太网通信。

4           控制器软件部分的设计:

为了实现单屏幕、多窗口任意位置的显示,软件部分我们基于uc/OS-II进行设计,这样可以充分利用操作系统高效的任务调度算法,将每个窗口的显示都交由单个任务来完成,从而极大地提高系统的运行速度和可靠性,并且使得程序的开发和扩展变得更加方便。

在进行具体的程序设计之前,首先要确定数据的组织方案。因为好的数据组织方案,对于程序编写来说往往可以达到事半功倍的效果。

4.1     显存的数据组织方案:

对于双色屏,一个像素点需要红、绿两位数据来描述。为了便于处理,我们将横向连续的8个像素点组成一个字(2byte)来进行存储,其中一个字节为红数据,一个字节为绿数据。数据存储顺序为从左到右,从上到下。如图3所示,假如屏幕宽度为160个像素点,显存起始地址为0x83000000,则屏幕第一行的前8个像素点映射到显存中地址为0x83000000和0x83000001的两个字节,第二行的前8个像素点映射到显存中地址为0x83000028和0x83000029的两个字节,依此类推。

4.2     点阵信息转化规则:

由于窗口大小可以任意设置,窗口的位置可以任意摆放。所以对于单个窗口而言,它在显存中的映射可能并非是字(2byte)对齐的。以图4为例,在一个大小为160(宽)×96(高)的屏幕上开设一个左上角坐标为(20,16),大小为86×47的窗口,则此窗口第一行的前4个像素点在显存中的映射为地址是0x83000282和0x83000283的两个字节的低4位,所以这个窗口在显存中的映射并不是字对齐的。由于MCU只能以字(2byte)为单位对显存进行操作,所以PC软件在对该窗口进行点阵信息转换时,如果直接对区域1(窗口的实际大小)进行转换存储,则在对该窗口进行特技处理时会存在大量的位运算,这样会大大降低运算效率,从而影响特技效果的显示,这样就很难满足用户对特技显示效果的要求。

为了解决上述问题,可以将区域1横向扩展成起点坐标为(16,16),大小为96×47的区域2。易知,区域2在显存中的映射是字对齐的。为了避免运算时的位操作,PC软件在对区域1进行点阵信息转换时,可按区域2来进行,只是需将区域1的扩展部分的数据全填为1。这样处理会牺牲掉一小部分FLASH存储器空间,但却可避免特技处理时大量的位运算,从而大大提高运算效率,因此这样做是值得的。

4.3     缓存数据的组织方案:

由于MCU只能对显存进行写操作,而在进行特技运算时,往往需要前一帧信息才能得到下一帧的信息。所以,首先,需要在缓存中划分出一块和显存大小相等,地址一一对应的区域screen用于保存整屏幕的前一帧信息。

     

  又由于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++){ &n