搜索
bottom↓
回复: 17

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

[复制链接]

出0入0汤圆

发表于 2010-8-10 16:01:55 | 显示全部楼层 |阅读模式
TFT屏显示图片色彩严重不对,应该不是lcd初始化问题,因为整屏显示单色时,红绿蓝都正常,请教各位这可能是什么原因。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-8-11 14:04:42 | 显示全部楼层
有知道的吗,随便说说大概是什么原因,我是一点头绪都没有

出0入0汤圆

发表于 2010-8-11 14:07:05 | 显示全部楼层
RGB的颜色反了

出0入0汤圆

发表于 2010-8-11 14:07:35 | 显示全部楼层
你的图形RGB的位置反了

出0入0汤圆

发表于 2010-8-11 14:19:36 | 显示全部楼层
是显示bmp么?好像有的是555,不是565。这个在lcd初始化设置。一般用565。

出0入0汤圆

 楼主| 发表于 2010-8-11 15:02:43 | 显示全部楼层
谢谢楼上两位的回答,我设置的是16位/像素,RGB565的,我只是想简单测试下显示,用bmp2rgb软件提取的位图像素信息,以数组形式存在M128的flash里,软件提取的信息应该是没错的……

出0入93汤圆

发表于 2010-8-11 16:19:49 | 显示全部楼层
端口选择18位模式,IO使用16位模式,可能会出现你说的情况。

出0入0汤圆

发表于 2010-8-11 16:25:48 | 显示全部楼层
先取个红/绿/蓝的图片试试看

出0入0汤圆

发表于 2010-8-11 18:20:47 | 显示全部楼层
按以下方法试试:先用windows自带的画图打开图片,然后存为24位真彩色bmp格式,再用Image2lcd取模,参数565,16位彩色

出0入0汤圆

发表于 2010-8-11 18:54:31 | 显示全部楼层
应该用红绿蓝的单色过渡色来测试,这样可以直接看出是不是焊接有问题

出0入0汤圆

 楼主| 发表于 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[s++],photo[s++]);
                 
               
        }
       
}
不行,改成这样就行了
void show_photo(void)
{
       
        unsigned int i;
        unsigned long s=0;

    addr();

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

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

出0入0汤圆

发表于 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_DDR  DDRA
#define DATA_LO_PORT PORTA
#define DATA_LO_PIN  PINA

#define DATA_HI_DDR  DDRC
#define DATA_HI_PORT PORTC
#define DATA_HI_PIN  PINC


#define LCD_CS_DDR  DDRB
#define LCD_CS_PORT PORTB
#define LCD_CS_BIT  0


#define LCD_RS_DDR  DDRB
#define LCD_RS_PORT PORTB
#define LCD_RS_BIT  1


#define LCD_WR_DDR  DDRB
#define LCD_WR_PORT PORTB
#define LCD_WR_BIT  2


#define LCD_RST_DDR  DDRB
#define LCD_RST_PORT PORTB
#define LCD_RST_BIT  3

#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 HX8347  for 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;
}

出0入0汤圆

发表于 2010-8-12 15:42:56 | 显示全部楼层
在BMP中,颜色的格式是GBR,是不是软件帮你取错了。

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

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

出0入0汤圆

发表于 2010-9-20 14:41:35 | 显示全部楼层
11楼,看看是不是JTAG搞的

出0入0汤圆

发表于 2010-9-20 15:35:23 | 显示全部楼层
如果TFT屏的GAMMA曲线没调节的画,那么颜色跟电脑上是有很大偏差!

出0入18汤圆

发表于 2011-10-12 16:56:18 | 显示全部楼层
回复【12楼】nuno
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2012-6-24 14:54:13 | 显示全部楼层
我也遇到同样问题

出0入0汤圆

发表于 2012-10-4 18:44:21 | 显示全部楼层
szddg 发表于 2012-6-24 14:54
我也遇到同样问题

szddg:

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

求知道的人,帮帮忙咯
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 08:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表