控制器多窗口显示的设计

来源:中山LED网 作者:--- 时间:2011-11-15 00:00

led

核心提示: 1、引言  以往的LED 异步控制器只能把一个屏幕作为一个完整的区域来进行显示, 或者简单的加上时间区域或游走字幕区域,这样对于

 1、引言

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

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

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

 扫描控制模块由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 的两个字节, 依此类推。
 

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

  4.3 缓存数据的组织方案:

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


   下面是任务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 大屏幕单屏幕多个窗口任意位置的显示, 并且可实现多窗口重叠显示及&LDQUO;画中画&RDQUO;等显示效果。

&NBSP;

相关文章 led

资讯排行榜

  • 每日排行
  • 每周排行
  • 每月排行

华强资讯微信号

关注方法:
· 使用微信扫一扫二维码
· 搜索微信号:华强微电子