参加了ti的电子设计大赛,用ti的图形驱动库做了一个lcd的驱动,ti那个图形驱动库分了三层:底层驱动层,图形基元层,小工具层,现在自己只做了两层,底层驱动层,图形基元层。还没有做到小工具层,感觉那个要复杂一些,看到坛子里有人发出stellaris共学计划,不知道自己学习ti的图形驱动库算不算,呵呵。传两张图上来,小小show一下
看了七楼的建议,我把我自己写的一个源代码传上来,希望对大家有帮助。
看到十楼的那位兄弟的回贴,实在是言重了,自己对运用TI这个库驱动LCD也只是略知一二,既然如此,那我就给大家讲讲我是怎么用ti的图形驱动库来驱动这个LCD的,我们大家一起共同进步!
ti的这个图形库自下向上分为三层displaydriverlayer,graphicsprimitiveslayer(图形基元层),widgetlayer(小工具层),我们要做的就是写Thedisplaydriverlayer。也就是底层驱动层,写好了这一层,当你调用上面的graphicsprimitiveslayer画一些基本的图形的时候(如画圆),那么中间的那一个graphicsprimitiveslayer(图形基元层)就会自己去调用displaydriverlayer(显示驱动层)里的我们自己编写的函数(画点)来完成当前的绘制工作。同理,最上面的widgetlayer(小工具层)也是通过调用graphicsprimitiveslayer(图形基元层)来实现更加复杂的图形,如边栏,滑调,画线。所以就是为什么我说ti这个图是自下向上的原因。那我们要怎么来使用这个库呢?
首先,大家把LCD联上ti的m3,可以用IO,也可以用总线,当然我是用的IO,然后跟据lcd驱动IC来配置里面的各种寄存器,让LCD做好显示的准备工作,我传的那份LCDDisplay那个工程里大家可以进LCDFunc.c那个源文件去看一下,其中的LCD_Init()这个函数就完成了这个工作。所以,在LCD显示部分,他总是最先被调用的。LCD显示的准备工作做好了,大家可以编写一些最底层的图形函数。大家看下我传上来的ti图形驱动库的文档,ti的库提供了一个结构tDisplay。这个结构是需要我们去补充的,只要你补充好了这个结构,基本上就万事大吉了。在这个结构里基本上都是函数指针。指向了我们要补充的基本图形函数,如画点,画平水线,画竖直线,画填充矩形。大家在编写这些函数的时候要注意,一定要按照他的要求去编写,如要编写一个画水平线的函数,那么这个函数的形参和返回值都要和这个库的要求匹配起来,顺序不要搞反了,如形参传递的顺序。但是函数名称大家可以随便写,只要你在这个结构里的位置放对就好。因为他传递的只是一个函数指针,只要让库正确的找到那个函数就OK。大家把这个结构搞定后,基本就比交顺利了。那么,我们现在来看一个实际的例子。
#include <SystemInit.h>
#include <grlib.h>
tRectangle MyRect;
const tDisplay MyDisplay=
{
sizeof(tDisplay),
0,
320, // LCD width
240, // LCD height
LCDPixelDraw,
(void*)0,
LCDlineDrawH,
LCDlineDrawV,
LCDRectFill,
LCDColorTranslate,
LCDFlush,
};
tContext MyContext;
void main()
{
CLOCK_Init();//时钟初始化
GPIO_Init();//GPIO初始化
LCD_Init();//LCD初始化
LCDClearScreen(BLACK);//清屏
GrContextInit(&MyContext, &MyDisplay);//初始化图形描绘上下文
TiLogDraw(); //画LOG
//**********************************************************************
//显示菜单
//**********************************************************************
//
// 为LCD底部填充一个的紫罗兰红的矩形
//
MyRect.sXMin = 0;
MyRect.sYMin = 217;
MyRect.sXMax = GrContextDpyWidthGet(&MyContext) - 1;
MyRect.sYMax = 240;
GrContextForegroundSet(&MyContext, ClrMediumVioletRed);
GrRectFill(&MyContext, &MyRect);
//
// 为这个矩形放一个白色的边框
//
GrContextForegroundSet(&MyContext, ClrWhite);
GrRectDraw(&MyContext, &MyRect);
//
// 放置这个应用程序的名字在矩形之中,Cm20字体,白色
//
GrContextFontSet(&MyContext, &g_sFontCm20);
GrStringDrawCentered(&MyContext, "Grlib test demo", -1,
GrContextDpyWidthGet(&MyContext) / 2, 227, 0);
//写LCD中用cm48i字体,绿黄色写上“Hello,eeworld !”
GrContextForegroundSet(&MyContext, ClrLime);
GrContextFontSet(&MyContext, &g_sFontCm48i);
GrStringDrawCentered(&MyContext, "Hello eeworld !", -1,
GrContextDpyWidthGet(&MyContext) / 2, 120, 0);
while(true);
}
首先我定义了一个tDisplay形的结构 Mydisplay,传入了LCD的大小和各种底层函数。我用的时候就用Mydisplay这个结构。当然,你必须还要定义一个tContext形的结构。我的为 MyContext,大家可以去看文档,这个结构中包含了绘制的上下文,如你要用什么字体,什么背景,什么前景,在这个结构中都有定义,到时我们在绘制过程之中,如需要改变我们绘制的条件,只需要改变这个结构中的成员的值即可。如我们在写字的时候,我们想用大点儿的字体,那么,只需要改变其中ulForeground这个参数就可以了,当然,这些事情不用我们手工去一个一个的改,ti的图形驱动库提供了具体的函数,你只需要调用函数即可,如我们想要改字体,那么只需要调用GrContextFontSet这个函数,传入你正在使用的描绘上下文(我的为MyContext),和你要设置的字体即可。那么你在下次绘制的时候,只要你用MyContext这个上下文去绘制,那么那些字体正是你上次写入的字体,是不是很在意思?改颜色也是一个道理。其中字体和颜色大字可以去ti的文档的最后几页看,有样板在,你喜欢那个就写那个,非常简单。
在这个程序中,我们先初始化LCD,然后把整屏刷黑。就可以开始图形库操作了,首先你必须调用GrContextInit这个函数,对图形库进行初使化,你就可以开始绘制工作了。具体绘制过程大家可以对照ti图形驱动库的说明文档,一个一个的看这些函数实现什么功能,需要传入那些参数,我相信大家很快就可以搞明白。最后附上这个程序的最终显示结果,自己还是一个生学,买不起相机,这次比赛用的同学的,但是同学回家了,所以用自己手机拍的,大家将就一下吧。
[
本帖最后由 zhengjiewen 于 2010-8-1 13:24 编辑 ]