📄 lcddrive.c
字号:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:TFT4267液晶模块驱动。驱动芯片为S6D0129 (片内172800字节GRAM,即240*320*18/8),
*
* RGB对应值(16位数据,d15--d0):
* d15--d11 R色
* d10--d5 G色
* d4--d0 B色
* 写操作时地址计数器会自动增长,而读操作则不会自动增长。读操作时,读第2个数
* 据才是有效的数据
****************************************************************************************/
#include "LPC2294.h"
#include "lcddrive.h"
/*******************************************************
* 名称: 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);
}
/*******************************************************
* 名称: TftSetWindow
* 功能: 设置数据填充窗口大小。
* 入口参数: x0,y0 窗口左上角从标
* x1,y1 窗口右上角从标
* 出口参数: 设置正确返回TRUE,参数错误返回FALSE
*******************************************************/
uint8 TftSetWindow(uint16 x0, uint16 y0, uint16 x1, uint16 y1)
{ uint16 hea_hsa;
// 参数过滤
if(x1>239) x1 = 239;
if(y1>319) y1 = 319;
if((x1<=x0) || (y1<=y0)) return(FALSE);
// 设置数据填充窗口大小
hea_hsa = (x1<<8) | x0;
TftSendCom(SET_WINDOW_SX_EX);
TftSendDat(hea_hsa);
TftSendCom(SET_WINDOW_SY);
TftSendDat(y0);
TftSendCom(SET_WINDOW_EY);
TftSendDat(y1);
return(TRUE);
}
/*******************************************************
* 名称: DelaymS
* 功能: 软件延时(1mS,与系统时钟有关)。
* 入口参数: no 延时控制(uint32),值越大延时越长
* 出口参数: 无
*******************************************************/
void DelaymS(uint32 no)
{ uint32 i;
for(; no>0; no--)
{ for(i=0; i<900; i++);
}
}
/****************************************************************************
* 名称:TFT_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat 填充的数据
* 出口参数:无
****************************************************************************/
void TFT_FillSCR(uint16 dat)
{ uint16 i, j;
TftSetWindow(0,0, 239, 319);
TftSetWrite(0, 0);
for(i=0; i<GUI_LCM_YMAX; i++) // 历遍所有行
{ for(j=0; j<GUI_LCM_XMAX; j++) // 历遍所有行
{ TftSendDat(dat); // 填充数据
}
}
}
/*******************************************************
* 名称: TftReset
* 功能: 控制TFT液晶模块复位。
* 入口参数: 无
* 出口参数: 无
*******************************************************/
void TftReset(void)
{ PINSEL1 = PINSEL1 & (~(0x03<<12));
IO0DIR = IO0DIR | S6D0129_RST;
IO0CLR = S6D0129_RST;
DelaymS(10);
IO0SET = S6D0129_RST;
DelaymS(10);
}
// 定义TFT4267初始化数据信息
STCOM_INI TFT4267_INI[] =
{ // 电源设置
{0x0000, 0x0001, 10}, // Start Oscillation
{0x000B, 0x0000, 0}, // Frame cycle setting
{0x000C, 0x0000, 15}, // External display interface setting
{0x0011, 0x2E00, 0}, // Power control2 setting
{0x0014, 0x1119, 0}, // Power control5 setting
{0x0010, 0x1040, 15}, // Power control1 setting
{0x0013, 0x0040, 15}, // Power control4 setting
{0x0013, 0x0060, 15}, // Power control4
{0x0013, 0x0070, 60}, // Power control4
{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);
}
}
/*******************************************************
* 名称: TFT_UpdateRects
* 功能: 更新LCM显示区域。更新数据在Framebuffer中。
* 入口参数: x,y 更新区域的起始点
* w,y 区域宽度和高度
* buffer Framebuffer起始地址
* 出口参数: 无
*******************************************************/
void TFT_UpdateRects( int x, int y, // 起始点坐标
int w, int h, // 区域宽度、高度
uint16 *buffer) // Framebuffer起始地址
{ int i, j;
uint16 *addr;
#if SWAP_XY_EN==1
int Xok, Yok;
#endif
// 需填充区域参数过滤
if(x<0)
{ w = w + x;
x = 0;
}
if(y<0)
{ h = h + y;
y = 0;
}
#if SWAP_XY_EN==1
if( x > (GUI_LCM_YMAX-1) ||
y > (GUI_LCM_XMAX-1)
)
{ return;
}
if((x+w) > (GUI_LCM_YMAX-1))
{ w = GUI_LCM_YMAX - x;
}
if((y+h) > (GUI_LCM_XMAX-1))
{ h = GUI_LCM_XMAX - y;
}
#else
if( x > (GUI_LCM_XMAX-1) ||
y > (GUI_LCM_YMAX-1)
)
{ return;
}
if((x+w) > (GUI_LCM_XMAX-1))
{ w = GUI_LCM_XMAX - x;
}
if((y+h) > (GUI_LCM_YMAX-1))
{ h = GUI_LCM_YMAX - y;
}
#endif
if((w<=0) || (h<=0)) return;
/*
若需要交换x、y轴,则Yok = x, Xok = GUI_LCM_XMAX - y-1。
则填充矩形算法为:
起点为(GUI_LCM_XMAX - y - h, x);
每一行数据个数为h个字节,共w行数据;
行数据起始点地址:addr = buffer + ((y + h - 1)*GUI_LCM_YMAX + x) + i (第i行,n为0--w)。
同一行中,下一点数据地址变化:addr = addr - GUI_LCM_YMAX;
以上所说的"行"、Xok和Yok,是针对液晶屏的。
*/
#if SWAP_XY_EN==1
Xok = (int)GUI_LCM_XMAX - (y + h);
Yok = x;
for(i=0; i<w; i++) // 输出w行数据
{ // 计算出更新区域的buffer地址
addr = buffer + ((y + h - 1)*GUI_LCM_YMAX + x) + i;
// 输出一行(w个)数据
TftSetWrite(Xok, Yok);
for(j=0; j<h; j++)
{ TftSendDat(*addr);
addr = addr - GUI_LCM_YMAX;
}
// 指向下一行
Yok++;
}
#else
for(i=0; i<h; i++) // 输出h行数据
{ // 计算出更新区域的buffer地址
addr = buffer + (y*GUI_LCM_XMAX + x);
// 输出一行(w)数据
TftSetWrite(x, y);
for(j=0; j<w; j++)
{ TftSendDat(*addr);
addr++;
}
// 指向下一行
y++;
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -