原创 LCD drive 学习笔记

2009-5-22 15:58 3036 3 3 分类: MCU/ 嵌入式

see also: http://docs.google.com/View?id=dhd5grmt_366g7bns5c2


LCD原理及驱动




最近有在用SmartARM2200的开发板,上面有带一块tft4267的液晶屏。采用的是S6D0129 控制芯片。屏有点问题,看能不能找出问题的根源所在。先整理一些材料。



1、接口连接方式:


点击看大图


将 TFT4267 液晶模块的 LCD_RST 引脚连接到 J1 连接器上,使用主板的 LPC2210 的P0.22 控制液晶模块复位。TFT4267 液晶模块的 LCD_CS、LCD_WR 和 LCD_RD 引脚均连接到 J1 连接器上,与主板的 LPC2210 的片选、写和读信号连接(主板上分配了一个片选信号给液晶模块),而 LCD_RS引脚则使用 A1 连接,当 A1 为高电平时为数据操作,当 A1 为低电平时为命令(索引)操作, 即使用两个不同的地址来区别向 TFT4267 液晶模块发送命令还是发送数据。 

 

TFT4267 液晶模块的背光是 LED背光,采用 3 个白光 LED并联连接,其驱动电压最大值为 3.3V。由于 LCD PACK 板上只有 3.3V 的电源,所以要设计相应的升压电路。

CAT3200ES6-5 就是专门用于并联连接的白光 LED驱动的升压芯片,固定输出电压为 5V,最大驱动电流为 100mA。CAT3200ES6-5 的/SHDN 为输出关闭控制引脚,由 LEDC 信号控制(与主板的 LPC2210的PWM 引脚 P0.21 相连,可以使用 PWM 控制背光的亮度),为了保证 LEDC 连接的 I/O没有配置为输出时也能点亮 LED背光,所以接了一个 10K的上拉电阻R26。




2、驱动程序



// TFT液晶模块硬件操作宏

#define  S6D0129_IR     (*((volatile unsigned short *) 0x83200000)) 

#define  S6D0129_DR     (*((volatile unsigned short *) 0x83200002))

#define  S6D0129_RST (1<<22)



2.1 定义几个最基本的操作:发命令,发数据,取数据函数。



/*******************************************************

* 名称: TftSendCom

* 功能: 向TFT液晶模块发送命令字。

* 入口参数: com   命令字(uint16)

* 出口参数: 无

*******************************************************/

void  TftSendCom(uint16 com)

{  S6D0129_IR = com;

}





/*******************************************************

* 名称: TftSendDat

* 功能: 向TFT液晶模块发送数据。

* 入口参数: dat   待发送的数据(uint16)

* 出口参数: 无

*******************************************************/

void  TftSendDat(uint16 dat)

{  S6D0129_DR = dat;

}





/*******************************************************

* 名称: TftRcvDat

* 功能: 读取TFT液晶模块的数据。

* 入口参数: 无

* 出口参数: 返回值即是读出的数据

*******************************************************/

uint16  TftRcvDat(void)

{  uint16  ret;



   ret = S6D0129_DR;

   return(ret);

}







/*******************************************************

* 名称: TftSetAddr

* 功能: 设置数据地址指针(坐标值)。

* 入口参数: x 横坐标的值 (0-239)

*           y       纵坐标的值 (0-319)

* 出口参数: 设置正确返回TRUE,参数超出范围返回FALSE

*******************************************************/

uint8  TftSetAddr(uint16 x, uint16 y)

{  TftSendCom(SET_ADDR_X); // 设置地址低8位

   TftSendDat(x);

   

   TftSendCom(SET_ADDR_Y); // 设置地址高9位

   TftSendDat(y);

   

   if((x<240) && (y<320)) return(TRUE);

     else  return(FALSE);

}





/*******************************************************

* 名称: TftSetWrite

* 功能: 设置数据地址指针(坐标值),并发送写数据命令。

*       接着不断的写入数据即可,GRAM地址会自动增加。

* 入口参数: x 横坐标的值 (0-239)

*           y       纵坐标的值 (0-319)

* 出口参数: 设置正确返回TRUE,参数超出范围返回FALSE

*******************************************************/

uint8  TftSetWrite(uint16 x, uint16 y)

{  uint8  ret;



   ret = TftSetAddr(x, y);

   TftSendCom(WR_RD_DATA); // 写数据

   return(ret);

}




2.2 初始化函数,包括电源电压的设置,显示模式的设置等等。



// 定义TFT4267初始化数据信息

STCOM_INI  TFT4267_INI[] = 

{   // 电源设置

    {0x0000, 0x0001, 10}, // Start Oscillation

    {0x000B, 0x0000,  0}, // Frame cycle setting;lcd工作时钟设置

    {0x000C, 0x0000, 15}, // External display interface setting;lcd工作模式设置

    

    {0x0011, 0x2E00,  0}, // Power control2 setting;灰度电压,3级电源电路设置

    {0x0014, 0x1119,  0}, // Power control4 setting;设置lcd屏的供电电压

    {0x0010, 0x1040, 15}, // Power control1 setting;设置lcd屏的电流及其它参数

    {0x0013, 0x0040, 15}, // Power control3 setting;1级电源电路设置

    {0x0013, 0x0060, 15}, // Power control3

    {0x0013, 0x0070, 60}, // Power control3

//    {0x0011, 0x3100,  0},   // Power control2

//    {0x0010, 0x1600, 20},   // Power control1 

    

    // 显示设置

    {0x0001, 0x0927,   0},  // Driver output setting (240x320 mode, GS="0", SS="1")

    {0x0002, 0x0700,   0},  // LCD driving waveform setting

    {0x0003, 0x1030,   0},  // Entry mode setting (TRI=0, DFM="0", BGR="1", ID1:ID0 =11)

    {0x0007, 0x0004,   0},  // Display control1 (VLE2:VLE1=00, REV="1")

    {0x0008, 0x0505,   0},  // Display control2

    {0x0009, 0x0000,   0},  // ***

    

    {0x0040, 0x0000,   0},  // Gate scan position (start G1 scan)

    {0x0041, 0x0000,   0},  // Vertical scroll setting

    {0x0042,    319,   0},  // Screen end position (320-1)

    {0x0043,      0,   0},  // Screen start position (0)

    {0x0044,      0,   0},  // 2th Screen end position

    {0x0045,      0,   0},  // 2th Screen start position

    {0x0046, 0xEF00,   0},  // window addr set for x0,x1 (0, 239)

    {0x0047, 0x013F,   0},  // window addr set for y0    (319)

    {0x0048, 0x0000,   20}, // window addr set for y1    (0)

    

    {0x0030, 0x0404,   0},  // Gamma control1

    {0x0031, 0x0006,   0},  // Gamma control2

    {0x0032, 0x0000,   0},  // Gamma control3

    {0x0033, 0x0202,   0},  // Gamma control4

    {0x0034, 0x0707,   0},  // Gamma control5

    {0x0035, 0x0107,   0},  // Gamma control6

    {0x0036, 0x0303,   0},  // Gamma control7

    {0x0037, 0x0202,   0},  // Gamma control8

    {0x0038, 0x1100,   0},  // Gamma control9

    {0x0039, 0x1100,   0},  // Gamma control10

    

    // 打开显示

    {0x0007, 0x0015,  40},  // Display control (GON=1, open disp)

    {0x0007, 0x0017,  40},

    {0x0020, 0x0000,   0},  // set GRAM addr(AD7--0)

    {0x0021, 0x0000,  20},  // set GRAM addr(AD16--8)

    

    {DATA_END,    0,  0}

};







/*******************************************************

* 名称: TftInit

* 功能: 初始化TFT液晶模块。

* 入口参数: 无

* 出口参数: 无

*******************************************************/

void  TftInit(void)  

{   STCOM_INI  init_dat;

    int  i;

   

    TftReset();    //初始化的时候要先拉低电压

    for(i=0; i<100; i++) // 设定最多100条初始化命令

    {   init_dat = TFT4267_INI;

        if(init_dat.com==DATA_END) break;

      

        TftSendCom(init_dat.com);

        TftSendDat(init_dat.dat);            

        DelaymS(init_dat.dly);      

    }

}



2.3 还要提供几个基本的函数供上层调用,比如取点,画线函数。有了这几个函数就可以实现复杂的图。比如圆,椭圆等。




/****************************************************************************

* 名称:GUI_Point()

* 功能:在指定位置上画点。

* 入口参数:x 指定点所在列的位置

*           y 指定点所在行的位置

*           color 显示颜色

* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。

****************************************************************************/

uint8  GUI_Point(uint16 x, uint16 y, TCOLOR color)

{  /* 参数过滤 */

   if(x>=GUI_LCM_XMAX) return(0);

   if(y>=GUI_LCM_YMAX) return(0);

   

   /* 刷新显示 */

   TftSetWrite(x, y);

   TftSendDat(color);

   

   return(1);

}





/****************************************************************************

* 名称:GUI_ReadPoint()

* 功能:读取指定位置点的颜色数据。

* 入口参数:x 指定点所在列的位置

*           y 指定点所在行的位置

* 出口参数:返回值即是读出值(RRRRRGGGGGGBBBBB)。

****************************************************************************/

uint8  GUI_ReadPoint(uint16 x, uint16 y, TCOLOR *ret)

{  uint16  bak;



   /* 参数过滤 */

   if(x>=GUI_LCM_XMAX) return(0);

   if(y>=GUI_LCM_YMAX) return(0);

   

   /* 读取数据 */

   TftSetAddr(x, y); // 设置地址

   TftSendCom(WR_RD_DATA);

   bak = TftRcvDat();

//   bak = TftRcvDat();      

   *ret = bak;

   

   return(1);

}





/****************************************************************************

* 名称:GUI_HLine()

* 功能:画水平线。

* 入口参数:x0 水平线起点所在列的位置

*           y0 水平线起点所在行的位置

*           x1      水平线终点所在列的位置

*           color 显示颜色

* 出口参数:无

* 说明:操作失败原因是指定地址超出缓冲区范围。

****************************************************************************/

void  GUI_HLine(uint16 x0, uint16 y0, uint16 x1, TCOLOR color) 

{  uint16  bak;



   if(x0>x1) // 对x0、x1大小进行排列,以便画图

   {  bak = x1;

      x1 = x0;

      x0 = bak;

   }

      

   GUI_Point(x0, y0, color); // 显示第一点

   x0++;

   while(x1>=x0)

   {  TftSendDat(color); // 不断填充并显示

      x0++;

   }

}





/****************************************************************************

* 名称:GUI_RLine()

* 功能:画垂直线。

* 入口参数: x0 垂直线起点所在列的位置

*           y0 垂直线起点所在行的位置

*           y1      垂直线终点所在行的位置

*           color 显示颜色

* 出口参数:无

* 说明:操作失败原因是指定地址超出缓冲区范围。

****************************************************************************/

void  GUI_RLine(uint16 x0, uint16 y0, uint16 y1, TCOLOR color) 

{  uint16  bak;



   if(y0>y1) // 对y0、y1大小进行排列,以便画图

   {  bak = y1;

      y1 = y0;

      y0 = bak;

   }

   

   while(y1>=y0)

   {  GUI_Point(x0, y0, color); // 逐点显示,描出垂直线

      y0++;

   }

}





 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条