关于TFT彩屏ILI9325X轴显示镜像问题的解决

这段时间玩转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 

 

 本人也是刚开始学习单片机,有不对的地方,还望指教。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本程序基于51单片机和ILI9325D驱动芯片,使用C语言编写,用于驱动TFT彩屏显示心形图案。 以下是程序代码: ``` #include <reg51.h> #define LCD_DATA P2 sbit TFT_RST = P1^0; sbit TFT_CS = P1^1; sbit TFT_RS = P1^2; sbit TFT_WR = P1^3; sbit TFT_RD = P1^4; void delay_ms(unsigned int ms) { unsigned int i,j; for(i=0;i<ms;i++) for(j=0;j<125;j++); } void Write_Cmd(unsigned char cmd) { TFT_RS = 0; TFT_RD = 1; TFT_CS = 0; LCD_DATA = cmd; TFT_WR = 0; TFT_WR = 1; TFT_CS = 1; } void Write_Data(unsigned char dat) { TFT_RS = 1; TFT_RD = 1; TFT_CS = 0; LCD_DATA = dat; TFT_WR = 0; TFT_WR = 1; TFT_CS = 1; } void Init_TFT() { TFT_RST = 0; delay_ms(50); TFT_RST = 1; delay_ms(50); Write_Cmd(0x01); //软复位 delay_ms(50); Write_Cmd(0x11); //睡眠模式退出 delay_ms(50); Write_Cmd(0x3A); //设置像素数据格式为16位 Write_Data(0x55); delay_ms(50); Write_Cmd(0x29); //开显示 delay_ms(50); } void Draw_Pixel(unsigned int x, unsigned int y, unsigned int color) { Write_Cmd(0x2A); //设置X坐标 Write_Data(x >> 8); Write_Data(x & 0xFF); Write_Data((x + 1) >> 8); Write_Data((x + 1) & 0xFF); Write_Cmd(0x2B); //设置Y坐标 Write_Data(y >> 8); Write_Data(y & 0xFF); Write_Data((y + 1) >> 8); Write_Data((y + 1) & 0xFF); Write_Cmd(0x2C); //写数据 Write_Data(color >> 8); Write_Data(color & 0xFF); } void Draw_Heart() { unsigned int x, y; unsigned int color = 0xF800; //红色 for (x = 40; x < 280; x++) { for (y = 40; y < 280; y++) { if (((x - 160) * (x - 160) + (y - 160) * (y - 160) - 10000) * ((x - 160) * (x - 160) + (y - 160) * (y - 160) - 10000) * ((x - 160) * (x - 160) + (y - 160) * (y - 160) - 10000) - (x - 160) * (x - 160) * (y - 160) * (y - 160) * (y - 160) <= 0) { Draw_Pixel(x, y, color); } } } } void main() { Init_TFT(); Draw_Heart(); while(1); } ``` 程序主要包括以下几个函数: - `void delay_ms(unsigned int ms)`:延时函数,用于延时指定时间。 - `void Write_Cmd(unsigned char cmd)`:向ILI9325D芯片发送指令。 - `void Write_Data(unsigned char dat)`:向ILI9325D芯片发送数据。 - `void Init_TFT()`:初始化TFT彩屏,设置像素数据格式为16位,开启显示。 - `void Draw_Pixel(unsigned int x, unsigned int y, unsigned int color)`:在指定坐标处画一个像素点,颜色为指定颜色。 - `void Draw_Heart()`:画一个心形图案。 在`main`函数中,首先调用`Init_TFT`函数初始化TFT彩屏,然后调用`Draw_Heart`函数画一个心形图案。 心形图案的绘制采用了数学公式,即(x-160)^2+(y-160)^2-10000)^3-(x-160)^2*(y-160)^3<=0。 程序中,红色的颜色值为0xF800,表示红色为RGB565格式下的颜色值。可以根据需要修改颜色值。 需要注意的是,本程序中的像素坐标是从40开始的,因为ILI9325D芯片的像素起始坐标为(40,40),而不是(0,0),所以需要将坐标偏移40。 以上就是基于51单片机和ILI9325D驱动芯片的TFT彩屏显示心形图案的程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值