文章目录

解决LCD与LED显示冲突问题解决LCD显示翻转问题

解决LCD与LED显示冲突问题

  不知道大家在开发过程中有没有碰到:LCD与LED同时(宏观上的同时)点亮时产生的LED状态紊乱问题。

LCD与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);

示例操作代码可见下图:

  上述三种方法的实质:无非是先保存值,然后恢复。实质上是一样的,因此,只要大家明白这个思路,那么解决这个方法还是很简单的。

解决LCD显示翻转问题

  首先大家来看看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); //从右往左

(由于翻转后,小编码不清楚东南西北,因此采用这种方式表达藍藍藍。)

测试结果图

  蓝桥杯官方给的驱动就采用第一种方式,因此一直以来显示的数据咱都看起来是正的。

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: