5045|10

1291

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

【LPC54100】移植TI的图形库 [复制链接]

本帖最后由 强仔00001 于 2015-4-19 12:45 编辑

前几天一直了UCGUI的图形库部分,今天又接着把TIgrlib图形库移植到了LPC54102套件中。显示效果还可以。
图形库其实都是都是由底层的画点,画线等这些基本函数组成。大家以前上数学都有学过点成线,线成面这些的,而图形库也是基于此的。
TI的图形库分3层,如下图:
我们只需要修改显示驱动层即可。上面两层都是在调用最低层的驱动层。
显示驱动层函数要我们重写,不是很多,就只有几个函数而已:

如下截图:
分别是:
画点函数:void PixelDraw(void *pvDisplayData, long x, long y, unsigned longcolor)
画多点的函数:void PixelDrawMultiple(void *pvDisplayData,
                                                        longx,
                                                        longy,
                                                        longx0,
                                                        longlCount,
                                                        longBPP,
                                                        constunsigned char  *pucData,
                                                        constunsigned char  *pucPalette)
{        
画横线的函数:void LineDrawH (void *pvDisplayData,long x1,long x2, long y,unsigned long color)
画竖线的函数:void LineDrawH (void *pvDisplayData,long x1,long x2, long y,unsigned long color)
矩形填充函数:void RectFill (void *pvDisplayData, const tRectangle *pRect,unsigned long ulValue)
以下是我重写的源代码,我用的屏幕是2.4寸的TFT屏,主控是ILI9341SPI通信的。
画点函数:
void PixelDraw(void *pvDisplayData, long x,long y, unsigned long color)
{
         TFT_setXY(x,y);
         TFT_sendData16(color);
}
画线横线的函数:
void LineDrawH (void *pvDisplayData,longx1,long x2, long y, unsigned long color)
{
         int32_ti = 0;
         int32_tlength = x2 - x1;
         TFT_setCol(x1,x2);
         TFT_setPage(y,y);
         TFT_sendCMD(0x2c);

         TFT_DC_HIGH;
         //TFT_CS_LOW;

         for(; i < length; i++)
         {
                   SPI_transfer8(color>> 8);
                   SPI_transfer8(color& 0xff);
         }

         //TFT_CS_HIGH;   

}
画竖线的函数:
void LineDrawV (void *pvDisplayData,longx,long y1, long y2, unsigned long color)
{
int32_t i = 0;
         int32_tlength = y2 - y1;
         TFT_setCol(x,x);
         TFT_setPage(y1,y2);
         TFT_sendCMD(0x2c);
         TFT_DC_HIGH;
         //TFT_CS_LOW;


         for(; i < length; i++)
         {
                   SPI_transfer8(color>> 8);
                   SPI_transfer8(color& 0xff);
         }

         //TFT_CS_HIGH;   
}        
填充矩形的函数:
void RectFill (void *pvDisplayData, consttRectangle *pRect, unsigned long ulValue)
{

         uint32_tuY;
         for(uY = pRect->sYMin; uY <= pRect->sYMax; uY++)
         {
                   LineDrawH(0,pRect->sXMin, pRect->sXMax, uY, ulValue);
         }

}
最后的函数有些长的画多点的函数:
void PixelDrawMultiple(void *pvDisplayData,
                                                        longx,
                                                        longy,
                                                        longx0,
                                                        longlCount,
                                                        longBPP,
                                                        constunsigned char  *pucData,
                                                        constunsigned char  *pucPalette)
{        
         uint32_tulPixel = 0;
         uint32_tulColor = 0;
         TFT_setCol(x,DISPLAY_WIDTH);
         TFT_setPage(y,DISPLAY_HEIGHT);
         TFT_sendCMD(0x2c);



         if(BPP == 1)
         {
                   //1 bit per pixel in pucData
                   //lX0 is the index of the bit processed within a byte
                   //pucPalette holds the pre-translated 32bit display color
                   while(lCount)
                   {
                            ulPixel= *pucData++;

                            while(lCount && x0 < 8) // whilethere are pixels in this byte
                            {
                                     ulColor= ((uint32_t *) pucPalette)[ulPixel & 1];// retrieve already translatedcolor
                                     TFT_sendData16(ulColor);

                                     lCount--;            // processed another pixel
                                     x0++;                           // done with this bit
                                     ulPixel>>= 1;   // prepare next bit
                            }

                            x0= 0;      // process next byte, reset bitcounter
                   }
         }
         elseif (BPP == 4)
         {
                   //4 bits per pixel in pucData
                   //lX0 holds 0/1 to indicate 4-bit nibble within byte
                   //pucPalette holds untranslated 24 bit color
                   while(lCount)
                   {
                            if(x0 == 0)         // read first nibble
                            {
                                     ulPixel= *pucData >> 4;
                                     x0= 1;      // set index to second nibble
                            }
                            else
                            {                                    // readsecond nibble
                                     ulPixel= *pucData & 0x0f;
                                     pucData++;//increase byte pointer as we're done reading this byte
                                     x0= 0;      // set index to first nibble
                            }

                            ulColor= *(uint32_t *) (pucPalette + (ulPixel * 3)) & 0x00ffffff;// retrieve 24bit color
                            TFT_sendData16(COLOR24TO16BIT(ulColor));//translate and write to display

                            lCount--;  // processed another pixel
                   }
         }
         elseif (BPP == 8)
         {
                   //8 bits per pixel in pucData
                   //pucPalette holds untranslated 24 bit color
                   while(lCount)
                   {
                            ulPixel= *pucData++;               // read pixel
                            ulColor= *(uint32_t *) (pucPalette + (ulPixel * 3)) & 0x00ffffff;// retrieve 24bit color
                            TFT_sendData16(COLOR24TO16BIT(ulColor));//translate and write to display
                            lCount--;  // processed another pixel
                   }
         }
         elseif (BPP == 16)
         {
                   //16 bits per pixel
                   //Pixel is in 16bit color, 5R 6G 5B format
                   //No color translation needed for this display
                   while(lCount)
                   {
                            ulPixel= *((uint16_t *) pucData);
                            TFT_sendData16(ulPixel);
                            pucData+= 2;
                            lCount--;
                   }
         }
}
如果你的屏幕是控制芯片是其他的,可以拿厂家提供的底层驱动文件整合到TI的图形库的底层驱动中。
ti的图像库可以支持多种文件格式的输出到屏幕显示,还有画图像的函数。我也是参考坛友的帖子进行操作的。TI的图形库有个工具可以把图像转换成c的代码。只不过只支持pnm后缀的图片格式。我们可以用图像编辑软件转换格式。我使用了GIMP的软件进行转换。
具体在目录是StellarisWare\tools\bin

首先我们打开GMIP软件,然后可以直接把图片拖到编辑区,然后设置导出的参数,步奏如下:
软件默认转化后的文件放值得位置是在图片所在的目录:
软件默认是第一个选项,但这样生成的图片数据太大,转换软件会爆出:颜色太多的信息而导致转换失败。所以我就选择了网页优化版。

我们启动cmd,把目录切换到我们工具所在的位置,这些windows的命令自行百度去。我这里就不多说了,都是常用的命令。
然后打上pnmtoc -c image.pnm > image.cimage是你图片的文件名,回车后就会生成一个c的文本。
以下是我的测试图片:
图片是p的
源代码分享:
这个工程包括了GUI和TI的grlib这两个图形库。
我就收两个芯币
myproject.zip (14.83 MB, 下载次数: 41, 售价: 2 分芯积分)


myproject.zip (14.83 MB, 下载次数: 41, 售价: 2 分芯积分)

大家用到TI的图形库,可以参考我们另外一位坛友写的帖子:
https://bbs.eeworld.com.cn/thread-220451-1-1.html


QQ截图20150419112426.png (188.96 KB, 下载次数: 0)

QQ截图20150419112426.png

QQ截图20150419112626.png (102.71 KB, 下载次数: 0)

QQ截图20150419112626.png
此帖出自NXP MCU论坛

最新回复

这个图形库是开放源码的吗?  详情 回复 发表于 2015-9-7 17:00

赞赏

1

查看全部赞赏

点赞 关注(1)
 

回复
举报

4996

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
很不错啊。
此帖出自NXP MCU论坛

点评

有时间把触摸移植上去  详情 回复 发表于 2015-4-21 12:18
 
个人签名我的博客
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

板凳
 

有时间把触摸移植上去
此帖出自NXP MCU论坛
 
 
 

回复

337

帖子

2

TA的资源

纯净的硅(初级)

4
 
准备看看这个,也移植一下
此帖出自NXP MCU论坛

点评

我也有加快进度了  详情 回复 发表于 2015-5-6 23:47
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

5
 
我爱下载 发表于 2015-5-6 09:43
准备看看这个,也移植一下

我也有加快进度了
此帖出自NXP MCU论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(初级)

6
 
mark!
此帖出自NXP MCU论坛

点评

最近有点忙,更新慢了  详情 回复 发表于 2015-5-13 20:35
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

7
 

最近有点忙,更新慢了
此帖出自NXP MCU论坛
 
 
 

回复

1891

帖子

2

TA的资源

纯净的硅(中级)

8
 
不错。。。
此帖出自NXP MCU论坛

点评

谢谢支持,这个图形库还不错,很精简  详情 回复 发表于 2015-9-4 23:12
 
个人签名
分享铸就美好未来。。。




 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

9
 

谢谢支持,这个图形库还不错,很精简
此帖出自NXP MCU论坛
 
 
 

回复

157

帖子

3

TA的资源

一粒金砂(中级)

10
 
这个图形库是开放源码的吗?
此帖出自NXP MCU论坛

点评

源代码是开放的。可以直接用源代码,也可以直接调用生成的keil的.lib或者IAR的.a库  详情 回复 发表于 2015-9-7 22:49
 
个人签名千重雪  染蒹葭  谁  眉间砂  步步生莲花
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

11
 
apleilx 发表于 2015-9-7 17:00
这个图形库是开放源码的吗?

源代码是开放的。可以直接用源代码,也可以直接调用生成的keil的.lib或者IAR的.a库
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表