不知道大家在开发过程中有没有碰到:LCD与LED同时(宏观上的同时)点亮时产生的LED状态紊乱问题。
每次LCD显示完成数据后,关闭所有LED一次。
但是使用该方法比较麻烦,并且如果想要反转LED的状态,还必须使用变量保存上一次LED的状态。详细代码可见下图:
方案2:借助寄存器BRR
STM32中是将
BRR
定义为:
__IO uint32_t BRR; //!< GPIO Bit Reset register, Address offset: 0x28
其意思为:GPIO 位复位寄存器;也就是说可以通过该寄存器将值复位(置0);
由于HAL库中提供了该寄存器的操作接口,我们直接使用该接口即可:void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
,其中参数1为GPIO分组,参数2为GPIO引脚,参数3为重置或设置。
具体操作可见下图的详细代码:
方案3:修改LCD的显示函数
通过阅读官方提供的LCD源码以及小编自己的LED显示函数,得知导致LED显示紊乱的“罪魁祸首”是LCD显示修改了LED对应引脚的值,那么我们是不是可以修改LCD的显示函数呢?
由于LCD每次显示一定需要修改LED对应引脚的值,那么是不是可以在LCD显示前保存LED的值呢。
在GPIO组结构体中,寄存器ODR
是输出端寄存器,内部存储输出数据,因此在显示前保存寄存器ODR
的值,显示完成后在恢复即可。
经过小编查找,发现有LCD显示与最终三个函数有关,因此,只需要在这三个函数起始位置保存ODR
的值,事后恢复即可,函数为:void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue); void LCD_WriteRAM_Prepare(void); void LCD_WriteRAM(u16 RGB_Code);
示例操作代码可见下图:
上述三种方法的实质:无非是先保存值,然后恢复。实质上是一样的,因此,只要大家明白这个思路,那么解决这个方法还是很简单的。
首先大家来看看G1~G320是怎么的吧,其位置分布图为:
由于官方提供了三个芯片手册,即932x系列与8230芯片,因此,咱首先要弄清楚自己手上的开发板附带的LCD显示屏的驱动芯片属于啥型号。 LCD硬件初始化时,其初始化函数如下: 由于其初始化只有两种情况,经测试,小编的LCD驱动使用的是下面那种,因此,其芯片手册是属于ILI932x的。 经过查找芯片手册(两个芯片手册其实差不多):这段话说的是:
IL19325的LCD驱动电路由一个720输出源极驱动器(S1~S720)和一个320输出门组成驱动器(G1 ~ G320)。当输入720“位数据时,显示模式数据被锁存并生成驱动波形。用于扫描栅极线的栅极驱动器输出VGH或VGL水平。源极驱动器720个源极输出的移位方向由SS位和用GS位设置来自栅极驱动器的栅极输出的移位方向。 栅极驱动器的扫描模式为用SM位设置。这些位允许为LCD模块设置适当的扫描方法。
最终确定可以控制LCD显示内容反转的两个控制器为GS与SS这两位。
GS的相关描述
结合G1~G320的位置图有:
当GS = 0时,扫描方向为G1 ~ G320。(可以理解为从左往右)
当GS = 1时,扫描方向为G320 ~ G1。(可以理解为从右往左)
但是这玩意,它不是一个单独的寄存器,它只是一个寄存器里的一部分,即R60。
SS的相关描述
SS:选择源驱动输出的移位方向。
当SS = 0时,输出的移位方向从S1至S720(可以理解为输出方向从上往下)
当SS = 1时,输出的移位方向从S720至S1(可以理解为输出方向从下往上)
因为,如果需要实现自己的翻转模式,只需要控制SS与GS的值即可:
方式一: 显示刷新时,按照从上往下,从左往右的顺序刷新
LCD_WriteReg(R1 , 0x0000); //从上往下
LCD_WriteReg(R96 , 0x2700); //从左往右
方式二:显示刷新时,按照从上往下,从右往左的顺序刷新
LCD_WriteReg(R1 , 0x0000); //从上往下
LCD_WriteReg(R96 , 0xA700); //从右往左
方式三:显示刷新时,按照从下往上,从左往右的顺序刷新
LCD_WriteReg(R1 , 0x0100); //从下往上
LCD_WriteReg(R96 , 0x2700); //从左往右
方式四:显示刷新时,按照从下往上,从右往左的顺序刷新
LCD_WriteReg(R1 , 0x0100); //从下往上
LCD_WriteReg(R96 , 0xA700); //从右往左
(由于翻转后,小编码不清楚东南西北,因此采用这种方式表达。)
蓝桥杯官方给的驱动就采用第一种方式,因此一直以来显示的数据咱都看起来是正的。