图形用户界面或图形用户接口(Graphical User Interface,GUI)是指采用图形方式显示的计算机操作环境用户接口。与早期计算机使用的命令行界面相比,图形界面对于用户来说更为简便易用。GUI的广泛应用是当今计算机发展的重大成就之一,它极大地方便了非用户的使用人们从此不再需要死记硬背大量的命令,取而代之的是可用用通过窗口、菜单、按键等方式来方便地进行操作。而嵌入式GUI具有下面几个方面的基本要求:轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点。图形用户界面的应用范围很广泛,如自动取款机ATM,汽车导航、媒体播放器、游戏机等等,一般操作简捷,直观。苹果公司的iPhone手机还有装有多手指操作系统。
当前比较流行的GUI主要有MicroWindows、MiniGUI、QT/Embedded、OpenGUI等,普遍采用客户/服务器结构、多线程概念,主要用于嵌入式Linux系统中。本文介绍的μC/GUI是Micrium公司开发的一个为嵌入式应用软件设计的通用图形软件库。它为任何一个使用图形LCD的应用提供一个有效的不依赖于处理器和LCD控制器的图形用户接口。它能工作于单任务或多任务的系统环境下。μC/GUI是嵌入式应用中通用的图形软件,是为带LCD的图形应用系统提供高效的图形用户接口而设计的,它不依赖于处理器和LCD控制器。μC/GUI在多任务环境下工作与在单任务环境下工作性能同样卓越,任何尺寸大小的显示设备,不管是物理的或是虚拟的,只要具备LCD控制器和处理器,都可以运用μC/GUI.μC/GUI产品包中包含有所有的源代码。实际上,在所有的嵌入式图形用户接口中,μC/GUI提供的源代码是整洁统一的。μC/GUI提供的所有服务都以该模块相关的前缀开始(如:GUI,WM),这将易于理解应用程序中与μC/GUI相关的函数。μC/GUI适用于所有处理器,与那些需要C++编译器的GUI不同的是,μC/GUI完全用标准C编写。
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.
在液晶显示模块中配备有显示存储器(RAM),T6963C可控制64K.该存储器经设置指令设置(区域、方式)后,存储器中被设置的空间内的每一个"位"都与液晶屏上的一个像素(点)相对应,而"位"的二值性就表示液晶屏上像素是否"显现".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仿真的结果。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。