目录
前言
上几篇介绍 STM32F103RCT6+0.99寸TFT圆屏 SPI显示 的各个方法,使用的屏是 黄保凯中景园0.99寸TFT LCD彩屏高清IPS显示屏液晶屏GC9107圆屏 ,2025年4月份购买的这个屏,显示正常,就是4月份后买的屏,有一大半屏显示出现很多彩点,一小部分显示正常。一开始以为是发送数据过快导致的,用软件SPI来运行,还是有很多彩点,然后就怀疑是不是屏坏了,拿那些显示出现彩点的屏寄给商家,程序也发给商家,商家处理了几天,才告知驱动程序已经更新了,之前的是旧的;关键是4月份之前买的屏显示都问题,估计是商家4月份后才更新了驱动芯片和驱动程序。
如果你发现买的屏是新版屏且用旧驱动显示有彩点,那就可以看这篇文章,采用新驱动来显示能够解决彩点问题,不知道商家还会不会更新驱动芯片和驱动程序,如果以后你发现用这个新驱动显示还是有彩点,那就说明商家已经更新了驱动芯片和驱动程序,可以直接问商家或找商家要。
一、驱动问题简析
4月份之后生产的屏幕,有一小部分屏幕支持旧驱动,大部分屏幕不支持,不支持旧驱动的屏,可以显示图片,但是会有很多彩点,如1图:
图1
不知道4月份之前的屏幕支不支持新驱动,没试过,烧录新驱动到新屏中,就会消除绝大部分彩点,显示复杂的图片时,仔细一看还是会有一点点的彩点,想要完全没有彩点,就得改驱动,如果不知道怎么改,可以直接交给厂家改,毕竟术业有专攻。彩点消除如图2:
图2
二、驱动程序解析
那变更的内容不多,主要是集中在初始化参数那里,其他都不变,也就是只有lcd_init.c那里变更。
1、LCD_Address_Set函数
旧版本
if(USE_HORIZONTAL==0)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);//列起始地址
LCD_WR_DATA(x2);//列结束地址
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+45);//行起始地址
LCD_WR_DATA(y2+45);//行结束地址
LCD_WR_REG(0x2c);//储存器写
}
设置横屏显示是在行地址设置那里加45,而新版本是加13
新版本
if(USE_HORIZONTAL==0)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+13);
LCD_WR_DATA(y2+13);
LCD_WR_REG(0x2c);//储存器写
}
其他横屏竖屏、镜像等也是这样,只是加的数值不一样
2、LCD_Init函数
这里更改的内容就可多了,改了一大半。
①复位
旧版本
LCD_GPIO_Init();//初始化GPIO
LCD_RES_R_Clr();//复位
delay_ms(100);
LCD_RES_R_Set();//取消复位
delay_ms(100);
复位方式不一样了,咱也不懂能不能换成旧版本的复位方式,毕竟咱也不是这方面的行家,大家可以去尝试一下。
新版本
LCD_GPIO_Init();//初始化GPIO
LCD_RES_Set();
delay_ms(50);
LCD_RES_Clr();
delay_ms(50);
LCD_RES_Set();
delay_ms(120);
②背光
旧版本需要设置开启背光,而新版本则取消了,问了商家,商家说背光是默认打开的。
背光跟液晶ic两个是独立的。我之前设置过旧版本屏,是默认关闭的,而且背光开启后关闭不了,发现新版本屏可以开,也可以关,也就是说可以通过PWM来调屏的亮度。调试过了,PWM频率只有在50Hz以上(也就是20ms以内),人的肉眼才不会感觉出屏闪,PWM频率越高,调亮度的效果越好,用硬件PWM或软件模拟PWM都可以,大家可以试一下。
③LCD显示方向
设置LCD的显示方向的位置变了,旧版本是放在前面的,而新版本是放在后面
④然后就是初始化各种参数了
这个可是重中之中,有一个参数设错,都有可能影响到显示效果,旧版本的备注是根据显示屏的手册+理解加上的,大家不理解,可以去看显示屏手册。
旧版本
//Inter_command设置为高电平,只有硬件或软件复位才能将其设置为低电平。
LCD_WR_REG(0xFE);//Inter 寄存器使能 1命令
LCD_WR_REG(0xEF);//Inter寄存器使能 2 命令
LCD_WR_REG(0xB0); //设置对比度数值命令
LCD_WR_DATA8(0xC0); //对比度数值,这个要自己试验一下最佳效果。
//要访问“EAh”,需要将“B2h”的位 [2] 设置为 1
//要访问“E8h”,需要将“B2h”的位 [0] 设置为 1
//要访问“E9h”,需要将“B2h”的位 [1] 设置为 1
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x2f);
//要访问“F0h”,需要将“B3h”的位 [0] 设置为 1
//要访问“F1h”,需要将“B3h”的位 [1] 设置为 1
LCD_WR_REG(0xB3);
LCD_WR_DATA8(0x03);
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x01);
//要访问“ACh”,需要将“B6h”的位 [4] 设置为 1
//要访问“A8h”,需要将“B6h”的位 [0] 设置为 1
LCD_WR_REG(0xB6);//显示功能控制命令
LCD_WR_DATA8(0x19);
LCD_WR_REG(0xAC);//RGB 565的补码原理
LCD_WR_DATA8(0xDB);//R0=B0=G0
LCD_WR_REG(0xAB);
LCD_WR_DATA8(0x0f);
LCD_WR_REG(0x3A); //像素格式集命令
LCD_WR_DATA8(0x05); //设置 RGB 图像数据的像素格式:16位/像素
LCD_WR_REG(0xB4);
LCD_WR_DATA8(0x04);
LCD_WR_REG(0xA8); //帧速率设置命令
LCD_WR_DATA8(0x08);//帧速率:99HZ
LCD_WR_REG(0xb8);
LCD_WR_DATA8(0x08);
LCD_WR_REG(0xea);
LCD_WR_DATA8(0x94);
LCD_WR_REG(0xe8);
LCD_WR_DATA8(0x22);
LCD_WR_REG(0xe9);
LCD_WR_DATA8(0x43);
LCD_WR_REG(0xc6);
LCD_WR_DATA8(0x21);
LCD_WR_REG(0xc7);
LCD_WR_DATA8(0x12);
LCD_WR_REG(0xF0); //设置正电压以调整 TFT 面板的伽玛特性。
LCD_WR_DATA8(0x1D);
LCD_WR_DATA8(0x45);
LCD_WR_DATA8(0x0a);
LCD_WR_DATA8(0x54);
LCD_WR_DATA8(0xB4);
LCD_WR_DATA8(0x2F);
LCD_WR_DATA8(0x35);
LCD_WR_DATA8(0x52);
LCD_WR_DATA8(0x1E);
LCD_WR_DATA8(0x0e);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x18);
LCD_WR_DATA8(0x1A);
LCD_WR_DATA8(0x1F);
LCD_WR_REG(0xF1);//设置负电压以调整 TFT 面板的伽玛特性。
LCD_WR_DATA8(0x16);
LCD_WR_DATA8(0x38);
LCD_WR_DATA8(0x1A);
LCD_WR_DATA8(0x56);
LCD_WR_DATA8(0x97);
LCD_WR_DATA8(0x2D);
LCD_WR_DATA8(0x2E);
LCD_WR_DATA8(0x56);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x06);
LCD_WR_DATA8(0x16);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x1E);
新版本
LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0xFE);
LCD_WR_REG(0xEF);
LCD_WR_REG(0xB0);
LCD_WR_DATA8(0xC0);
LCD_WR_REG(0xB1);
LCD_WR_DATA8(0x80);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x27);
LCD_WR_REG(0xB3);
LCD_WR_DATA8(0x13);
LCD_WR_REG(0xB6);
LCD_WR_DATA8(0x19);
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0xAC);
LCD_WR_DATA8(0xC8);
LCD_WR_REG(0xAB);
LCD_WR_DATA8(0x0f);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0xB4);
LCD_WR_DATA8(0x04);
LCD_WR_REG(0xA8);
LCD_WR_DATA8(0x08);
LCD_WR_REG(0xB8);
LCD_WR_DATA8(0x08);
LCD_WR_REG(0xEA);
LCD_WR_DATA8(0x02);
LCD_WR_REG(0xE8);
LCD_WR_DATA8(0x2A);
LCD_WR_REG(0xE9);
LCD_WR_DATA8(0x47);
LCD_WR_REG(0xE7);
LCD_WR_DATA8(0x5F);
LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x21);
LCD_WR_REG(0xC7);
LCD_WR_DATA8(0x15);
LCD_WR_REG(0xF0);
LCD_WR_DATA8(0x1D);
LCD_WR_DATA8(0x38);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x4D);
LCD_WR_DATA8(0x92);
LCD_WR_DATA8(0x2F);
LCD_WR_DATA8(0x35);
LCD_WR_DATA8(0x52);
LCD_WR_DATA8(0x1E);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x1F);
LCD_WR_REG(0xF1);
LCD_WR_DATA8(0x16);
LCD_WR_DATA8(0x40);
LCD_WR_DATA8(0x1C);
LCD_WR_DATA8(0x54);
LCD_WR_DATA8(0xA9);
LCD_WR_DATA8(0x2D);
LCD_WR_DATA8(0x2E);
LCD_WR_DATA8(0x56);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x1A);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x1E);
LCD_WR_REG(0xF4);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0xFF);
LCD_WR_REG(0xBA);
LCD_WR_DATA8(0xFF);
LCD_WR_DATA8(0xFF);
⑤显示开启
设置完初始化参数,就可以开启显示屏显示了
旧版本
//此命令关闭睡眠模式。使能DC/DC转换器,启动内部振荡器,面板扫描已开始。
LCD_WR_REG(0x11);//退出睡眠模式命令
delay_ms(120);//发送“睡眠”命令后需要等待 120 毫秒(“睡眠”时Out 模式),然后才能发送 Sleep Out 命令
LCD_WR_REG(0x29);//显示开启
delay_ms(120);
新版本
LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x29);
三、驱动程序更新
如果以前的文章的程序烧录进去,显示屏有彩点,可以换成新驱动,每个文章的新驱动程序都改好了(之所以不把旧程序替换成新程序,是因为显示屏的驱动可能后续还会更新,具体什么时候更新,主要看厂家,在这里不改旧程序,就是为了告诉大家,显示驱动可能)
STM32F103RCT6+0.99寸TFT圆屏 软件SPI显示(初级)_gc9107屏幕例程-CSDN博客
STM32F103RCT6+0.99寸TFT圆屏 硬件SPI+DMA显示(中级)_stm32f103 spi dma-CSDN博客
STM32F103RCT6+0.99寸TFT圆屏 硬件SPI+DMA+外部FLASH显示(高级)(一)-CSDN博客
文章对应的程序一一对应,大家选择对应的资源下载
STM32F103RCT6+0.99寸TFT原屏显示(初级)(新驱动)资源-CSDN文库
STM32F103RCT6+0.99寸TFT圆屏硬件SPI+DMA显示(中级)(新驱动)资源-CSDN文库
STM32F103RCT6+0.99寸TFT圆屏硬件SPI+DMA+外部FLASH显示(高级)(新驱动)资源-CSDN文库
总结
由于今年厂家更改了显示屏的驱动,新屏需要更新驱动程序,特在此篇文章说明和提醒,如果以后发现显示屏显示所有图片都有彩点,那就说明需要更改驱动程序了,可以直接跟厂家要新驱动程序。
各位如果觉得有不足之处或者有疑问,可以在评论上提建议和讨论,有空的话,会解答和修改不足之处。