【STM32】1.8寸LCD显示实验

目录

一、硬件介绍

1. STM32F03C8T6

2. 1.8寸LCD

二、STM32CubeMX配置

1. 接口配置

​编辑

2. 其他配置

三、LCD图片取模

1. 打开图片(.bmp格式)

2. 设置

3. 点击保存数组。

4. 将生成的数组复制到lcd_picture.h文件中。

四、代码测试(模拟SPI)

1. lcd_init.h

2. lcd_init.c

3. 工程获取地址


一、硬件介绍

1. STM32F03C8T6

2. 1.8寸LCD

(1)GND:接地。

(2)VCC:3.3V( 尽量不要接 5V )。

(3)SCL / SCK:SPI时钟线, 代码是模拟SPI,所以不一定要接 SPI的引脚

(4)SDA / DIN:SPI 数据线MOSI引脚 )。代码是模拟 SPI,所以不一定要接SPI的引脚

(5)RES / RST:重启接口(复位)。最好和单片机的复位引脚相接。

(6)DC / RS:SPI数据 /命令选择引脚。

(7)CS / CE:SPI CS片选接口

(8)BL / LED:背光控制,默认浮动,高电平关闭。

二、STM32CubeMX配置

1. 接口配置

2. 其他配置

三、LCD图片取模

1. 打开图片(.bmp格式)

2. 设置

3. 点击保存数组。

4. 将生成的数组复制到lcd_picture.h文件中。

四、代码测试(模拟SPI)

1. lcd_init.h

/*
*********************************************************************************************************
*
*	模块名称 : LCD初始化驱动文件
*	文件名称 : lcd_init.h 
*
*********************************************************************************************************
*/
#ifndef __LCD_INIT_H
#define __LCD_INIT_H


/*头文件包含区*/
#include "main.h"


#define USE_HORIZONTAL 1  // 设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏

#if USE_HORIZONTAL==0 || USE_HORIZONTAL==1
#define LCD_W 128
#define LCD_H 160

#else
#define LCD_W 160
#define LCD_H 128
#endif

//#define LCD_SCLK_Clr() GPIO_ResetBits(SCL_GPIO_Port,SCL_Pin)    // SCL=SCLK
//#define LCD_SCLK_Set() GPIO_SetBits(SCL_GPIO_Port,SCL_Pin)

//#define LCD_MOSI_Clr() GPIO_ResetBits(SDA_GPIO_Port,SDA_Pin)     // SDA=MOSI
//#define LCD_MOSI_Set() GPIO_SetBits(SDA_GPIO_Port,SDA_Pin)

//#define LCD_RES_Clr()  GPIO_ResetBits(RES_GPIO_Port,RES_Pin)     // RES
//#define LCD_RES_Set()  GPIO_SetBits(RES_GPIO_Port,RES_Pin)

//#define LCD_DC_Clr()   GPIO_ResetBits(DC_GPIO_Port,DC_Pin)     // DC
//#define LCD_DC_Set()   GPIO_SetBits(DC_GPIO_Port,DC_Pin)

//#define LCD_CS_Clr()   GPIO_ResetBits(CS_GPIO_Port,CS_Pin)     // CS
//#define LCD_CS_Set()   GPIO_SetBits(CS_GPIO_Port,CS_Pin)

//#define LCD_BLK_Clr()  GPIO_ResetBits(BL_GPIO_Port,BL_Pin)     // BLK
//#define LCD_BLK_Set()  GPIO_SetBits(BL_GPIO_Port,BL_Pin)


#define LCD_SCLK_Clr() HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_RESET);   //SCL=SCLK
#define LCD_SCLK_Set() HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET);

#define LCD_MOSI_Clr() HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_RESET);   //SDA=MOSI
#define LCD_MOSI_Set() HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET);

#define LCD_RES_Clr()  HAL_GPIO_WritePin(RES_GPIO_Port, RES_Pin, GPIO_PIN_RESET);   //RES
#define LCD_RES_Set()  HAL_GPIO_WritePin(RES_GPIO_Port, RES_Pin, GPIO_PIN_SET);

#define LCD_DC_Clr()   HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_RESET);     //DC
#define LCD_DC_Set()   HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_SET);
      
#define LCD_CS_Clr()   HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);     //CS
#define LCD_CS_Set()   HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);

#define LCD_BLK_Clr()  HAL_GPIO_WritePin(BL_GPIO_Port, BL_Pin, GPIO_PIN_RESET);     //BLK
#define LCD_BLK_Set()  HAL_GPIO_WritePin(BL_GPIO_Port, BL_Pin, GPIO_PIN_SET);


/*函数声明区*/
void LCD_Writ_Bus(u8 dat);          // 模拟SPI时序
void LCD_WR_DATA8(u8 dat);          // 写入一个字节
void LCD_WR_DATA(u16 dat);          // 写入两个字节
void LCD_WR_REG(u8 dat);            // 写入一个指令
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);  // 设置坐标函数
void LCD_Init(void);                // LCD初始化

#endif

2. lcd_init.c

/*
*********************************************************************************************************
*
*	模块名称 : LCD初始化驱动文件
*	文件名称 : lcd_init.c
*
*********************************************************************************************************
*/

/*头文件包含区*/
#include "lcd_init.h"


/******************************************************************************
      函数说明:LCD串行数据写入函数
      入口数据:dat  要写入的串行数据
      返回值:  无
******************************************************************************/
void LCD_Writ_Bus(u8 dat) 
{	
	u8 i;
	LCD_CS_Clr();
	for(i=0;i<8;i++)
	{			  
		LCD_SCLK_Clr();
		if(dat&0x80)
		{
		   LCD_MOSI_Set();
		}
		else
		{
		   LCD_MOSI_Clr();
		}
		LCD_SCLK_Set();
		dat<<=1;
	}	
    LCD_CS_Set();	
}


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
	LCD_Writ_Bus(dat);
}


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
	LCD_Writ_Bus(dat>>8);
	LCD_Writ_Bus(dat);
}


/******************************************************************************
      函数说明:LCD写入命令
      入口数据:dat 写入的命令
      返回值:  无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
	LCD_DC_Clr();//写命令
	LCD_Writ_Bus(dat);
	LCD_DC_Set();//写数据
}


/******************************************************************************
      函数说明:设置起始和结束地址
      入口数据:x1,x2 设置列的起始和结束地址
                y1,y2 设置行的起始和结束地址
      返回值:  无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
	if(USE_HORIZONTAL==0)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==1)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==2)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}
	else
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}
}

void LCD_Init(void)
{
	//LCD_GPIO_Init();//初始化GPIO
	
	LCD_RES_Clr();      //复位
	HAL_Delay(100);
	LCD_RES_Set();
	HAL_Delay(100);
	
	LCD_BLK_Set();      //打开背光
    HAL_Delay(100);
	
	//************* Start Initial Sequence **********//
	LCD_WR_REG(0x11);           //Sleep out 
	HAL_Delay(120);             //Delay 120ms 
	//-------------------------ST7735S Frame Rate-----------------------------// 
	LCD_WR_REG(0xB1); 
	LCD_WR_DATA8(0x05); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_REG(0xB2); 
	LCD_WR_DATA8(0x05);
	LCD_WR_DATA8(0x3C); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_REG(0xB3); 
	LCD_WR_DATA8(0x05); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_DATA8(0x05); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_DATA8(0x3C); 
	//------------------------End ST7735S Frame Rate------------------------// 
	LCD_WR_REG(0xB4); //Dot inversion 
	LCD_WR_DATA8(0x03); 
	//------------------------ST7735S Power Sequence------------------------// 
	LCD_WR_REG(0xC0); 
	LCD_WR_DATA8(0x28); 
	LCD_WR_DATA8(0x08); 
	LCD_WR_DATA8(0x04); 
	LCD_WR_REG(0xC1); 
	LCD_WR_DATA8(0XC0); 
	LCD_WR_REG(0xC2); 
	LCD_WR_DATA8(0x0D); 
	LCD_WR_DATA8(0x00); 
	LCD_WR_REG(0xC3); 
	LCD_WR_DATA8(0x8D); 
	LCD_WR_DATA8(0x2A); 
	LCD_WR_REG(0xC4); 
	LCD_WR_DATA8(0x8D); 
	LCD_WR_DATA8(0xEE); 
	//-----------------------End ST7735S Power Sequence-------------------------// 
	LCD_WR_REG(0xC5); //VCOM 
	LCD_WR_DATA8(0x1A); 
	LCD_WR_REG(0x36); //MX, MY, RGB mode 
	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); 
	//-----------------------ST7735S Gamma Sequence---------------------------// 
	LCD_WR_REG(0xE0); 
	LCD_WR_DATA8(0x04); 
	LCD_WR_DATA8(0x22); 
	LCD_WR_DATA8(0x07); 
	LCD_WR_DATA8(0x0A); 
	LCD_WR_DATA8(0x2E); 
	LCD_WR_DATA8(0x30); 
	LCD_WR_DATA8(0x25); 
	LCD_WR_DATA8(0x2A); 
	LCD_WR_DATA8(0x28); 
	LCD_WR_DATA8(0x26); 
	LCD_WR_DATA8(0x2E); 
	LCD_WR_DATA8(0x3A); 
	LCD_WR_DATA8(0x00); 
	LCD_WR_DATA8(0x01); 
	LCD_WR_DATA8(0x03); 
	LCD_WR_DATA8(0x13); 
	LCD_WR_REG(0xE1); 
	LCD_WR_DATA8(0x04); 
	LCD_WR_DATA8(0x16); 
	LCD_WR_DATA8(0x06); 
	LCD_WR_DATA8(0x0D); 
	LCD_WR_DATA8(0x2D); 
	LCD_WR_DATA8(0x26); 
	LCD_WR_DATA8(0x23); 
	LCD_WR_DATA8(0x27); 
	LCD_WR_DATA8(0x27); 
	LCD_WR_DATA8(0x25); 
	LCD_WR_DATA8(0x2D); 
	LCD_WR_DATA8(0x3B); 
	LCD_WR_DATA8(0x00); 
	LCD_WR_DATA8(0x01); 
	LCD_WR_DATA8(0x04); 
	LCD_WR_DATA8(0x13); 
	//------------------------------------End ST7735S Gamma Sequence-----------------------------// 
	LCD_WR_REG(0x3A); //65k mode 
	LCD_WR_DATA8(0x05); 
	LCD_WR_REG(0x29); //Display on 
} 

3. 工程获取地址

1_2_LCD · CXDNW/STM32F103C8T6练习项目 - 码云 - 开源中国 (gitee.com)


相关软件可以从这篇文章中获取:

     STM32常用工具获取

http://t.csdnimg.cn/tPFMcicon-default.png?t=N7T8http://t.csdnimg.cn/tPFMc

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值