本帖最后由 dirty 于 2024-2-5 00:32 编辑
经过一段时间的了解熟悉,本篇实现LCD显示功能。
一.硬件了解
开发板板载LCD 显示屏,分辨率172(H)RGB x320(V),驱动IC ST7789V3,MCU通过SPI接口驱动控制。开发板硬件原理如下
图1:LCD原理图连接
LCD屏引脚 MCU PIN 功能
LCD_CS PE1 片选信号 ,低电平有效
LCD_DC PE2 显示数据/命令引脚.低电平时写命令,高电平时写数据
LCD_SDA PB14 数据脚,==MOSI
LCD_SCL PE0 时钟脚,==SCK
LCD_RES PB15 复位引脚,低电平复位
BLK PB9 背光引脚,高电平打开背光
二.代码准备
1.屏幕分辨率定义,横竖屏模式选择,这里使用横屏模式
#define USE_HORIZONTAL 3//2 //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏
#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
#define LCD_W 172
#define LCD_H 320
#else
#define LCD_W 320
#define LCD_H 172
#endif
2.spi驱动编写,可以IO模拟或硬件spi,前者显示刷新较慢,或后者用DMA会较快些。这里分享ST7789V3驱动RGB屏初始化,配置有效。
void LCD_Init(void)
{
LCD_GPIO_Init();//初始化GPIO
LCD_RES_Clr();//复位
FL_DelayMs(30);
LCD_RES_Set();
FL_DelayMs(100);
LCD_BLK_Set();//打开背光
FL_DelayMs(100);
LCD_WR_REG(0x11);
// FL_DelayMs(120);
LCD_WR_REG(0x36);
if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
else LCD_WR_DATA8(0xA0);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x13);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xD6);
LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3E);
LCD_WR_DATA8(0x38);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x30);
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3E);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x32);
LCD_WR_REG(0x11);
FL_DelayMs(120);
LCD_WR_REG(0x29);
}
3.UI界面设计
用字模取字工具和取图工具,我这里设计了复旦微官网Logo,QQ头像,汉字等辅以配色、布局等。
void lcd_show(void)
{
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
// LCD_Fill(0,0,LCD_W,LCD_H,RED);
// LCD_Fill(0,0,LCD_W,LCD_H,GREEN);
// LCD_Fill(0,0,LCD_W,LCD_H,BLUE);
// LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
LCD_ShowPicture(50,10,120,50,gImage_image_fdw);
LCD_ShowChinese(180,19,"复旦微",BLUE,WHITE,32,0);
LCD_ShowChinese(80,60,"车规系列",BLUE,WHITE,32,0);
LCD_ShowString(220,60,"MCU",RED,WHITE,32,0);
LCD_ShowString(80,100,"FM33FT056A",RED,WHITE,32,0);
LCD_ShowPicture(140,130,40,40,gImage_1);
}
三.测试效果
编译烧录后显示效果如下
整体显示效果不错,实现了驱动LCD屏功能。后面若做些丰富的界面显示,可以上LVGL,这也奠定了一个很好的基础。