【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();//初始化GPIOLCD_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精通Nmap:网络扫描与安全的终极武器

一、引言 Nmap&#xff0c;即NetworkMapper&#xff0c;是一款开源的网络探测和安全审计工具。它能帮助您发现网络中的设备&#xff0c;并识别潜在的安全风险。在这个教程中&#xff0c;我们将一步步引导您如何有效地使用Nmap&#xff0c;让您的网络更加安全。 因为Nmap还有图…

顺序表详解(SeqList)

本文使用C语言进行顺序表的代码实现。 博主将使用代码和相关知识相结合的方式进行讲解&#xff0c;简单易懂&#xff0c;懵懂的大学生一听就会~ 顺序表是一种线性表的存储结构&#xff0c;它将数据元素存储在一段连续的存储空间中&#xff0c;每个元素占据一个存储单元&#x…

怎样使用Pyglet库给推箱子游戏画关卡地图

目录 pyglet库 画图事件 按键事件 程序扩展 关卡地图 pyglet库 是一个跨平台的Python多媒体库&#xff0c;提供了一个简单易用的接口来创建窗口、加载图像和视频、播放音频、处理用户输入事件以及进行2D图形绘制。特别适合用于游戏开发、视听应用以及其它需要高效图形渲染…

NestJS入门9:管道入门

前文参考 NestJS入门1&#xff1a;创建项目 NestJS入门2&#xff1a;创建模块 NestJS入门3&#xff1a;不同请求方式前后端写法 NestJS入门4&#xff1a;MySQL typeorm 增删改查 NestJS入门5&#xff1a;加入Swagger NestJS入门6&#xff1a;日志中间件 NestJS入门7&…

Unity数据持久化之PlayerPrefs

这里写目录标题 PlayerPrefs概述基本方法PlayerPrefs存储位置实践小项目反射知识补充数据管理类的创建反射存储数据----常用成员反射存储数据----List成员反射存储数据----Dictionary成员反射存储数据----自定义类成员反射读取数据----常用成员反射读取数据----List成员反射读取…

【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

欢迎大家来到c语言知识小课堂&#xff0c;今天的知识点是操作符和进制 目录 一、进制之间的转化1、什么是二进制&#xff0c;八进制&#xff0c;十进制&#xff0c;十六进制2、进制之间的转化其他进制转化为十进制十进制转化为二进制二进制转化为八进制八进制转化为二进制二进…

力扣55. 跳跃游戏(动态规划)

Problem: 55. 跳跃游戏 文章目录 题目描述思路复杂度Code 题目描述 思路 我们将问题稍做转换每次求取当前位置可以走到的最远位置&#xff0c;在此基础上我们将最终判断是否能走出整个nums&#xff1b;同时我们要判断中途会不会遇到某个位置是0使得不能继续走下去 复杂度 时间…

【GO语言卵细胞级别教程】06.GO语言的字符串操作

【GO语言卵细胞级别教程】06.GO语言的字符串操作 温馨提示&#xff1a; 本文中使用的项目模块均是 【05.项目创建和函数讲解】 中创建的&#xff0c;具体如何创建项目&#xff0c;请参考 【GO语言卵细胞级别教程】05.项目创建和函数讲解 演示项目仓库&#xff1a;https://gi…

ArcGIS中查看栅格影像最大值最小值的位置

如果只是想大概获取栅格影像中最大值最小值的位置进行查看&#xff0c;可以不用编写程序获取具体的行列信息&#xff0c;只需要利用分类工具即可。 假设有一幅灰度影像数据&#xff0c;如下图所示。 想要查看最大值2116的大概位置在哪里&#xff0c;可以右击选择图层属性&…

k-邻近算法(kNN)

目录 k-近邻算法概述 k-近邻算法的一般流程 kNN算法伪代码 k-近邻算法概述 优点&#xff1a;精度高、对异常值不敏感、无数据输入假定 缺点&#xff1a;计算复杂度高、空间复杂度高 适用数据范围&#xff1a;数值型和标称型 k-近邻算法的一般流程 &#xff08;1&#x…

LeetCode 0105.从前序与中序遍历序列构造二叉树:分治(递归)——五彩斑斓的题解(若不是彩色的可以点击原文链接查看)

【LetMeFly】105.从前序与中序遍历序列构造二叉树&#xff1a;分治&#xff08;递归&#xff09;——五彩斑斓的题解&#xff08;若不是彩色的可以点击原文链接查看&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-preorder-a…

【hoare基础版】快速排序算法(1)

目录 交换排序 QuickSort快速排序 Hoare整体思路 图解分析 ​ Hoare版本代码 总代码 时间复杂度 交换排序 基本思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序的特点是&#xff1a;将键…

相机图像质量研究(38)常见问题总结:编解码对成像的影响--呼吸效应

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

【C#】List泛型数据集如何循环移动,最后一位移动到第一位,以此类推

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

有关JAVA中文乱码问题的解析及解决办法

大家好我是咕噜美乐蒂&#xff0c;很高兴又和大家见面了&#xff01;下面我就和大家一起来了解一下由于Java中文乱码问题比较复杂&#xff0c;需要从字符编码、文件编码、输入输出流等多个方面进行分析和解决。在本文中&#xff0c;我将详细介绍Java中文乱码问题的原因、解析方…

Arm的Cortex-A和Cortex-X内核架构对比

Arm的Cortex-A和Cortex-X内核系列都是基于ARM架构设计的高性能处理器核心&#xff0c;但它们在设计目标、市场定位以及性能优化上有所不同&#xff1a; ### Cortex-A系列 - **设计目标**&#xff1a;Cortex-A系列是为广泛的移动计算设备和服务器平台设计的通用处理器内核&…

数据安全治理:构建与实施的关键要素及总体架构

本文将深入探讨数据安全治理的核心要素和总体架构&#xff0c;旨在为组织提供一个明确的指南&#xff0c;帮助他们构建和实施有效的数据安全治理策略。在数字化快速发展的今天&#xff0c;理解并实施这些要点和架构不仅是提升数据安全的关键&#xff0c;也是确保组织能够在复杂…

内核移植学习

内核移植 内核移植就是指将RT-Thread内核在不同的芯片架构、不同的板卡上运行起来。 移植可分为CPU架构移植和BSP板级支持包移植两部分。 CPU架构移植 在嵌入式领域有多种不同CPU架构&#xff0c;例如Cortex-M、ARM920T、MIPS32、RISC-V等等。 为了使RT-Thread能够在不同C…

《雾锁王国》游戏存档迁移教程,本地存档/服务器数据迁移到服务器

《雾锁王国》游戏存档迁移教程&#xff0c;本地存档/服务器数据迁移到服务器 一、本地存档转到服务器&#xff1a; 首先保存本地存档数据&#xff0c;例如我的存档路径为C:\Program Files(x86)\Steam\Userdata 然后远程登录到你的Windows云服务器&#xff0c;打开任务管理器…

[django] django好玩的地方在于,可以批量操作数据库了

django好玩的地方在于&#xff0c;可以批量操作数据库了。 和数据库快速交互&#xff0c;真的是好厉害。 这种情况怎么过滤 objects.filter project models.ForeignKey(to“Project”, verbose_name‘项目’, on_deletemodels.CASCADE, max_length50, nullFalse, help_text‘…