前言:
众所周知,蓝桥杯嵌入式提供的STM32G431RBT6单片机存在一个问题,就是LCD和LED冲突。
解决方法:
在lcd.h文件下,对这三个函数进行修改。
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(u16 RGB_Code);
三个函数在首加上u16 pcout = GPIOC->ODR,尾加上GPIOC->ODR = pcout,在改变GPIOC的ORD寄存器的值前将其保留,直到LCD完成写操作再把值重新赋给GPIOC的ORD寄存器
效果如下:
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
u16 pcout = GPIOC->ODR;
GPIOB->BRR |= GPIO_PIN_9;
GPIOB->BRR |= GPIO_PIN_8;
GPIOB->BSRR |= GPIO_PIN_5;
GPIOC->ODR = LCD_Reg;
GPIOB->BRR |= GPIO_PIN_5;
__nop();
__nop();
__nop();
GPIOB->BSRR |= GPIO_PIN_5;
GPIOB->BSRR |= GPIO_PIN_8;
GPIOC->ODR = LCD_RegValue;
GPIOB->BRR |= GPIO_PIN_5;
__nop();
__nop();
__nop();
GPIOB->BSRR |= GPIO_PIN_5;
GPIOB->BSRR |= GPIO_PIN_8;
GPIOC->ODR = pcout;
}
void LCD_WriteRAM_Prepare(void)
{
u16 pcout = GPIOC->ODR;
GPIOB->BRR |= GPIO_PIN_9;
GPIOB->BRR |= GPIO_PIN_8;
GPIOB->BSRR |= GPIO_PIN_5;
GPIOC->ODR = R34;
GPIOB->BRR |= GPIO_PIN_5;
__nop();
__nop();
__nop();
GPIOB->BSRR |= GPIO_PIN_5;
GPIOB->BSRR |= GPIO_PIN_8;
__nop();
__nop();
__nop();
GPIOB->BSRR |= GPIO_PIN_9;
GPIOC->ODR = pcout;
}
void LCD_WriteRAM(u16 RGB_Code)
{
u16 pcout = GPIOC->ODR;
GPIOB->BRR |= GPIO_PIN_9;
GPIOB->BSRR |= GPIO_PIN_8;
GPIOB->BSRR |= GPIO_PIN_5;
GPIOC->ODR = RGB_Code;
GPIOB->BRR |= GPIO_PIN_5;
__nop();
__nop();
__nop();
GPIOB->BSRR |= GPIO_PIN_5;
GPIOB->BSRR |= GPIO_PIN_8;
__nop();
__nop();
__nop();
GPIOB->BSRR |= GPIO_PIN_9;
GPIOC->ODR = pcout;
}