TFT屏显示图片色彩严重不对
TFT屏显示图片色彩严重不对,应该不是lcd初始化问题,因为整屏显示单色时,红绿蓝都正常,请教各位这可能是什么原因。 有知道的吗,随便说说大概是什么原因,我是一点头绪都没有 RGB的颜色反了 你的图形RGB的位置反了 是显示bmp么?好像有的是555,不是565。这个在lcd初始化设置。一般用565。 谢谢楼上两位的回答,我设置的是16位/像素,RGB565的,我只是想简单测试下显示,用bmp2rgb软件提取的位图像素信息,以数组形式存在M128的flash里,软件提取的信息应该是没错的…… 端口选择18位模式,IO使用16位模式,可能会出现你说的情况。 先取个红/绿/蓝的图片试试看 按以下方法试试:先用windows自带的画图打开图片,然后存为24位真彩色bmp格式,再用Image2lcd取模,参数565,16位彩色 应该用红绿蓝的单色过渡色来测试,这样可以直接看出是不是焊接有问题 问题解决了,我听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中就是这样的? 最近在整一块驱动芯片是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;
} 在BMP中,颜色的格式是GBR,是不是软件帮你取错了。
另外BMP16位色,2字节里只使用了15bit,即R:G:B=5:5:5。
而TFT一般都是5:6:5,这样子显示出了红色会少,蓝色一部分成了绿色。需要处理下 11楼,看看是不是JTAG搞的 如果TFT屏的GAMMA曲线没调节的画,那么颜色跟电脑上是有很大偏差! 回复【12楼】nuno
-----------------------------------------------------------------------
如果是这种现象的话。。我想问一下,该怎么着手去调节呢?? {:smile:}我也遇到同样问题 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]