yyq9988621 发表于 2010-8-10 16:01:55

TFT屏显示图片色彩严重不对

TFT屏显示图片色彩严重不对,应该不是lcd初始化问题,因为整屏显示单色时,红绿蓝都正常,请教各位这可能是什么原因。

yyq9988621 发表于 2010-8-11 14:04:42

有知道的吗,随便说说大概是什么原因,我是一点头绪都没有

68000 发表于 2010-8-11 14:07:05

RGB的颜色反了

68000 发表于 2010-8-11 14:07:35

你的图形RGB的位置反了

fyx2009 发表于 2010-8-11 14:19:36

是显示bmp么?好像有的是555,不是565。这个在lcd初始化设置。一般用565。

yyq9988621 发表于 2010-8-11 15:02:43

谢谢楼上两位的回答,我设置的是16位/像素,RGB565的,我只是想简单测试下显示,用bmp2rgb软件提取的位图像素信息,以数组形式存在M128的flash里,软件提取的信息应该是没错的……

friendljy 发表于 2010-8-11 16:19:49

端口选择18位模式,IO使用16位模式,可能会出现你说的情况。

hyz_avr 发表于 2010-8-11 16:25:48

先取个红/绿/蓝的图片试试看

jlhfky 发表于 2010-8-11 18:20:47

按以下方法试试:先用windows自带的画图打开图片,然后存为24位真彩色bmp格式,再用Image2lcd取模,参数565,16位彩色

powerg7 发表于 2010-8-11 18:54:31

应该用红绿蓝的单色过渡色来测试,这样可以直接看出是不是焊接有问题

yyq9988621 发表于 2010-8-11 20:26:03

问题解决了,我听7楼 的取了张蓝色的图片,但显示出来的是绿色! 取得像素点都是0x00 0x1f啊,我猜是显示图片函数跳过了数组第一个元素0x00,后面的就都变成0x1f 0x00 了。我的显示函数之前是这样的
void show_photo(void)
{
       
        unsigned int i;
        unsigned long s=0;

    addr();

        for (i=0;i<20480;i++)    //128×160
        {
           
               WriteDAT(photo,photo);
               
               
        }
       
}
不行,改成这样就行了
void show_photo(void)
{
       
        unsigned int i;
        unsigned long s=0;

    addr();

        for (i=0;i<20480;i++)
        {
           
               WriteDAT(photo,photo);
               s+=2;
               
        }
       
}

这又是个问题,标准c中 WriteDAT(photo,photo);没错呀,难道ICC中就是这样的?

sunicecream 发表于 2010-8-12 14:36:27

最近在整一块驱动芯片是HX8347的3.2的屏,就是点不亮呀,不知道这里有没有人高人弄过,代码贴出来

#include <avr/io.h>
#include <util/delay.h>

#include <avr/signal.h>
#include <avr/interrupt.h>

#define NOP() asm("nop")

#define U8 unsigned char
#define U16 unsigned int
#define U32 unsigned long


#define DATA_LO_DDRDDRA
#define DATA_LO_PORT PORTA
#define DATA_LO_PINPINA

#define DATA_HI_DDRDDRC
#define DATA_HI_PORT PORTC
#define DATA_HI_PINPINC


#define LCD_CS_DDRDDRB
#define LCD_CS_PORT PORTB
#define LCD_CS_BIT0


#define LCD_RS_DDRDDRB
#define LCD_RS_PORT PORTB
#define LCD_RS_BIT1


#define LCD_WR_DDRDDRB
#define LCD_WR_PORT PORTB
#define LCD_WR_BIT2


#define LCD_RST_DDRDDRB
#define LCD_RST_PORT PORTB
#define LCD_RST_BIT3

#define LCD_CS_H() LCD_CS_PORT |= 1<<LCD_CS_BIT
#define LCD_CS_L() LCD_CS_PORT &= ~(1<<LCD_CS_BIT)

#define LCD_RS_H() LCD_RS_PORT |= 1<<LCD_RS_BIT
#define LCD_RS_L() LCD_RS_PORT &= ~(1<<LCD_RS_BIT)

#define LCD_WR_H() LCD_WR_PORT |= 1<<LCD_WR_BIT
#define LCD_WR_L() LCD_WR_PORT &= ~(1<<LCD_WR_BIT)

#define LCD_RST_H() LCD_RST_PORT |= 1<<LCD_RST_BIT
#define LCD_RST_L() LCD_RST_PORT &= ~(1<<LCD_RST_BIT)


static void Delay_nus(unsigned int Time)
{
   unsigned int TimeCounter = 0;
for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
{
   asm("nop");
}
}

static void Delay_nms(unsigned int Time)
{
    unsigned int TimeCounter = 0;

for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
{
    Delay_nus(1300);
}
}


void WriteI(U16 c)
{
// LCD_CS_H();
// LCD_WR_H();//CS=WR=1;
// LCD_RS_L();//RS=0;

DATA_LO_PORT = (unsigned char)c;
DATA_HI_PORT = (unsigned char)(c>>8);//DB=c;
   
LCD_RS_L();//RS=1;
LCD_CS_L();//CS=0;
LCD_WR_L();//WR=0;
NOP();
NOP();
LCD_WR_H();//WR=1;
LCD_CS_H();//CS=1;
}

void WriteD(U16 d)
{
//LCD_CS_H();
//LCD_WR_H();//CS=WR=1;
//LCD_RS_H();//RS=1;

DATA_LO_PORT = (unsigned char)d;
DATA_HI_PORT = (unsigned char)(d>>8);//DB=d;
   
LCD_RS_H();//RS=1;
LCD_CS_L();//CS=0;
LCD_WR_L();//WR=0;
NOP();
NOP();
LCD_WR_H();//WR=1;
LCD_CS_H();//CS=1;
}

void Init_Data(U16 c,U16 d)
{
WriteI(c);
WriteD(d);
}

void LCD_Write_Start(void)
{
LCD_CS_H();
LCD_WR_H();
LCD_RS_L();
DATA_LO_PORT = 0x22;
DATA_HI_PORT = 0x00;
LCD_CS_L();
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
}

void LCD_Write_Data(unsigned int val)
{
DATA_LO_PORT = (unsigned char)val;
DATA_HI_PORT = (unsigned char)(val>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
}

void LCD_Write_End(void)
{
LCD_CS_H();
}

void Initial(void)   
{   
//=========Initial HX8347for INL2.8"QVGA Panel======//
LCD_RST_H();
Delay_nms(1); // Delay 1ms
LCD_RST_L();
Delay_nms(1); // Delay 10ms
LCD_RST_H();
Delay_nms(150); // Delay 150 ms

Init_Data(0x0042,0x0008);   
//Gamma setting
Init_Data(0x0046,0x00B4);
Init_Data(0x0047,0x0043);
Init_Data(0x0048,0x0013);
Init_Data(0x0049,0x0047);
Init_Data(0x004A,0x0014);
Init_Data(0x004B,0x0036);
Init_Data(0x004C,0x0003);
Init_Data(0x004D,0x0046);
Init_Data(0x004E,0x0005);
Init_Data(0x004F,0x0010);
Init_Data(0x0050,0x0008);
Init_Data(0x0051,0x000a);
   
//Window Setting

Init_Data(0x0002,0x0000);
Init_Data(0x0003,0x0000);
Init_Data(0x0004,0x0000);
Init_Data(0x0005,0x00EF);
Init_Data(0x0006,0x0000);
Init_Data(0x0007,0x0000);
Init_Data(0x0008,0x0001);
Init_Data(0x0009,0x003F);


Delay_nms(10);


Init_Data(0x0001,0x0006);


   
Init_Data(0x0016,0x00C8);   
Init_Data(0x0023,0x0095);
Init_Data(0x0024,0x0095);
Init_Data(0x0025,0x00FF);
Init_Data(0x0027,0x0002);
Init_Data(0x0028,0x0002);
Init_Data(0x0029,0x0002);
Init_Data(0x002A,0x0002);
Init_Data(0x002C,0x0002);
Init_Data(0x002D,0x0002);

Init_Data(0x003A,0x0001);
Init_Data(0x003B,0x0001);
Init_Data(0x003C,0x00F0);   
Init_Data(0x003D,0x0000);

Delay_nms(20);

Init_Data(0x0035,0x0038);
Init_Data(0x0036,0x0078);
Init_Data(0x003E,0x0038);
Init_Data(0x0040,0x000F);
Init_Data(0x0041,0x00F0);

Init_Data(0x0038,0x0000);

// Power Setting

Init_Data(0x0019,0x0049);
Init_Data(0x0093,0x000A);

Delay_nms(10);

Init_Data(0x0020,0x0020);   

Init_Data(0x001D,0x0003);   
Init_Data(0x001E,0x0000);

Init_Data(0x001F,0x0009);   

Init_Data(0x0044,0x0053);
Init_Data(0x0045,0x0010);   


Delay_nms(10);

Init_Data(0x001C,0x0004);

Delay_nms(20);

Init_Data(0x0043,0x0080);   

Delay_nms(5);

Init_Data(0x001B,0x000a);   

Delay_nms(40);

Init_Data(0x001B,0x0012);   

Delay_nms(40);   
//Display On Setting

Init_Data(0x0090,0x007F);
Init_Data(0x0026,0x0004);

Delay_nms(40);

Init_Data(0x0026,0x0024);
Init_Data(0x0026,0x002C);

Delay_nms(40);   
Init_Data(0x0070,0x0008);
Init_Data(0x0026,0x003C);
Init_Data(0x0057,0x0002);
Init_Data(0x0055,0x0000);
Init_Data(0x0057,0x0000);
WriteI(0x0022);

}


void WriteColor(U32 color)
{
LCD_RS_H();//RS=1;
DATA_LO_PORT = (unsigned char)color;
DATA_HI_PORT = (unsigned char)(color>>8);//DB= color;
LCD_CS_L();//CS=0;
LCD_WR_L();//WR=0;
LCD_WR_H();//WR=1;
LCD_CS_H();//CS=1;
}

void Ramset(U16 startx,U16 starty,U16 endx,U16 endy)
{

Init_Data(0x0002,startx/256);
Init_Data(0x0003,startx);
Init_Data(0x0004,endx/256);
Init_Data(0x0005,endx);
Init_Data(0x0006,starty/256);
Init_Data(0x0007,starty);
Init_Data(0x0008,endy/256);
Init_Data(0x0009,endy);
Init_Data(0x0016,0x00C8);
WriteI(0x0022);

}




void DrawBlock (U16 startx,U16 starty,U16 endx,U16 endy,U32 color)
{
U16 i,j;


Init_Data(0x0002,startx/256);
Init_Data(0x0003,startx);
Init_Data(0x0004,endx/256);
Init_Data(0x0005,endx);
Init_Data(0x0006,starty/256);
Init_Data(0x0007,starty);
Init_Data(0x0008,endy/256);
Init_Data(0x0009,endy);
Init_Data(0x0016,0x00C8);
WriteI(0x0022);

for(i=starty;i<=endy;i++)
   {
   for(j=startx;j<=endx;j++)
   {
       WriteColor(color);
   }
   }
}

void LCD_test(void)
{
unsigned int i,j;
LCD_Write_Start();
for(i=0;i<320;i++)
for(j=0;j<240;j++)
{
if(i>279)LCD_Write_Data(0x0000);       //
else if(i>239)LCD_Write_Data(0x001f);//蓝色
else if(i>199)LCD_Write_Data(0x07e0);//绿色
else if(i>159)LCD_Write_Data(0x07ff);//青色
else if(i>119)LCD_Write_Data(0xf800);//红色
else if(i>79)LCD_Write_Data(0xf81f);   //紫色
else if(i>39)LCD_Write_Data(0xffe0);   //黄色
else LCD_Write_Data(0xffff);         //
}
LCD_Write_End();
}

int main(void)
{
DATA_LO_DDR=0XFF;
DATA_HI_DDR=0XFF;
DDRB=0XFF;
Initial();
LCD_test();
while(1);
return 0;
}

nuno 发表于 2010-8-12 15:42:56

在BMP中,颜色的格式是GBR,是不是软件帮你取错了。

另外BMP16位色,2字节里只使用了15bit,即R:G:B=5:5:5。

而TFT一般都是5:6:5,这样子显示出了红色会少,蓝色一部分成了绿色。需要处理下

ufo2007 发表于 2010-9-20 14:41:35

11楼,看看是不是JTAG搞的

wuha 发表于 2010-9-20 15:35:23

如果TFT屏的GAMMA曲线没调节的画,那么颜色跟电脑上是有很大偏差!

himan 发表于 2011-10-12 16:56:18

回复【12楼】nuno
-----------------------------------------------------------------------

如果是这种现象的话。。我想问一下,该怎么着手去调节呢??

szddg 发表于 2012-6-24 14:54:13

{:smile:}我也遇到同样问题

chliken 发表于 2012-10-4 18:44:21

szddg 发表于 2012-6-24 14:54 static/image/common/back.gif
我也遇到同样问题

szddg:

你的问题解决了没有呢?我也遇到类似的问题了?
详细的见此贴:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5499886&page=1#pid6152830

求知道的人,帮帮忙咯
页: [1]
查看完整版本: TFT屏显示图片色彩严重不对