[求助] STC12C5A60S2 RA8875色彩显示错误问题

lgr   2013-11-23 21:54 楼主
我的板子显示三基色正常,但显示别的色彩时显示错误。选用8位接口16色彩。
东华4.3寸彩屏。
有空一起研究的请看下面代码如下:

RA8875驱动:
#include"STC12C5A60S2.H"
#include "RA8875.h"

/*************************** 延时子函数 ****************************/
void delay_ms(uint ms)
{
   uchar k;
   while (ms--)
   {
     for (k = 0; k <125; k++);      
   }
}
/********************* RA8875 写指令函数 **************************/
void LCD_CmdWrite(uchar Cmd)    //8080模式
{
   LCD_rd = 1;
   LCD_cs = 0;
   LCD_rs = 1;
   DATA_BUS = Cmd;
   LCD_wr = 0;
   LCD_wr = 1;
   LCD_cs= 1;
   DATA_BUS = 0xff;
   LCD_rs = 0;
/*
   LCD_rs = 1;
   LCD_cs = 0;
   LCD_wr = 0;
   LCD_rd = 1;
   DATA_BUS = Cmd;
   LCD_wr = 1;
   LCD_cs = 1;
   DATA_BUS = 0xff;
   LCD_rs = 0;
   */
}
/********************* RA8875 写数据函数 **************************/
void LCD_DataWrite(uchar Data)   //8080模式
{
   LCD_rd = 1;      
   LCD_cs = 0;
   LCD_rs = 0;
   DATA_BUS = Data;
   LCD_wr = 0;
   LCD_wr = 1;
   LCD_cs = 1;
   DATA_BUS = 0xff;
   LCD_rs = 1;
/*
   LCD_rs = 0;      
   LCD_cs = 0;
   LCD_wr = 0;
   LCD_rd = 1;
   DATA_BUS = Data;
   LCD_wr = 1;
   LCD_cs = 1;
   DATA_BUS = 0xff;
   LCD_rs = 1;
   */
}
/********************* RA8875 写指令和写数据函数 **************************/
void Write_Dir(uchar Cmd,uchar Data)
{
   LCD_CmdWrite(Cmd);
   LCD_DataWrite(Data);
}
/********************* RA8875 读状态函数 **************************/
uchar LCD_StatusRead(void)      //8080模式
{
   uchar Data;
   LCD_cs = 0;
   LCD_rs = 1;
   LCD_wr = 1;
   LCD_rd = 0;
   Data = DATA_BUS;
   LCD_rd = 1;
   LCD_cs = 1;
   DATA_BUS = 0xff;
   LCD_rs = 0;
   return Data;
}
/********************* RA8875 读数据函数 **************************/
uchar LCD_DataRead(void)      //8080模式
{
   uchar Data;
   LCD_wr = 1;
   LCD_cs = 0;
   LCD_rs = 0;
   LCD_rd = 0;
   Data = DATA_BUS;
   LCD_rd = 1;
   LCD_cs = 1;
   LCD_rs = 1;
   return Data;
}
/********************* RA8875 复位函数 **************************/
void LCD_Reset(void)
{
LCD_RST = 1;
delay_ms(5);
LCD_RST = 0;
delay_ms(5);
LCD_RST = 1;
delay_ms(5);
}
/********************* RA8875 倍频设置函数 **************************/
void PLL_ini(void)
{
     LCD_CmdWrite(0x88);      
     LCD_DataWrite(0x05);
     delay_ms(1);     
     LCD_CmdWrite(0x89);        
     LCD_DataWrite(0x02);  
     delay_ms(1);
}
/********************* RA8875 测忙函数组 **************************/
void Chk_Busy(void)
{
uchar temp;  
do
   {
      temp=LCD_StatusRead();
   }
     while((temp&0x80)==0x80);     
}
/*void Chk_BTE_Busy(void)
{
uchar temp;  
do
   {
   temp=LCD_StatusRead();
   }
while((temp&0x40)==0x40);     
}
void Chk_DMA_Busy(void)
{
uchar temp;  
do
   {
   LCD_CmdWrite(0xBF);
   temp =LCD_DataRead();
   }
while((temp&0x01)==0x01);   
}
/********************************* RA8875 初始化函数 *************************************/
void LCD_Initial(void)
{  
     PLL_ini();
LCD_CmdWrite(0x10);      //SYSR   bit[4:3]=00 256 color  bit[2:1]=  00 8bit MPU interface
LCD_DataWrite(0x0C);     //1x 64k color  1x 16bit        
delay_ms(1);
LCD_CmdWrite(0x04);      //PCLK
LCD_DataWrite(0x82);     //
delay_ms(1);

//Horizontal set
LCD_CmdWrite(0x14);  //HDWR//Horizontal Display Width Setting Bit[6:0]  
LCD_DataWrite(0x3b); //Horizontal display width(pixels) = (HDWR + 1)*8       0x27
LCD_CmdWrite(0x15);  //HNDFCR//Horizontal Non-Display Period fine tune Bit[3:0]
LCD_DataWrite(0x02); //(HNDR + 1)*8 +HNDFCR
LCD_CmdWrite(0x16);  //HNDR//Horizontal Non-Display Period Bit[4:0]
LCD_DataWrite(0x03); //Horizontal Non-Display Period (pixels) = (HNDR + 1)*8
LCD_CmdWrite(0x17);  //HSTR//HSYNC Start Position[4:0]
LCD_DataWrite(0x01); //HSYNC Start Position(PCLK) = (HSTR + 1)*8
LCD_CmdWrite(0x18);  //HPWR//HSYNC Polarity ,The period width of HSYNC.
LCD_DataWrite(0x03); //HSYNC Width [4:0]   HSYNC Pulse width(PCLK) = (HPWR + 1)*8
//Vertical set
LCD_CmdWrite(0x19); //VDHR0 //Vertical Display Height Bit [7:0]
LCD_DataWrite(0x0f); //Vertical pixels = VDHR + 1 0xef
LCD_CmdWrite(0x1a); //VDHR1 //Vertical Display Height Bit [8]
LCD_DataWrite(0x01); //Vertical pixels = VDHR + 1  0x00
LCD_CmdWrite(0x1b); //VNDR0 //Vertical Non-Display Period Bit [7:0]
LCD_DataWrite(0x0F); //Vertical Non-Display area = (VNDR + 1)
LCD_CmdWrite(0x1c); //VNDR1 //Vertical Non-Display Period Bit [8]
LCD_DataWrite(0x00); //Vertical Non-Display area = (VNDR + 1)
LCD_CmdWrite(0x1d); //VSTR0 //VSYNC Start Position[7:0]
LCD_DataWrite(0x0e); //VSYNC Start Position(PCLK) = (VSTR + 1)
LCD_CmdWrite(0x1e); //VSTR1 //VSYNC Start Position[8]
LCD_DataWrite(0x06); //VSYNC Start Position(PCLK) = (VSTR + 1)
LCD_CmdWrite(0x1f);  //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0]
LCD_DataWrite(0x01); //VSYNC Pulse Width(PCLK) = (VPWR + 1)

LCD_CmdWrite(0x8C);    //PWM2 控制设置
LCD_DataWrite(0x80);   //开启PWM2
LCD_CmdWrite(0x8C);    //PWM2 控制设置
LCD_DataWrite(0x81);   //开启PWM2
LCD_CmdWrite(0x8D);    //背光亮度
LCD_DataWrite(0x00);   //亮度参数0xff-0x00
}

/********************************* 设置工作窗口区域 *************************************/
void Active_Window(uint XL,uint XR ,uint YT ,uint YB)
{
uchar temp;
     //setting active window X
temp=XL;   
     LCD_CmdWrite(0x30);//HSAW0
LCD_DataWrite(temp);
temp=XL>>8;   
     LCD_CmdWrite(0x31);//HSAW1   
LCD_DataWrite(temp);
temp=XR;   
     LCD_CmdWrite(0x34);//HEAW0
LCD_DataWrite(temp);
temp=XR>>8;   
     LCD_CmdWrite(0x35);//HEAW1   
LCD_DataWrite(temp);
     //setting active window Y
temp=YT;   
     LCD_CmdWrite(0x32);//VSAW0
LCD_DataWrite(temp);
temp=YT>>8;   
     LCD_CmdWrite(0x33);//VSAW1   
LCD_DataWrite(temp);
temp=YB;   
     LCD_CmdWrite(0x36);//VEAW0
LCD_DataWrite(temp);
temp=YB>>8;   
     LCD_CmdWrite(0x37);//VEAW1   
LCD_DataWrite(temp);
}
/********************************* 前景颜色设置 *************************************/
void Text_Foreground_Color1(uint b_color)
{

LCD_CmdWrite(0x63);//BGCR0
LCD_DataWrite((uchar)(b_color>>11));

LCD_CmdWrite(0x64);//BGCR0
LCD_DataWrite((uchar)(b_color>>5));

LCD_CmdWrite(0x65);//BGCR0
LCD_DataWrite((uchar)(b_color));
}
/********************************* 背景颜色设置 *************************************/
void Text_Background_Color1(uint b_color)
{

LCD_CmdWrite(0x60);//BGCR0
LCD_DataWrite((uchar)(b_color>>11));

LCD_CmdWrite(0x61);//BGCR0
LCD_DataWrite((uchar)(b_color>>5));

LCD_CmdWrite(0x62);//BGCR0
LCD_DataWrite((uchar)(b_color));
}




#include"STC12C5A60S2.H"
#include"RA8875.h"
uint tmp;
uint RGB(uchar R,uchar G,uchar B)
{
return((uint)(R&0XF8)<<8|(uint)(G&0XFC)<<3|(uint)(B&0XF8)>>3);
}
/**************************** 主函数 *******************************/
void main(void)
{
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
P4 = 0xff;
P4SW = 0xff;
LCD_Reset();      //复位RA8875
LCD_Initial();      //初始化RA8875
Write_Dir(0x01,0x80);            //开启显示
Active_Window(0,479,0,271);      //设置工作窗口大小
Text_Foreground_Color1(White);   //前景颜色设定
Text_Background_Color1(Blue);     //背景颜色设定
Write_Dir(0x8E,0x80);            //开始清屏(显示窗口)

   while(1)
     {
delay_ms(5000);
LCD_CmdWrite(0x8D);    //背光亮度
LCD_DataWrite(0xff);   //亮度参数0xff-0x00
delay_ms(5000);

Active_Window(0,479,0,271);//设置工作窗口大小
    Text_Background_Color1(White);//背景颜色设定
    Write_Dir(0X8E,0X40);//设定清屏性质(工作窗口)
     Write_Dir(0X8E,0XC0);//开始清屏
    Chk_Busy();
     
     delay_ms(5000);

     tmp = RGB(128,128,255);    //分别输入888的R,G,B分量,转换成565的R,G,B分量.
     Active_Window(0,479,0,271);//设置工作窗口大小
    Text_Background_Color1(tmp);//背景颜色设定
    Write_Dir(0X8E,0X40);//设定清屏性质(工作窗口)
     Write_Dir(0X8E,0XC0);//开始清屏
    Chk_Busy();

     }   
}

回复评论 (3)

问题解决了!是RGB各高位和低高线路接反了!造成当三基色之一全为高时红色或绿色或蓝色都能正常显示,一但不是三基色时TFT接收到的信号就不是正确的信号了。
点赞  2013-11-25 23:29
我现在遇到用51来驱动这个芯片的问题  一直都没有反应  快要炸了
点赞  2016-11-23 13:10
引用: 董栋栋 发表于 2016-11-23 13:10
我现在遇到用51来驱动这个芯片的问题  一直都没有反应  快要炸了

你可以找他们的技术支持,用51来驱动这个芯片他们都有例程,软、硬件都有
点赞  2017-7-13 16:11
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复