新闻  |   论坛  |   博客  |   在线研讨会
LCD drive 学习笔记LCD drive 学习笔记
mayer | 2009-05-22 18:42:24    阅读:1136   发布文章

LCD drive 学习笔记

 

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[i];
        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++;
   }
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客