GS=0,SS=0时,SM=1时,由于此时G通道是隔行扫描的,先送G1,G3,……G317,319再从G2,G4扫到G320,就像食堂打饭,本来正常顺序是从第一人开始顺序打饭,但是如果队伍不变,但是隔一个人打饭,假设从奇数个开始打饭,那么先给所有奇数个打饭,之后才给排偶数的人打饭,这就造成偶数个打到的都是剩饭剩菜。但是液晶还有一个S通道,S通道是顺序扫描,两种效果叠加,所以最终显示结果是下半部图像和上半部调换并被拉长。故此得出结论,SM一定要设置为0!
其中 TRI DFM均默认0,不解释,BGR置为1,BGR为1表示写入GRAM的数据格式是按B G
R的顺序存放的,设置错误图像会按照逆序的RGB颜色显示,若发现显示颜色有误,改BGR为0就好了。
下一期将对横屏模式作分析,敬请关注。由于水平有限,有错漏的地方请见谅,敬请斧正。
源程序请到以下地址下载查看:
一、竖屏显示
要想实现横屏显示,首先要了解竖屏显示的操作方法,前面说过原点位置(0,0)位于屏幕左上角,对于ILI9325(0,0)位置也是显存地址00000H对应的地方,为什么用00000H而不用0H表示呢,因为Gram低八位用于表示X轴坐标,范围从0~EFH(0~239),高12位用于Y轴地址坐标,范围从0~13FH(0~319),所以右下角终点地址是13FEFH。但坐标地址并不是连续的,因为13FEFH
=
81903,这与屏幕像素点总数与240*320=76800并不相等,因为低八位最大值是EFH,但不要紧,这个问题并不影响操作。默认情况下,每次向gram中写像素数据,iLI9325的gram地址自动先从左到右,再从上到下增加。ILI9325用R20H和R21H两个寄存器来确定GRAM地址
所以我们在某个点写数据的过程是:
1.向寄存器R20H,R21H写像素地址
2.写一次R22H命令,通知ILI9325准备接受RGB数据
3.写RGB数据
二、划定窗口连续写数据
按照第一节介绍的方法我们发现如果要在某个矩形区域连续写同种颜色数据,每次都需要重新定义GRAM地址,效率很低,实际上可以通过划定区域来向指定窗口区域中连续输入数据,因为GRAM地址会按照寄存器R03H中的ORG
AM ID确定的方向自动增/减,而且竖屏的时候。ORG =
1时,当通过50H~53H划定区域时,芯片将GRAM地址00000H映射到窗口区域的某个顶点(根据AM、ID的设置,见下图中各种模式中字母B的位置就是00000H的位置(Begin)),这样就可以再横屏显示时也可以划定区域连续填数据。
一般情况下,竖屏显示时让ORG = 0,因为很多人都会选择ID =
11,AM=0的模式(下图中右上角的模式,看字字母"F"的正常情况下的朝向),这样区域填充数据时就符合使用者常规视觉上的理解,不用做坐标转换,。此时,因为ORG
= 0,即使通过R50~53H划定窗口,但是00000H依然是在屏幕的左上角,而不是窗口区域的左上角!且此时向R20H
R21H写的地址必须是窗口内的地址,否则无效。
横屏显示时,令ORG =
1,这样我们划区域时GRAM起始地址00000H就始终映射到窗口中起点B的位置,此时地址自增的方向才符合人体视觉上的从左到右,从上到下。我选择ID = 10
,AM=1 ,对应下图中的第二排第二种模式。记得此时要么SS=1 GS=1,要么SS=0,GS = 0,不懂什么意思请看上一篇。
程序代码如下:
//设置光标位置
//Xpos:横坐标
//Ypos:纵坐标
__inline void LCD_SetCursor(u16 Xpos, u16
Ypos)
{
if(DeviceCode==0X52)
{
LCD_WriteReg(0x02,
Xpos>>8);//起点x高八位
LCD_WriteReg(0x03,
Xpos); //起点x低八位
LCD_WriteReg(0x06,
Ypos>>8);//起点y高八位
LCD_WriteReg(0x07, Ypos); //起点y低八位
}else
if(DeviceCode==0X9325)
{
#if USE_HORIZONTAL ==
0
LCD_WriteReg(0x50, Xpos);
LCD_WriteReg(0x51, LCD_W);
//把终点定在屏幕右下角,确保Xpos有效,因为0x50的值必须<0x51的值
LCD_WriteReg(0x52,
Ypos);
LCD_WriteReg(0x53, LCD_H);
#else
LCD_WriteReg(0x50,
Ypos);
LCD_WriteReg(0x51, 239);
//把终点定在屏幕右下角,确保Xpos有效,因为0x50的值必须<0x51的值
LCD_WriteReg(0x52,
0); //把终点定在屏幕右下角,确保Xpos有效,因为0x52的值必须<0x53的值
LCD_WriteReg(0x53,
319-Xpos);
#endif
LCD_WriteReg(0x20, 0x0000);
LCD_WriteReg(0x21,
0x0000);
}
LCD_WR_REG(WriteGram); //准备写入ram
}
//LCD_SetDomain:设定窗口区域写数据
//Xsta , Ysta:起点横坐标和纵坐标
//Xend ,
Yend:终点横坐标和纵坐标
void LCD_SetDomain(u16 Xsta, u16 Ysta,u16 Xend, u16
Yend)
{
if(DeviceCode==0X52)//HX8352
{
LCD_WriteReg(0x02,
Xsta>>8);//起点x高八位但由于最大值为239,故高八位始终为0,可不写
LCD_WriteReg(0x03,
Xsta); //起点x低八位
LCD_WriteReg(0x04,
Xend>>8);//终点x高八位
LCD_WriteReg(0x05,
Xend); //终点x低八位
LCD_WriteReg(0x06,
Ysta>>8);//起点y高八位
LCD_WriteReg(0x07, Ysta);
//起点y低八位
LCD_WriteReg(0x08,
Yend>>8);//终点y高八位
LCD_WriteReg(0x09, Yend); //终点y低八位
}
else
if(DeviceCode==0X9325) //ILI9325
{
#if USE_HORIZONTAL == 0
LCD_WriteReg(0x50, Xsta); //水平GRAM起始位置
LCD_WriteReg(0x51, Xend); //水平GRAM终点位置
LCD_WriteReg(0x52, Ysta);
//水平GRAM起始位置
LCD_WriteReg(0x53, Yend);
//垂直GRAM终点位置
//50h和52h是起点,51h和53h是终点
#else
LCD_WriteReg(0x50,
Ysta); //水平GRAM起始位置
LCD_WriteReg(0x51, Yend);
//水平GRAM终点位置
LCD_WriteReg(0x52, 319-Xend);
//垂直GRAM起始位置
LCD_WriteReg(0x53, 319-Xsta);
//垂直GRAM终点位置
#endif
LCD_WriteReg(0x20, 0x0000);
LCD_WriteReg(0x21,
0x0000);
}
LCD_WR_REG(WriteGram); //准备写入ram
}
在上面代码中,为什么写50H~53H写数据时坐标特别呢,因为上一篇说过,ILI9325的GRAM地址与屏幕的对应关系是不会改变的,不管怎么设置50H和51H始终是竖屏时的横坐标,52H和53H始终和竖屏时的纵坐标一样,这样一来,只能坐标转换了,横屏时看上去的坐标转换到竖屏的坐标图上去,使(0,0)位置通过程序映射到横屏时的左上角,好了,ILI9325的笔记到此为止,摸清了ILI9325,相信其他液晶控制IC也就能举一反三了。