CubeMX使用FMC配置并行8口LCD屏

以前调试了一块LCD屏,现在用CubeMX生成的代码点一下,在网上看了好多相关的资料,感觉都不是写的很清楚,所以就在这里记录一下调试的过程。

  1. 使用的LCD屏是并行8口
    在这里插入图片描述

  2. 打开CubeMX,单片机使用的是STM32F302VETx
    基本的时钟配置完毕后,选择FMC,里面有一个LCD Interface选项,注意,这里有很多种选择模式。这个就需要看一下单片机和实际的连接脚。
    在这里插入图片描述
    选择不同的Register,底下会有不同的脚,选择和自己相同的即可,底下的GPIO口配置基本不需要修改。

  3. 还有连接LCD屏的背光灯和复位灯,需要配置GPIO口为输出就行了

  4. 剩下就是正常的操作了,添加驱动代码

(1)先复位屏,然后打开背光灯

	volatile uint8_t * LCD_REG = (volatile uint8_t *)(0x60000000 | 0x0000ffff);
	volatile uint8_t * LCD_RAM = (volatile uint8_t *)(0x60000000 | 0x00010000);
	
	#define LCD_PIN_BL      (GPIO_PIN_7)
	#define LCD_PORT_BL     (GPIOC)
	
	#define LCD_PIN_RST     (GPIO_PIN_8)
	#define LCD_PORT_RST    (GPIOC)
	
	#define Lcd_Light_ON    HAL_GPIO_WritePin(LCD_PORT_BL, LCD_PIN_BL, GPIO_PIN_SET) 
	#define Lcd_Light_OFF   HAL_GPIO_WritePin(LCD_PORT_BL, LCD_PIN_BL, GPIO_PIN_RESET) 
	
	void WR_CMD(uint16_t comm)//write command 
	{     
		comm=comm; 
		
		*(LCD_REG) = (comm >> 8);
		*(LCD_REG) = (comm >> 0);
	} 
	
	void WR_DATA(uint16_t data)//write arameter 
	{     	
		data=data; 
		
		*LCD_RAM=(data >> 8);
		*LCD_RAM=(data >> 0);
	} 
		
	void LCD_WR_REG(uint16_t Index,uint16_t config)
	{
		WR_CMD(Index);		
		WR_DATA(config);
	}
	
	void BlockWrite(unsigned int Xstart,unsigned int Xend,unsigned int Ystart,unsigned int Yend)
	{
		//Set GRAM Area 
		LCD_WR_REG(0x02,Xstart>>8); 
		LCD_WR_REG(0x03,Xstart);     //Column Start 
		LCD_WR_REG(0x04,Xend>>8); 
		LCD_WR_REG(0x05,Xend);     //Column End 
		 
		LCD_WR_REG(0x06,Ystart>>8); 
		LCD_WR_REG(0x07,Ystart);     //Row Start 
		LCD_WR_REG(0x08,Yend>>8); 
		LCD_WR_REG(0x09,Yend);     //Row End 
	
		WR_CMD(0x0022);	
	}

	void LCD_Fill(uint16_t xstart ,uint16_t ystart ,uint16_t xend ,uint16_t yend ,uint16_t color)
	{            
	    uint32_t max;
		
		if((xstart > 320)||(ystart > 240)||(xend > 320)||(yend > 240)) return;
			
		BlockWrite(xstart, xend-1, ystart, yend-1);
		
		max=(uint32_t)((xend-xstart+1)*(yend-ystart+1));    
		
		while(max--)
		{
			WR_DATA(color);				
		}
	
		LCD_XYRAM(0x0000 ,0x0000 ,0x013F ,0X00EF); // 恢复GRAM整屏显示
	}
	
	static void LCD_Reset(void)
	{
		HAL_GPIO_WritePin(LCD_PORT_RST, LCD_PIN_RST, GPIO_PIN_SET);
		HAL_GPIO_WritePin(LCD_PORT_RST, LCD_PIN_RST, GPIO_PIN_RESET);
		LCD_delay_ms(10000);
		HAL_GPIO_WritePin(LCD_PORT_RST, LCD_PIN_RST, GPIO_PIN_SET);
		LCD_delay_ms(10000);
		
		Lcd_Light_ON;
	}

(2)初始化LCD屏

	void LCD_Init(void)
	{
		WR_CMD(0x002E);WR_DATA(0x0079); //
		WR_CMD(0x00EE);WR_DATA(0x000C); //
		//Driving ability Setting
		WR_CMD(0x00EA);WR_DATA(0x0000); //PTBA[15:8]
		WR_CMD(0x00EB);WR_DATA(0x0020); //PTBA[7:0]
		WR_CMD(0x00EC);WR_DATA(0x0008); //STBA[15:8]
		WR_CMD(0x00ED);WR_DATA(0x00C4); //STBA[7:0]
		WR_CMD(0x00E8);WR_DATA(0x0040); //OPON[7:0]
		WR_CMD(0x00E9);WR_DATA(0x0038); //OPON1[7:0]
		WR_CMD(0x00F1);WR_DATA(0x0001); //OTPS1B
		WR_CMD(0x00F2);WR_DATA(0x0010); //GEN
		WR_CMD(0x0027);WR_DATA(0x00A3); //
		//Gamma 2.2 Setting
		WR_CMD(0x0040);WR_DATA(0x0000); //
		WR_CMD(0x0041);WR_DATA(0x0000); //
		WR_CMD(0x0042);WR_DATA(0x0001); //
		WR_CMD(0x0043);WR_DATA(0x0012); //
		WR_CMD(0x0044);WR_DATA(0x0010); //
		WR_CMD(0x0045);WR_DATA(0x0026); //
		WR_CMD(0x0046);WR_DATA(0x0008); //
		WR_CMD(0x0047);WR_DATA(0x0053); //
		WR_CMD(0x0048);WR_DATA(0x0002); //
		WR_CMD(0x0049);WR_DATA(0x0015); //
		WR_CMD(0x004A);WR_DATA(0x0019); //
		WR_CMD(0x004B);WR_DATA(0x0019); //
		WR_CMD(0x004C);WR_DATA(0x0016); //
		WR_CMD(0x0050);WR_DATA(0x0019); //
		WR_CMD(0x0051);WR_DATA(0x002F); //
		WR_CMD(0x0052);WR_DATA(0x002D); //
		WR_CMD(0x0053);WR_DATA(0x003E); //
		WR_CMD(0x0054);WR_DATA(0x003F); //
		WR_CMD(0x0055);WR_DATA(0x003F); //
		WR_CMD(0x0056);WR_DATA(0x002C); //
		WR_CMD(0x0057);WR_DATA(0x0077); //
		WR_CMD(0x0058);WR_DATA(0x0009); //
		WR_CMD(0x0059);WR_DATA(0x0006); //
		WR_CMD(0x005A);WR_DATA(0x0006); //
		WR_CMD(0x005B);WR_DATA(0x000A); //
		WR_CMD(0x005C);WR_DATA(0x001D); //
		WR_CMD(0x005D);WR_DATA(0x00CC); //
		//Power Voltage Setting
		WR_CMD(0x001B);WR_DATA(0x001B); //VRH=4.65V
		WR_CMD(0x001A);WR_DATA(0x0001); //BT (VGH~15V);(VGL~-10V);(DDVDH~5V)
		WR_CMD(0x0024);WR_DATA(0x002F); //VMH(VCOM High voltage ~3.2V)
		WR_CMD(0x0025);WR_DATA(0x0057); //VML(VCOM Low voltage -1.2V)
		//****VCOM offset**///
		WR_CMD(0x0023);WR_DATA(0x0097); //for Flicker adjust //can reload from OTP
		//Power on Setting
		WR_CMD(0x0018);WR_DATA(0x0036); //I/P_RADJ);(N/P_RADJ);( Normal mode 75Hz
		WR_CMD(0x0019);WR_DATA(0x0001); //OSC_EN='1');( start Osc
		WR_CMD(0x0001);WR_DATA(0x0000); //DP_STB='0');( out deep sleep
		WR_CMD(0x001F);WR_DATA(0x0088);// GAS=1);( VOMG=00);( PON=0);( DK=1);( XDK=0)
		
		LCD_delay_ms(5);
		WR_CMD(0x001F);WR_DATA(0x0080);// GAS=1);( VOMG=00);( PON=0);( DK=0);( XDK=0);( 
		
		LCD_delay_ms(5);
		WR_CMD(0x001F);WR_DATA(0x0090);// GAS=1);( VOMG=00);( PON=1);( DK=0);( XDK=0);( 
		
		LCD_delay_ms(5);
		WR_CMD(0x001F);WR_DATA(0x00D0);// GAS=1);( VOMG=10);( PON=1);( DK=0);( XDK=0);( 
		
		LCD_delay_ms(5);
		WR_CMD(0x16);WR_DATA(0x48);//竖屏
		WR_CMD(0x0017);WR_DATA(0x0005); //default 0x0006 262k color // 0x0005 65k color
		//SET PANEL
		WR_CMD(0x0036);WR_DATA(0x0000); //SS_P);( GS_P);(REV_P);(BGR_P
		//Display ON Setting
		WR_CMD(0x0028);WR_DATA(0x0038); //GON=1);( DTE=1);( D=1000
		LCD_delay_ms(40);
		WR_CMD(0x0028);WR_DATA(0x003C); //GON=1);( DTE=1);( D=1100
		
		LCD_WR_REG(0x16,0x68);//横屏
	}

(3)刷图测试

	LCD_Fill(0, 0, 320, 240, GREEN); LCD_delay_ms(10000);
	LCD_Fill(0, 0, 320, 240, RED);	  LCD_delay_ms(10000);
	LCD_Fill(0, 0, 320, 240, BLUE);  LCD_delay_ms(10000);
	LCD_Fill(0, 0, 320, 240, CUSTOMER_COLOR); LCD_delay_ms(10000);	
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值