圖形庫其實(shí)都是都是由底層的畫點(diǎn),畫線等這些基本函數(shù)組成。大家以前上數(shù)學(xué)都有學(xué)過點(diǎn)成線,線成面這些的,而圖形庫也是基于此的。
TI的圖形庫分3層,如下圖:
我們只需要修改顯示驅(qū)動層即可。上面兩層都是在調(diào)用最低層的驅(qū)動層。
顯示驅(qū)動層函數(shù)要我們重寫,不是很多,就只有幾個函數(shù)而已:
如下截圖:
分別是:
畫點(diǎn)函數(shù):void PixelDraw(void *pvDisplayData, long x, long y, unsigned longcolor);
畫多點(diǎn)的函數(shù):void PixelDrawMultiple(void *pvDisplayData,
longx,
longy,
longx0,
longlCount,
longBPP,
constunsigned char *pucData,
constunsigned char *pucPalette)
{
畫橫線的函數(shù):void LineDrawH (void *pvDisplayData,long x1,long x2, long y,unsigned long color);
畫豎線的函數(shù):void LineDrawH (void *pvDisplayData,long x1,long x2, long y,unsigned long color);
矩形填充函數(shù):void RectFill (void *pvDisplayData, const tRectangle *pRect,unsigned long ulValue);
以下是我重寫的源代碼,我用的屏幕是2.4寸的TFT屏,主控是ILI9341,SPI通信的。
畫點(diǎn)函數(shù):
void PixelDraw(void *pvDisplayData, long x,long y, unsigned long color)
{
TFT_setXY(x,y);
TFT_sendData16(color);
}
畫線橫線的函數(shù):
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;
}
畫豎線的函數(shù):
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;
}
填充矩形的函數(shù):
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);
}
}
最后的函數(shù)有些長的畫多點(diǎn)的函數(shù):
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--;
}
}
}
如果你的屏幕是控制芯片是其他的,可以拿廠家提供的底層驅(qū)動文件整合到TI的圖形庫的底層驅(qū)動中。
這次使用了TI圖形庫的庫文件grlib.a,我加上grlib.h的頭文件即可。工程結(jié)構(gòu)如下圖:
ti的圖像庫可以支持多種文件格式的輸出到屏幕顯示,還有畫圖像的函數(shù)。我也是參考壇友的帖子進(jìn)行操作的。TI的圖形庫有個工具可以把圖像轉(zhuǎn)換成c的代碼。只不過只支持pnm后綴的圖片格式。我們可以用圖像編輯軟件轉(zhuǎn)換格式。我使用了GIMP的軟件進(jìn)行轉(zhuǎn)換。
具體在目錄是StellarisWare oolsin;
首先我們打開GMIP軟件,然后可以直接把圖片拖到編輯區(qū),然后設(shè)置導(dǎo)出的參數(shù),步奏如下:
軟件默認(rèn)轉(zhuǎn)化后的文件放值得位置是在圖片所在的目錄:
軟件默認(rèn)是第一個選項(xiàng),但這樣生成的圖片數(shù)據(jù)太大,轉(zhuǎn)換軟件會爆出:顏色太多的信息而導(dǎo)致轉(zhuǎn)換失敗。所以我就選擇了網(wǎng)頁優(yōu)化版。
我們啟動cmd,把目錄切換到我們工具所在的位置,這些windows的命令自行百度去。我這里就不多說了,都是常用的命令。
然后打上pnmtoc -c image.pnm 》 image.c,image是你圖片的文件名,回車后就會生成一個c的文本。
以下是我的測試圖片:
-
ti
+關(guān)注
關(guān)注
112文章
8115瀏覽量
212411 -
Atmel
+關(guān)注
關(guān)注
17文章
311瀏覽量
107301
發(fā)布評論請先 登錄
相關(guān)推薦
評論