搜索
bottom↓
回复: 0

SSD1963驱动TFT白屏,请帮忙解决?

[复制链接]

出0入0汤圆

发表于 2013-7-11 06:33:35 | 显示全部楼层 |阅读模式
    前阵子用PIC24EP32GP204+SSD1963,编写了一个4.3"TFT驱动程序。之前按着我原来的2.4"屏程序架构上修改,总是出现
一半黑屏和花屏,郁闷的是不管我怎么调整参数都无法改变这个显示状态,但说明一点,说明硬件线路问题不大。
然后参考网上的样板程序做如下的修改,则老是白屏,什么都不显示,只好求救网上朋友用过SSD1963驱动4.3",帮我看
看下面程序到底问题出在哪里,在此谢了。。。。。

#define TFT_RST_HIGH()    (_RC9  = true)
#define TFT_RST_LOW()     (_RC9  = false)
#define TFT_RS_HIGH()     (_RC8  = true)
#define TFT_RS_LOW()      (_RC8  = false)
#define TFT_CS_HIGH()     (_RA10 = true)
#define TFT_CS_LOW()      (_RA10 = false)
#define TFT_RD_HIGH()     (_RC7  = true)
#define TFT_RD_LOW()      (_RC7  = false)
#define TFT_WR_HIGH()     (_RC6  = true)
#define TFT_WR_LOW()      (_RC6  = false)

#define TFT_DATA_ALLOUT() {TRISB &= 0x0003; TRISC &= 0xffcf;}

#define TFT_BACKLIGHT_ON()    {_RA7  = true;}
#define TFT_BACKLIGHT_OFF()   {_RA7  = false;}

#define BUILD_UINT16(loByte,hiByte)   ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8)))
#define HI_UINT16(a)                  (((a) >> 8) & 0xFF)
#define LO_UINT16(a)                  ((a) & 0xFF)

//*+++++++++++++++*/
#define LCD_X_MAX       480
#define LCD_Y_MAX       272

#define LCD_HF_PORCH    43
#define LCD_HB_PORCH    3
#define LCD_HP_WIDTH    42
#define LCD_LPS         1
#define LCD_VF_PORCH    12
#define LCD_VB_PORCH    5
#define LCD_VP_WIDTH    11
#define LCD_FPS         1

#define        NOP_CMD                                                                                0x00
#define        SOFT_RESET_CMD                                                0x01
#define SLEEP_OUT_CMD             0x11
#define NORMAL_DISPLAY_MODEON_CMD 0x13
#define DISPLAY_ON_CMD            0x29
#define COLUMN_ADDRESS_SET_CMD    0x2a
#define PAGE_ADDRESS_SET_CMD      0x2b
#define MEMORY_WRITE_CMD          0x2c
#define MEMORY_ADDRESS_CTL_CMD    0x36
#define IDLE_OFF_CMD              0x38
#define PIXELFORMAT_SET_CMD       0x3a
#define WRITE_MEMORY_CONTINUE     0x3c
#define        SET_LCD_MODE_CMD                                        0xb0
#define        SET_HORI_PERIOD_CMD                                0xb4
#define        SET_VERT_PERIOD_CMD                                0xb6
#define        SET_GPIO_CONFIG_CMD                                0xb8
#define        SET_GPIO_VALUE_CMD                                0xba
#define        SET_PLL_CMD                                                                0xe0
#define        SET_PLL_MN_CMD                                                0xe2
#define        SET_LSHIFT_FREQ_CMD                                0xe6
#define        READ_LSHIFT_FREQ_CMD                        0xe7
#define INTERFACE_CTL_CMD         0xf0

typedef enum
{
  RED           = 0xf800,       //1
  YELLOW        = 0xffe0,       //2
  GREEN         = 0x07e0,       //3
  INDIGO        = 0x07ff,       //4
  BLUE          = 0x001f,       //5
  PURPLE        = 0xf81f,       //6
  BLACK         = 0x0000,       //7
  WHITE         = 0xffff,       //8
  GRAY          = 0x7bef,       //9
  ORANGE        = 0xfbe4,       //10
  PINK          = 0xfd79,       //11
  BROWN         = 0x8802,       //12
  BROWN_1       = 0x0041,       //13
  BLUE_AREA     = 0x137A,       //14
  DIVIDE_LINE1  = 0x0AF6,       //15
  DIVIDE_LINE2  = 0x345C        //16
}Colour_t;

typedef struct
{
  uint16  iXaddr_Start;
  uint16  iYaddr_Start;
  uint16  iWidth;
  uint16  iHeight;
}Image_Parameter_t;

Image_Parameter_t tImage_Argument;
Image_Parameter_t *pImage = &tImage_Argument;

/*========================================================================*/
void Delay_us(uint16 ustime);
void Delay_ms(uint16 msstime);
void SSD1963_TF4_3_Initial(void);
static void TFT_IO_Config(void);
static void TFT_Window_Setting(Image_Parameter_t *win);
void TFT_Color_Testing(Image_Parameter_t *pimage);
void TFT_DATA_LOAD(uint8 data);
void TFT_SSD1963_CMD(uint8 cmd);
void TFT_SSD1963_WRDATA(uint8 data);

const uint16 Color_Tab[12] =
{
  RED,
  YELLOW,
  GREEN,
  INDIGO,
  BLUE,
  PURPLE,
  BLACK,
  WHITE,
  GRAY,
  ORANGE,
  PINK,
  BROWN
};

/*-----------------------------------------------------------------------*/
void  TFT_Color_Testing(Image_Parameter_t *pimage)
{
        uint16 ii,jj,temp;
       
  TFT_Window_Setting(pimage);
  for (ii=0; ii<LCD_X_MAX; ii++)
  {
          for (jj=0; jj<LCD_Y_MAX; jj++)
          {
                  TFT_SSD1963_CMD(WRITE_MEMORY_CONTINUE);
                        temp = LO_UINT16(Color_Tab[3]);
                  TFT_SSD1963_WRDATA(temp);
                  temp = HI_UINT16(Color_Tab[3]);
                  TFT_SSD1963_WRDATA(temp);
          }
  }
}


void Delay_us(uint16 ustime)
{
  uint16 ii,jj;

  for (ii=0; ii<ustime; ++ii)
  {
    jj=4;
    do
    {
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
    }while (--jj);
  }
}
/*===============================*/
void  Delay_ms(uint16 mstime)
{
  while (mstime--)
  {
    Delay_us(1000);
  }
}

static void TFT_IO_Config(void)
{
        TFT_DATA_ALLOUT();
  //RS,CS,RD,WR,RST
  _TRISC9 = false;  //0-output,1-input
  TFT_RST_HIGH();

  _TRISC8 = false;
  TFT_RS_HIGH();

  _TRISC7 = false;
  TFT_RD_HIGH();

  _TRISC6 = false;
  TFT_WR_HIGH();

  _TRISA10 = false;
  TFT_CS_HIGH();
}

void TFT_SSD1963_CMD(uint8 cmd)
{
        TFT_RS_LOW();
        Delay_us(1);
        TFT_RD_HIGH();
        Delay_us(1);
        TFT_CS_LOW();
        Delay_us(1);
        TFT_DATA_LOAD(cmd);
        Delay_us(1);
        TFT_WR_LOW();
        Delay_us(1);
        TFT_WR_HIGH();
        Delay_us(1);
        TFT_CS_HIGH();
}
/*=======================================*/
void TFT_SSD1963_WRDATA(uint8 data)
{
        TFT_RS_HIGH();
        Delay_us(1);
        TFT_RD_HIGH();
        Delay_us(1);
        TFT_CS_LOW();
        Delay_us(1);
        TFT_DATA_LOAD(data);
        Delay_us(1);
        TFT_WR_LOW();
        Delay_us(1);
        TFT_WR_HIGH();
        Delay_us(1);
        TFT_CS_HIGH();
}
/*=======================================*/
void TFT_DATA_LOAD(uint8 data)
{
        uint16 dtemp;
       
        dtemp = BUILD_UINT16(data, 0x00);
#if defined (DEBUGGING)
        PORTC = ((PORTC&0xffcf) | ((dtemp&0x0003) << 4));
        PORTB = ((PORTB&0x0003) | (dtemp&0xfffc));
#else
        PORTB = dtemp;
#endif
}

void  TFT_Window_Setting(Image_Parameter_t *win)
{
        TFT_SSD1963_CMD(COLUMN_ADDRESS_SET_CMD);
        Delay_ms(50);
        TFT_SSD1963_WRDATA(HI_UINT16(win->iXaddr_Start));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(LO_UINT16(win->iXaddr_Start));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(HI_UINT16(win->iXaddr_Start + win->iWidth - 1));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(LO_UINT16(win->iXaddr_Start + win->iWidth - 1));
        Delay_ms(50);
       
        TFT_SSD1963_CMD(PAGE_ADDRESS_SET_CMD);
        Delay_ms(50);
        TFT_SSD1963_WRDATA(HI_UINT16(win->iYaddr_Start));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(LO_UINT16(win->iYaddr_Start));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(HI_UINT16(win->iYaddr_Start + win->iHeight - 1));
        Delay_ms(50);
        TFT_SSD1963_WRDATA(LO_UINT16(win->iYaddr_Start + win->iHeight - 1));
        Delay_ms(50);
       
        TFT_SSD1963_CMD(MEMORY_WRITE_CMD);
        //TFT_SSD1963_CMD(WRITE_MEMORY_CONTINUE);
        Delay_ms(50);
}

void  SSD1963_TF4_3_Initial(void)
{
  //VCL=3.3V
  //TFT_BACKLIGHT_ON();
  TFT_IO_Config();
  /************ Reset LCD Driver *******************/
  TFT_RST_HIGH();
  Delay_ms(10);
  TFT_RST_LOW();
  Delay_ms(15);
  TFT_RST_HIGH();
  Delay_ms(250);
  /************ Start Initial Sequence *************/
  Delay_ms(5);
  TFT_SSD1963_CMD(NOP_CMD);                                                        //0x00,nop
  TFT_SSD1963_CMD(NOP_CMD);                                                        //0x00,nop
  Delay_ms(5);
  TFT_SSD1963_CMD(SOFT_RESET_CMD);                        //0x01,reset
  Delay_ms(50);

  TFT_SSD1963_CMD(SLEEP_OUT_CMD);                                //0x11,sleep out
  Delay_ms(20);

  TFT_SSD1963_CMD(NORMAL_DISPLAY_MODEON_CMD);        //0x13,normal display mode
  Delay_ms(5);

  //set pll MN
  TFT_SSD1963_CMD(SET_PLL_MN_CMD);                //0xe2
  TFT_SSD1963_WRDATA(0x2c);
  TFT_SSD1963_WRDATA(0x02);
  TFT_SSD1963_WRDATA(0x04);
  Delay_ms(5);

  //pll enable
  TFT_SSD1963_CMD(SET_PLL_CMD);                        //0xe0
  Delay_ms(5);
  TFT_SSD1963_WRDATA(0x01);
  Delay_ms(20);
  TFT_SSD1963_CMD(SET_PLL_CMD);                        //0xe0
        Delay_ms(20);
        TFT_SSD1963_WRDATA(0x03);
        Delay_ms(20);

        //pixel data  interface
        TFT_SSD1963_CMD(INTERFACE_CTL_CMD);                //0xf0,????
        TFT_SSD1963_WRDATA(0x03);                                                        //8bit

        //pixel format
        TFT_SSD1963_CMD(PIXELFORMAT_SET_CMD);        //0x3a,????
        TFT_SSD1963_WRDATA(0x70);                                                        //24bit
        Delay_ms(20);

        //dotclk setting
        TFT_SSD1963_CMD(SET_LSHIFT_FREQ_CMD);                //0xe6
  TFT_SSD1963_WRDATA(0x01);
  TFT_SSD1963_WRDATA(0x47);
  TFT_SSD1963_WRDATA(0xbe);

  //panel setting
  TFT_SSD1963_CMD(SET_LCD_MODE_CMD);                //0xb0
  TFT_SSD1963_WRDATA(0x20);
  TFT_SSD1963_WRDATA(0x00);
  TFT_SSD1963_WRDATA(HI_UINT16(LCD_X_MAX-1));
  TFT_SSD1963_WRDATA(LO_UINT16(LCD_X_MAX-1));
  TFT_SSD1963_WRDATA(HI_UINT16(LCD_Y_MAX-1));
  TFT_SSD1963_WRDATA(LO_UINT16(LCD_Y_MAX-1));
  TFT_SSD1963_WRDATA(0x00);

  //hysnc setting
  TFT_SSD1963_CMD(SET_HORI_PERIOD_CMD);                //0xb4
  TFT_SSD1963_WRDATA(HI_UINT16(LCD_HF_PORCH + LCD_HB_PORCH + LCD_X_MAX - 1));
  TFT_SSD1963_WRDATA(LO_UINT16(LCD_HF_PORCH + LCD_HB_PORCH + LCD_X_MAX - 1));
  TFT_SSD1963_WRDATA(0x00);
  TFT_SSD1963_WRDATA(LCD_HF_PORCH);
  TFT_SSD1963_WRDATA(LCD_HP_WIDTH);
  TFT_SSD1963_WRDATA(0x00);
  TFT_SSD1963_WRDATA(LCD_LPS);
  TFT_SSD1963_WRDATA(0x00);

  //vsync setting
  TFT_SSD1963_CMD(SET_VERT_PERIOD_CMD);                //0xb6
  TFT_SSD1963_WRDATA(HI_UINT16(LCD_VF_PORCH + LCD_VB_PORCH + LCD_Y_MAX -1));
  TFT_SSD1963_WRDATA(LO_UINT16(LCD_VF_PORCH + LCD_VB_PORCH + LCD_Y_MAX -1));
  TFT_SSD1963_WRDATA(0x00);
  TFT_SSD1963_WRDATA(LCD_VF_PORCH);
  TFT_SSD1963_WRDATA(LCD_VP_WIDTH);
  TFT_SSD1963_WRDATA(0x00);
  TFT_SSD1963_WRDATA(LCD_FPS);

        //address mode
        TFT_SSD1963_CMD(MEMORY_ADDRESS_CTL_CMD);                //0x36
        TFT_SSD1963_WRDATA(0x00);

        /************ Reset LCD Driver *******************/
        //TFT_RST_HIGH();
  //Delay_ms(30);
  //TFT_RST_LOW();
  //Delay_ms(30);
  //TFT_RST_HIGH();
  //Delay_ms(30);

  //display on
  TFT_SSD1963_CMD(DISPLAY_ON_CMD);                //0x29,display on
  Delay_ms(10);

  //Initialze TFT window parameter
  pImage->iXaddr_Start = 0;
  pImage->iYaddr_Start = 0;
  pImage->iWidth       = LCD_X_MAX;
  pImage->iHeight      = LCD_Y_MAX;

  TFT_Color_Testing(pImage);                                //显示任意单色
  TFT_BACKLIGHT_ON();
}


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

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

本版积分规则

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

GMT+8, 2024-6-3 18:12

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

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