解决LCD与LED显示冲突问题
不知道大家在开发过程中有没有碰到:LCD与LED同时(宏观上的同时)点亮时产生的LED状态紊乱问题。
![【蓝桥杯】一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示](https://imgs.yssmx.com/Uploads/2023/04/411258-1.png)
为了解决上述问题,小编给出了以下三种解决方案:
方案一:
每次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是怎么的吧,其位置分布图为:
![【蓝桥杯】一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示](https://imgs.yssmx.com/Uploads/2023/04/411258-5.png)
![【蓝桥杯】一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示](https://imgs.yssmx.com/Uploads/2023/04/411258-6.png)
这段话说的是:
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); //从右往左
(由于翻转后,小编码不清楚东南西北,因此采用这种方式表达🤣🤣🤣。)文章来源:https://www.toymoban.com/news/detail-411258.html
![【蓝桥杯】一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示](https://imgs.yssmx.com/Uploads/2023/04/411258-11.jpeg)
测试结果图
蓝桥杯官方给的驱动就采用第一种方式,因此一直以来显示的数据咱都看起来是正的。😉😉😉文章来源地址https://www.toymoban.com/news/detail-411258.html
到了这里,关于【蓝桥杯】一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!