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

简介

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

原理图分析

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

main.c中的初始化

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

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

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

ini 复制代码
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状态**
}
ini 复制代码
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状态**
}
ini 复制代码
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;
}
相关推荐
La Pulga21 小时前
【FreeRTOS源码学习笔记】任务延时列表
笔记·mcu·学习·嵌入式·freertos·实时操作系统
2035去旅行21 小时前
bootcmd 详细讲解
linux·嵌入式·arm·soc
蓝天居士21 小时前
EtherCAT从入门到精通(7)
机器人·嵌入式·ethercat
蓝天居士1 天前
EtherCAT从入门到精通(10)
机器人·嵌入式·ethercat
不脱发的程序猿1 天前
GD32串口数据收进内存之后DMA如何处理?
单片机·嵌入式硬件·dma·嵌入式·串口通信·gd32
lishen22 天前
06 · 我把开发流程拆成了 AI 能执行的技能
嵌入式
§ꦿCFོ༉2 天前
嵌入式八股文—C语言入门学习(二)
c语言·学习·嵌入式·编程语言
Zwawa3 天前
两根线怎么挂住一堆设备:I2C 协议原理
c语言·单片机·嵌入式
欧西3 天前
零成本做一颗芯片:我用 OpenLane 把 SHA-256 从 Verilog 做到了 GDS
开源·嵌入式
LCG米3 天前
STM32 定时器主从模式输出精确脉冲数实测:TRGO 触发链拆解、多发一脉冲根因与干净停止时序落地
stm32·单片机·嵌入式硬件·嵌入式