蓝桥杯嵌入式赛道解决LCD和LED引脚冲突的问题

37 阅读1分钟

简介

在蓝桥杯嵌入式赛道中,STM32G431RBT6 官方开发板存在 LCD(ILI9341)与板载 LED(LD1-LD4)引脚冲突 的核心问题,根源是两者共用了 GPIOC 的部分引脚

原理图分析

image.png

74LS573 是一款经典的 TTL 电平、8 位三态输出 D 型锁存器,属于 74LS 系列逻辑芯片,在数字电路、单片机外设扩展等场景中应用非常广泛。 PD2高电平是Q端状态改变,D端也会改变。通过控制PD2与解决LCD与LED间的引脚冲突问题。

main.c中的初始化

  LCD_Init();
  LED_ON(3);
  LCD_Clear(Black);    //清除lcd为黑色
  LCD_SetBackColor(Black);   //设置背景颜色为黑色
  LCD_SetTextColor(White);   //设置字体颜色为白色

添加上lcd.c中通过提前保存状态,LCD操作完复位LED的状态,实现端口共用。

用到那些led的函数,观察了里面是否对GPIOC的引脚状态有改动,就使用相同方法。

void LCD_Init(void)
{
	u16 state=GPIOC->ODR;     **//提前保存GPIOC的状态**
    LCD_CtrlLinesConfig();
    dummy = LCD_ReadReg(0);

    if(dummy == 0x8230)
    {
        REG_8230_Init();
    }
    else
    {
        REG_932X_Init();
    }
    dummy = LCD_ReadReg(0);
	GPIOC->ODR=state;          **//恢复LED状态**
}
void LCD_Clear(u16 Color)
{
	u16 temp=GPIOC->ODR;     **//提前保存GPIOC的状态**
    u32 index = 0;
    LCD_SetCursor(0x00, 0x0000);
    LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
    for(index = 0; index < 76800; index++)
    {
        LCD_WriteRAM(Color);
    }
	GPIOC->ODR=temp;      **//恢复LED状态**
}
void LCD_DisplayStringLine(u8 Line, u8 *ptr)
{
	uint16_t temp=GPIOC->ODR;
    u32 i = 0;
    u16 refcolumn = 319;//319;
    while ((*ptr != 0) && (i < 20))	 //	20
    {
        LCD_DisplayChar(Line, refcolumn, *ptr);
        refcolumn -= 16;
        ptr++;
        i++;
    }
	GPIOC->ODR=temp;
}