【蓝桥杯】解决STM32G431RBT6开发板LCD与LED显示冲突问题,详解LCD翻转显示方法

文章目录

  • 解决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); //从右往左
    

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




    测试结果图

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【蓝桥杯】解决STM32G431RBT6开发板LCD与LED显示冲突问题,详解LCD翻转显示方法

    发表回复