[原创] 【复旦微车规MCU FM33FT0A 系列】--LCD屏显示

dirty   2024-2-5 00:22 楼主

        经过一段时间的了解熟悉,本篇实现LCD显示功能。

一.硬件了解

        开发板板载LCD 显示屏,分辨率172(H)RGB x320(V),驱动IC ST7789V3,MCU通过SPI接口驱动控制。开发板硬件原理如下

1_LCD引脚定义.png
图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);
}

 

三.测试效果

        编译烧录后显示效果如下

2_显示效果整体.jpg
3_显示效果局部.jpg

 

        整体显示效果不错,实现了驱动LCD屏功能。后面若做些丰富的界面显示,可以上LVGL,这也奠定了一个很好的基础。

 

 

 

本帖最后由 dirty 于 2024-2-5 00:32 编辑

回复评论 (2)

复旦微官网Logo显示的和清晰嘛

点赞  2024-2-6 08:29
引用: Jacktang 发表于 2024-2-6 08:29 复旦微官网Logo显示的和清晰嘛

在网页上截个图弄的,也算给宣传一波,哈哈

点赞  2024-2-6 11:19
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复