这段时间玩转STM32F103ZET6接TFT彩屏ILI9325遇到的轴显示镜像问题,在网上查了很多资料,可能是自己能力问题,看完都没解决问题。自己对ILI9325数据手册[ILI9325DS_V0.29.pdf]详细看完以后,终于解决了,所以分享出来给大家,希望大家少走弯路。
首先说一下TFT彩屏ILI9325的工作模式。(看这个文章,必须要有LED灯点亮的基础)
1、彩屏横轴方向(240)是控制显示颜色的(320X240中的240点位,实际控制是(R线+G线+B线)*240,实际是上3*240=720根线,这720根线为S1-S720,即3根线(RGB)一组控制240个点位)。
2、彩屏竖轴方向(320)是门电路G1-G320,是控制哪一行通电。即当S线设置好颜色了,G哪行亮,哪行就显示S线设置的颜色。
3、TFT屏默认的显示方向是:S1->S720为一行的颜色设置,G1-G320总共有320行(S1->S720),那么总供的输出点实际上是(240*3)*320=230400个点位。
一、只要求X轴镜像恢复正常。把Source即RGB控制扫描方式反过来就可以了。
程序编译完成,下载正常,可是显示却X镜像了,如下图。
在网上多方查找,说要改什么I/D0,I/D1,实践结果根本不行。
后在网上下载了TFT彩屏的ILI9325数据手册,发现,只要改01h下的D8寄存器值就可以了。
相信大家看完就该理解了。
以下是改完以后的显示图片
顺代把源程序复制出来。
[头文件tftlcd.h]
#define TFTLCD_ILI9325
其中这个是更改横竖屏显示方向的。
#define TFTLCD_DIR 0 //0:竖屏 1:横屏 默认竖屏
[文件tftlcd.c]
只写出更改的部分
//设置LCD显示方向
//dir:0,竖屏;1,横屏
void LCD_Display_Dir(u8 dir)
{
if(dir==0) //默认竖屏方向
{
#ifdef TFTLCD_ILI9325
/*这里面是原来的设置
// LCD_WriteCmd(0x0001);
// LCD_WriteData(0x0100);
// LCD_WriteCmd(0x0003); //设置彩屏显示方向的寄存器
// LCD_WriteData(0x1030);
*/
LCD_WriteCmd(0x0001);
LCD_WriteData(0x0000);
LCD_WriteCmd(0x0003); //设置彩屏显示方向的寄存器
LCD_WriteData(0x1030);
tftlcd_data.height=320;
tftlcd_data.width=240;
#endif
}
else {
#ifdef TFTLCD_ILI9325
/*这里面是原来的设置
// LCD_WriteCmd(0x0001);
// LCD_WriteData(0x000);
// LCD_WriteCmd(0x0003); //设置彩屏显示方向的寄存器
// LCD_WriteData(0x1038);
*/
LCD_WriteCmd(0x0001);
LCD_WriteData(0x0100);
LCD_WriteCmd(0x0003); //设置彩屏显示方向的寄存器
LCD_WriteData(0x1038);
tftlcd_data.height=240;
tftlcd_data.width=320;
#endif
}
二、如果要X1,Y1->X240,Y320完全倒过来,那么只要设置S1-S720和Y1-Y320全反过来扫描就可以了。
原始图片是这样的:
而我们希望输出是这样的。
我们发现,只是Y轴的方向显示颠倒了,那么只要改门极电路(G1-G320) 的输出方向即可。
那么怎么改门极方向呢?
查资料,只要改R60H寄存器的D15(GS位)就可以了。
以下是更改的程序关键部分:
#ifdef TFTLCD_ILI9325
u16 ttData;
LCD_WriteCmd(0x0001);
LCD_WriteData(0x0100);
LCD_WriteCmd(0x0003); //设置彩屏显示方向的寄存器
LCD_WriteData(0x1030);
LCD_WriteCmd(0x0060); //指针移到TypeLCDBASE+0x60,即G门的内存偏移地址
ttData=TFTLCD->LCD_DATA;//读取原始数据
LCD_WriteCmd(0x0060);//指针移到TypeLCDBASE+0x60,即G门的内存偏移地址这句有点多余
LCD_WriteData(ttData|0x8000);//[15:0]]第15位置1。当然,如果要反过来,只要15位置0即可。(置0是ttData&0x7FFF,别弄反了。)
tftlcd_data.height=320;
tftlcd_data.width=240;
#endif
本人也是刚开始学习单片机,有不对的地方,还望指教。