[原创] 基于LM3Sl图形驱动库开发之基本图形和图像的绘制

zhengjiewen   2010-11-22 23:27 楼主

基本图形和图像的绘制

上次,我和大家一起分享了如何为ti的图形驱动库编写底层驱动函数。

现在让我们来看一下如果使用ti提供的库来绘制最基本的字符图形,图形和图像。也就是我说的图形驱动库的第二层:图形基元层。

首先,在mian函数文件中我们要包含grlib.h这个头文件。在这个头文件里定义了一些图形绘制所需要的最基本的一些数据结构和一些宏函数。同时也有对图形绘制函数的声明。同时定义一个全局的结构体:tContext MyContext;

 tContext是一个图形绘制的上下文。其定义如下:

typedef struct

{

    //

    //! The size of this structure.

    //

    long lSize;

 

    //

    //! The screen onto which drawing operations are performed.

    //

    const tDisplay *pDisplay;

 

    //

    //! The clipping region to be used when drawing onto the screen.

    //

    tRectangle sClipRegion;

 

    //

    //! The color used to draw primitives onto the screen.

    //

    unsigned long ulForeground;

 

    //

    //! The background color used to draw primitives onto the screen.

    //

    unsigned long ulBackground;

 

    //

    //! The font used to render text onto the screen.

    //

    const tFont *pFont;

} 大家可以看出这个结构中就包含了绘制的显示驱动结构,区域,前景,背景,字体。这个结构在函数中我们会对他初始化,并做为绘制的一个依据。

进入主函数我们在完成系统时钟配置之后,我们要做的第一件事情就是初始化LCD,使LCD进入一个合理的工作状态。然后以一种颜色把lcd清屏。并设置好背光。在我的这个硬件条件下。代码如下:

  LCD_Init();//初始化LCD

  SSD1963_SetBacklight(255);//设置背光

  LCDClearScreen(DpyColorTranslate(&MyDisplay, ClrWhite));//清屏

大家注意一点就是,我使用的LCDRGB666方式,而TI的库则是以RGB888的数据格式提供给我们颜色数据。所以在调用LCDClearScreen这个函数的时候我们传入的颜色参数必须由我们编写的底层驱动函数来转换。否则LCD的颜色显示将会不正常。

上面一系列的初始化我们可以认为是使用TI图形库的一些先决条件。然后我们来初始化TI的库。

回复评论 (30)

初始化ti的库要调用的第一个函数就是GrContextInit(&MyContext, &MyDisplay);
其中MyContext就是绘制的上下文,MyDisplay是我们在底层驱动层中补充的一个结构,其定义如下:
const tDisplay MyDisplay=
{
sizeof(tDisplay),
0,
320,       // LCD width
240,       // LCD height
LCDPixelDraw,//画点函数
LCDPixelDrawMultiple, //像素点子像素调色函数
LCDlineDrawH,
LCDlineDrawV,
LCDRectFill,
LCDColorTranslate,
LCDFlush,
};
这个结构囊括了所有和硬件有关的驱动函数,详细说明请参考
https://bbs.eeworld.com.cn/thread-216616-1-1.html

GrContextInit这个函数实际上就是把MyDisplay里的东西copy到了MyContext里。传递显示指针,设置显示区域到LCD大小,前景,背景,字体全部清0.
比如说接下来我要在LCD上写上“hello eeworld!”这个字符串。那么我们首先要确认两点,用什么颜色?用什么字体?
对于这两个问题,大家可以看图形驱动库的最后几页,有颜色和字体的参考。颜色参考如下图:
点赞  2010-11-22 23:29



  1.jpg

这是ti的库提供的预定义的颜色。如我们要想在使用ClrLightCoral这个颜色的话,那么我们只需要用ti库提供的函数进行如下设置:



 

GrContextForegroundSet(&MyContext,ClrLightCoral);



 

这句实际就是把MyContext这个绘制上下文的前景颜色设置为ClrLightCoral



 

字体设置也是一样的道理。字体参考如下:



2.jpg  



 

如我想设置为g_sFontCmss36b这种字体,那么我们只需要写一句:



 

GrContextFontSet(&MyContext,
&g_sFontCmss36b);
这样就在MyContext这个上下文中设置好了绘制的字体。



 

 

[ 本帖最后由 zhengjiewen 于 2010-11-23 12:38 编辑 ]
点赞  2010-11-22 23:29

现在我们开始绘制。 调用函数void GrStringDraw(const tContext *pContext, const char *pcString, long lLength, long lX, long lY, unsigned long bOpaque); 形参意义如下: pContext:图形绘制的上下文。 *pcString,:要绘制的字符串指针 long lLength:要绘制的字符串长度,如果全部绘制的话那么设置为-1. long lX, long lY,为绘制的起始坐标。 bOpaque:这个参数决定了在绘制的时候是否绘制背景色。 首先说明一下,我这块lcd的坐标定义如下图: 3.jpg



 

以左上角为原点,向下为y轴,向右为x轴。现在我想把”hello eeworld!这个字符串打到lcd上起始坐标为10120.那么我们可以写上如下代码:GrStringDraw(&MyContext,"hello
eeworld !",-1,40,120,true);
在执行



 

这句后我们再看lcd显示状态:



  4.jpg

 



 

可以看到,“hello eeworld!”这句话以我们预定的颜色和字体出现在lcd上了,是不是很不可思意? 当然大家也可以看到了个问题,再字符的周围全是黑的。这是因为我们没有设置绘制背景色,默认就是黑色。可以通过代码:



 

GrContextBackgroundSet(&MyContext,ClrWhite);



 

来设置绘制背景色为白色。设置好了再次绘制就可以看到我们想要的结果了。如下图:



  5.jpg

[ 本帖最后由 zhengjiewen 于 2010-11-23 12:44 编辑 ]
点赞  2010-11-23 12:38

那么除了写字符,还可以画点,画线,画矩形,画填充矩形,画圆,画填充圆。画图象。这些都是图形基元层提供给大家的功能。函数的具体使用大家可以参考ti的图形驱动库文档,在这里我就不再详述。下面我就来调用这些函数在lcd上实现绘制图形。 int main() { tContext MyContext; tRectangle MyRect; SysCtlClockSet(SYSCTL_XTAL_8MHZ|\ SYSCTL_OSC_MAIN| SYSCTL_SYSDIV_4| SYSCTL_USE_PLL ); TheSysClock=SysCtlClockGet(); LCD_Init();//初始化LCD SSD1963_SetBacklight(255);//设置背光 LCDClearScreen(DpyColorTranslate(&MyDisplay,ClrWhite));//清屏 GrContextInit(&MyContext, &MyDisplay);//初始化绘制上下文 GrContextForegroundSet(&MyContext,ClrLightCoral); GrContextBackgroundSet(&MyContext,ClrWhite); GrContextFontSet(&MyContext, &g_sFontCmss36b); //写字符 GrStringDraw(&MyContext,"hello eeworld !",-1,40,120,true); //画线 GrLineDraw(&MyContext,0,0,320,20); //设置前景色为蓝色 GrContextForegroundSet(&MyContext,ClrBlue); //画线 GrLineDraw(&MyContext,0,20,320,40); //设置矩形大小 MyRect.sXMin = 50; MyRect.sYMin = 50; MyRect.sXMax = 200; MyRect.sYMax = 80; //设置前景色 GrContextForegroundSet(&MyContext,ClrNavy); GrRectFill(&MyContext, &MyRect); //设置前景色 GrContextForegroundSet(&MyContext,ClrDeepPink); MyRect.sXMin = 40; MyRect.sYMin = 60; MyRect.sXMax = 210; MyRect.sYMax = 90; //画矩形 GrRectDraw(&MyContext, &MyRect); //画填充矩形 GrCircleDraw(&MyContext,160,120,100); //设置前景色 GrContextForegroundSet(&MyContext,ClrLime); //画填充圆 GrCircleFill(&MyContext,250,60,50); //设置前景色 GrContextForegroundSet(&MyContext,ClrDarkOrange); //画填充圆 GrCircleFill(&MyContext,50,190,40); while(1); 最后实现的效果如下图:

图像196.jpg

以上就是如何使用TI的图形库来完成基本图形的绘制。代码请大家在附件中下载。下次我会和大家一起分享如何使用ti提供的工具来来生成我们自己想要的字体和图像。

睡午觉先。。

[ 本帖最后由 zhengjiewen 于 2010-11-23 12:58 编辑 ]

    test.rar (2010-11-23 12:58 上传)

    809.84 KB, 下载次数: 205

点赞  2010-11-23 12:45
点赞  2010-11-23 12:59
LZ啊,你怎么喜欢把图形库安装在不是默认的目录下,而且子目录你也修改了啊,很多C文件都没有的啊
点赞  2010-11-24 10:28
楼主:我编译了下你的程序,但是提示

Error[Li005]: no definition for "NumLeadingZeros" [referenced from D:\kkk\test\Debug\Obj\string.o]
Error[Li005]: no definition for "g_sFontCmss36b" [referenced from D:\kkk\test\Debug\Obj\main.o]
点赞  2010-11-24 11:42

回复 7楼 shzps 的帖子

不好意思,我平时就自己用。。没有注意这个问题,都用相对路径去找文件,下次一定注意
点赞  2010-11-24 12:50

回复 8楼 shzps 的帖子

这个因为这个工程是在我的电脑上编译的,可能到你的电脑上环境参数就不一样,你可以直接加lib文件。就没有这个问题了。
点赞  2010-11-24 12:53

还是有一个错误,找不出原因啊,怎么搞的,谁帮我下

可是如果是库添加的问题,其他都没问题的啊。
Warning[Pe223]: function "NumLeadingZeros" declared implicitly C:\Program Files\IAR Systems\Embedded Workbench 5.4 Evaluation_0\arm\lib\Luminary\grlib\string.c 268
Warning[Pe223]: function "NumLeadingZeros" declared implicitly C:\Program Files\IAR Systems\Embedded Workbench 5.4 Evaluation_0\arm\lib\Luminary\grlib\string.c 324
widget.c  
Linking
Error[Li005]: no definition for "NumLeadingZeros" [referenced from D:\kkk\KeyLed-test\Debug\Obj\string.o]
Error while running Linker
点赞  2010-11-24 16:03
楼猪辛苦了。。
芯谷SMT贴片加工厂
点赞  2010-11-24 17:23

回复 11楼 shzps 的帖子

你添加string,h这个头文件没有
?
点赞  2010-11-24 19:04

添加了啊,我回传上来

test1.rar (892.19 KB)
(下载次数: 14, 2010-11-24 20:54 上传)
点赞  2010-11-24 20:54
我只要使用GrStringDraw函数就有问题。
函数在STRTING.C中啊,为什么呢?
点赞  2010-11-26 16:19

回复 15楼 shzps 的帖子

这个你主要看你驱动函数是否补充正确
点赞  2010-11-26 17:59
LZ帮我一把吧,只要使用GrStringDraw函数就有出错,绝望了。一样的程序为什么啊?难道是IAR设置?找不出原因啊

[ 本帖最后由 shzps 于 2010-11-27 10:15 编辑 ]
点赞  2010-11-27 10:13

回复 17楼 shzps 的帖子

你什么硬件?
点赞  2010-11-28 17:08
我就把你的软件当下来编译不过啊
点赞  2010-11-28 17:41
先学会了放到硬件里面撒
点赞  2010-11-28 17:42
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复