《电子技术应用》
您所在的位置:首页 > 其他 > 设计应用 > μC/GUI T6963C LCD控制器驱动移植及矢量汉字显示
μC/GUI T6963C LCD控制器驱动移植及矢量汉字显示
严龙军1,熊文卓2
摘要: 介绍了Micrium公司开发的一个为嵌入式应用软件设计的通用图形软件库μC/GUI,提出了在μC/GUI中T6963C LCD控制器驱动移植及矢量汉字显示的实现方法。该方法为μC/GUI的其他LCD控制器驱动移植及字库实现提供了参考,同时为利用μC/GUI实现更为复杂的图形用户界面打下了基础。
Abstract:
Key words :

  摘 要:介绍了Micrium公司开发的一个为嵌入式应用软件设计的通用图形软件库μC/GUI,提出了在μC/GUI中T6963C LCD控制器驱动移植及矢量汉字显示的实现方法。该方法为μC/GUI的其他LCD控制器驱动移植及字库实现提供了参考,同时为利用μC/GUI实现更为复杂的图形用户界面打下了基础。
  关键词:图形用户界面;矢量汉字;液晶控制器

   在众多嵌入式系统中,如手机、PDA和数字机顶盒(STB)等,系统使用者往往要求具有菜单、窗口和按钮等图形元素的人机交互界面UI(User Interface),而系统设计和实现者又迫切需要系统UI模块开发的支撑平台。该支撑平台以应用开发组件(Application Development Component)的方式来有效提高嵌入式应用的开发效率,这种组件被称为嵌入式图形用户界面(GUI)。
  当前比较流行的GUI主要有MicroWindows、MiniGUI、QT/Embedded、OpenGUI等,普遍采用客户/服务器结构、多线程概念,主要用于嵌入式Linux系统中。本文介绍的μC/GUI是Micrium公司开发的一个为嵌入式应用软件设计的通用图形软件库。它为任何一个使用图形LCD的应用提供一个有效的不依赖于处理器和LCD控制器的图形用户接口。它能工作于单任务或多任务的系统环境下。μC/GUI适用于使用任何LCD控制器和CPU的任何尺寸的物理和虚拟显示。同时,μC/GUI适用于所有的CPU,因为它是由100%的ANSI的C语言编写的。而且,μC/GUI适合于大多数使用黑白/彩色LCD的应用程序。它有一个很好的颜色管理器,允许它处理灰阶。μC/GUI还提供一个可扩展的2D图形库和一个视窗管理器,用很少的RAM就能支持显示窗口。更重要的是μC/GUI开放源代码,以便了解更多GUI实现的具体细节。
1 μC/GUI的主要特点
  (1)一般特点:适合于任何8/16/32/64位CPU,只需要有一个ANSIC兼容的编译器;适合于任何控制器支持(如果有合适的驱动程序)的任何单色/灰度级/彩色LCD;显示屏大小可配置;使用配置宏定义各种接口;大小和速度都优化过的函数;清晰的结构;支持虚拟显示,虚拟显示能够比实际显示表现更大尺寸的内容。
  (2)在图形库方面:支持不同色深的位图;有效的位图转换器;绝对没有浮点运算;快速线/点绘制(不使用浮点指令);快速的圆和多边形绘制。
  (3)在字体方面:支持多种不同的字体如4×6、6×8、6×9、8×8、8×9、8×16、24×32等,支持像素高为8、10、13、16等比例字体;可以定义新字体,而且很容易被程序使用;只有实际被应用程序用到的字体才会真正被链接到目标文件,这样可以节省ROM的使用;字体在横向(X轴)和纵向(Y轴)都可以自由伸缩。
  (4)在字符串/值输出函数方面:具有能够显示二进制、十进制、十六进制和任何字体的值的函数。
  (5)在窗口管理器WM方面:包括可裁减的完全的窗口支持,改写超出一个窗口的区域是不可行的;支持回调函数;WM使用极少的内存,例如每个窗口大约20 B。
2 T6963C LCD控制器驱动移植
  作为一个通用的图形函数软件库,μC/GUI能够适用于各种LCD控制器和LCD,但是,针对具体的目标系统,由于LCD及其控制器的访问方式不同,以及显示缓存的访问方式不同,还是要做具体的移植工作。对于内存映射的LCD控制器,只需要在LCDConf.h文件中设置LCD的访问函数;对于端口/缓存模式的LCD控制器,必须在LCD_X.C文件中定义访问LCD的接口函数。μC/GUI的移植主要是设置子文件夹config中的头文件,其中包括LCD宏(定义LCD显示屏的属性)和LCD控制器宏的设置(定义如何访问LCD控制器)。
  LCD控制器有两种基本类型的总线接口:完全和简单的总线接口。大多数小一些的显示屏(通常最大为240×128或320×240)的LCD控制器使用简单总线接口与CPU连接。对于简单总线,只有一个地址位(通常是A0)连接到LCD控制器。这样的控制器比较慢,硬件设计者可以将其连接到I/O脚而不是地址总线。图1为带有简单总线的LCD控制器的方框图。

  用于简单总线接口控制器的宏:
  (1)LCD_READ_A0在A0(C/D)引脚为低电平时,从LCD控制器读取1B;
  (2)LCD_READ_A1在A0(C/D)引脚为高电平时,从LCD控制器读取1B;
  (3)LCD_WRITE_A0在A0(C/D)引脚为低电平时,向LCD控制器写1B;
  (4)LCD_WRITE_A1 在A0(C/D)引脚为高电平时,向LCD控制器写1B。
  液晶显示驱动控制器T6963C,是日本东芝公司的产品,目前被广泛应用于内置控制器型液晶显示模块。T6963C的最大特点是具有独特的硬件初始值设置功能,显示驱动所需的参数如占空比系数、驱动传输的字节数/行及字符的字体选择等均有引脚电平设置,这样T6963C的初始化在上电时就已经基本设置完成,软件操作的主要精力就可全部用于显示画面的设计。
  T6963C属于具有简单总线接口的LCD驱动控制器。以Philips公司的LPC2104 ARM芯片为CPU控制T6963C为例来说明具体的移植过程。LPC2104的P0.0~P0.7与T6963C的D0~D7相连,P0.8与WR相连,P0.9与RD相连,P0.10与C/D相连。根据T6963C的时序图(如图2所示),可以很方便地修改LCD底层驱动函数。

 

  #define wr 1<<8
  #define rd 1<<9
  #define cd 1<<10
  /*读取T6963状态字*/
  uint8 LCD_READ_A1(void)
  {
  uint8 temp;
  IODIR=0x000000700;
                   //设置P0.8~P0.10为输出,P0.0~P0.7为输入
  IOSET=cd;               //把C/D引脚置位
  IOCLR=rd;        //把RD引脚置低电平
  temp=IOPIN;          //读数据总线上的数
  IOSET=rd;               //把RD引脚置位
  return(temp);
  }
  /*向T6963C写一个字节(控制指令)*/
  void LCD_WRITE_A1(int Byte)
  {
  IODIR=0x000007ff;             //设置P0.0~P0.10为输出
  IOSET=cd;               //把C/D引脚置位
  IOCLR=0xff;                            //清除数据总线上数据
  IOCLR=wr;                               //把WR引脚置低电平
  IOSET=Byte;   //把要发送的控制指令放数据总线上
  IOSET=wr;            //把WR引脚置位
  }
  /*向T6963C写一个字节(数据)*/
  void LCD_WRITE_A0(int Byte)
  {
  IODIR=0x000007ff;                //设置P0.0~P0.10为输出
  IOCLR=cd;        把C/D引脚置低电平
  IOCLR=0xff;     //清除数据总线上数据
  IOCLR=wr;     //把WR引脚置低电平
  IOSET=Byte;           //把要发送的数据放数据总线上
  IOSET=wr;              //把WR引脚置位
  }
  图3为T6963C指令写入的流程图,对该流程图的理解是通过CPU向T6963C发送指令的关键。当计算机写指令或一次读/写数据时,S0和S1要同时有效,即“准备好”状态。对T6963C的软件操作每一次之前都要进行判“忙”,只有在不“忙”的状态下CPU对T6963C的操作才有效。

 

  /*判定S0和S1的状态,“忙”即等待*/
  #define LCD_WAIT() while ((LCD_READ_A1()&3)!=3)
  /*写命令宏*/
  #define LCD_WRITECMD(cmd)     
  { LCD_WAIT(); LCD_WRITECMD0(cmd); }
  /*写数据宏*/
  #define LCD_WRITEDATA(Data)   
  { LCD_WAIT(); LCD_WRITEDATA0(Data);}
  /*T6963C初始化*/
  void  LCD_T6963_Init(void)
  {
  /*设置文本显示区首地址*/
  LCD_WRITEDATA(0x00) ;                    //参数1
  LCD_WRITEDATA(0x00) ;         //参数2
  LCD_WRITECMD(0x40) ;              //指令代码
  /*设置文本显示区宽度*/
  LCD_WRITEDATA(0x14) ;      //一行显示所占的字节数
  LCD_WRITEDATA(0x00) ;
  LCD_WRITECMD(0x41) ;
  /*设置图形显示区首地址*/
  LCD_WRITEDATA(0x40) ;       //低字节
  LCD_WRITEDATA(0x01) ;                  //高字节
  LCD_WRITECMD(0x42) ;
  /*设置图形显示区宽度*/
  LCD_WRITEDATA(0x14) ; //一行显示所占的字节数
  LCD_WRITEDATA(0x00) ;
  LCD_WRITECMD(0x43) ;
  /*显示开关设置开文本和图形显示*/
  LCD_WRITECMD(0x9c) ;
  /*显示方式设置逻辑或合成*/
  LCD_WRITECMD(0x80) ;
  /*设置光标显示形状*/
  LCD_WRITECMD(0xa1) ;
  }
  在LCDConf.h中,可以根据实际情况更改设置,如:
  #define LCD_XSIZE  (160)
                   // LCD x坐标方向的分辨率
  #define LCD_YSIZE (128)
                   // LCD y坐标方向的分辨率
  #define LCD_CONTROLLER (6963)
                      //LCD控制器型号
  #define LCD_BITSPERPIXEL (1)
                     //LCD每像素的位数
3  在μC/GUI中矢量汉字的显示
  μC/GUI中字体的显示是通过查找字模的方式实现的。字体库中的每一个字母都有其对应的字模。所有的字母的字模由GUI_FONT和GUI_FONT_PROP这2个结构体来进行统一管理。GUI_FONT结构体中定义了该字母的点阵大小(比如16×16或者8×8)和GUI_FONT_PROP结构体的入口地址。GUI_FONT_PROP这个结构体建立了字库中字母编码(比如字母A在ASCII中的字母编码为33)和字模数据存放地址的映像。GUI_FONT_PROP中pNext指针指向下一个GUI_FONT_PROP数据的入口地址,这为解决在字母编码不连续的情况下,保证字模数据在程序段的存储连续这一问题提供了一个良好的解决方案。设计人员可以定义多个GUI_FONT_PROP结构,只要使上一个结构体的pNext指针指向下一个GUI_FONT_PROP结构体,并且保证该指针最终指向零地址空间即可。掌握这一原理后,可以方便地制作自己的汉字字库。
  利用μC/GUI汉字库生成器可以生成指定字体矢量汉字的字模文件。该文件与μC/GUI字库文件格式相同,但是该文件包含所有GB2312中的汉字,字号越大文件会变得很大,只需找出自己需要的汉字字模,并按μC/GUI中字体文件的格式得到自己的字体文件,这个过程可以编程实现。图4是用Proteus仿真的结果。
本文通过对μC/GUI T6963C LCD控制器驱动移植及μC/GUI中实现矢量汉字的介绍,为μC/GUI其他LCD控制器驱动的移植提供了参考,同时也为利用μC/GUI实现更为复杂的图形用户界面打下了基础。

 

 

参考文献
[1] 王孝平.嵌入式GUI性能评测[D].四川:电子科技大学,2007.
[2] 陈钦梧,张泉,周林峰.μC/GUI在博创ARM300-S上的移植[J].计算机工程与设计,2006,27(19):3697-3700.
[3] 张磊,江海河,储焰南.基于μC/OS-II的嵌入式GUI研究与应用[J].嵌入式操作系统应用,2008,24(6-2):50-52.
[4] T6963C数据手册.日本东芝公司.
[5] μC/GUI user manual.Micrium Technologies Corporation.

此内容为AET网站原创,未经授权禁止转载。