STM32使用软件SPI协议操作TFT18彩屏

时间记录:2024/2/20

一、SPI协议介绍

SPI设备连接
(1)SPI设备通过4根线进行通信,CS片选线,选择从设备,SCK时钟线,由主设备产生时钟,主机MOSI线连从机MISO线,由主机向从机发送信息,主机MISO线连接从机MOSI线,由从机向主机发送信息
(2)SPI分为4种通信方式
模式0:CPOL=0,CPHA=0,空闲时SCK时钟线为低电平,在奇数边沿进行数据采集,在偶数边沿时进行数据变换,数据采集在上升沿,数据变换在下降沿
模式0
模式1:CPOL=0,CPHA=1,空闲时SCK时钟为低电平,在偶数边沿进行数据采集,在奇数边沿时进行数据变换,数据采集在下降沿,数据变换在上升沿
模式2:CPOL=1,CPHA=0,空闲时SCK时钟为高电平,在奇数边沿进行数据采集,在偶数边沿时进行数据变换,数据采集在下降沿,数据变换在上升沿
模式3:CPOL=1,CPHA=1,空闲时SCK时钟为高电平,在偶数边沿进行数据采集,在奇数边沿时进行数据变换,数据采集在上升沿,数据变换在下降沿
(3)常用的模式是0和3,具体的操作要根据从机模块的数据手册进行选择

二、tft18显示屏介绍

(1)引脚介绍(1.8寸TFT18显示屏,驱动为ST7735)

引脚介绍
GND电源地
VCC电源线
SCL时钟线
SDA数据输入线
RES复位线,低电平复位
DC命令/数据选择线,低电平选择命令寄存器,高电平选择数据寄存器
CS片选线,低电平选中
BL背光线,可通过PWM控制背光亮度,默认高电平全亮

(2)SPI模式,模式3,在上升沿采集数据,下降沿更改数据
SPI模式

三、示例代码

(1)头文件

#ifndef __TFT18_H__
#define __TFT18_H__
#include <stm32f10x.h>
#include "delay.h"#define LCD_WIDTH       128
#define LCD_HEIGHT      160
#define LCDXOFFSET      1
#define LCDYOFFSET      0#define LCD_RCC         RCC_APB2Periph_GPIOA
#define LCD_GPIO        GPIOA
#define LCD_SCL_PIN     GPIO_Pin_0
#define LCD_SDA_PIN     GPIO_Pin_1
#define LCD_RES_PIN     GPIO_Pin_2
#define LCD_DC_PIN      GPIO_Pin_3
#define LCD_CS_PIN      GPIO_Pin_4#define SET_SCL         GPIO_SetBits(LCD_GPIO,LCD_SCL_PIN);
#define SET_SDA         GPIO_SetBits(LCD_GPIO,LCD_SDA_PIN);
#define SET_RES         GPIO_SetBits(LCD_GPIO,LCD_RES_PIN);
#define SET_DC          GPIO_SetBits(LCD_GPIO,LCD_DC_PIN);
#define SET_CS          GPIO_SetBits(LCD_GPIO,LCD_CS_PIN);#define RESET_SCL       GPIO_ResetBits(LCD_GPIO,LCD_SCL_PIN);
#define RESET_SDA       GPIO_ResetBits(LCD_GPIO,LCD_SDA_PIN);
#define RESET_RES       GPIO_ResetBits(LCD_GPIO,LCD_RES_PIN);
#define RESET_DC        GPIO_ResetBits(LCD_GPIO,LCD_DC_PIN);
#define RESET_CS        GPIO_ResetBits(LCD_GPIO,LCD_CS_PIN);//颜色显示565,RGB888ToRGB565:R取高5位,G取中间6位,B取低5位
#define TFT_BLACK       0x0000//黑色
#define TFT_WHITE       0xFFFF//白色
#define TFT_RED         0xF800//红色
#define TFT_GREEN       0x07E0//绿色
#define TFT_BLUE        0x001F//蓝色
#define TFT_YELLOW      0xFFE0//黄色#define STR_MAX_COUNT   16void vTft18Init(void);//显示屏初始化
void vTft18Clear(void);//清屏函数
void vTft18ShowStr(u8 row,u8 col,u16 bkColor,u16 color,const char *fmt,...);//显示字符串
void vTft18DrawPic(void);//绘制图片#endif

(2)源文件

#include "tft18.h"
#include "tft18_font.h"
#include "img.h"
#include <string.h>
#include <stdio.h>
#include <stdarg.h>//初始化GPIO口
static void vGpioInit(void)
{RCC_APB2PeriphClockCmd(LCD_RCC,ENABLE);//使能时钟GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = LCD_SCL_PIN | LCD_SDA_PIN | LCD_RES_PIN | LCD_DC_PIN | LCD_CS_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD_GPIO,&GPIO_InitStruct);//初始化GPIO口vDelayInit();
}//复位LCD,低电平>10us,高电平大于120ms
static void vTft18Reset(void)
{SET_RES;vDelayMs(10);RESET_RES;vDelayMs(10);SET_RES;vDelayMs(150);
}//写命令:DC=0
static void vWriteCmd(u8 data)
{RESET_CS;RESET_DC;//写命令for(u8 i=0;i<8;i++){//发送命令,高位先发if(data & 0x80){SET_SDA;}else{RESET_SDA;}RESET_SCL;SET_SCL;//产生上升沿将数据发送出去data <<= 1;}SET_CS;//拉高选择线空闲状态
}//写数据:DC=1
static void vWriteData(u8 data)
{RESET_CS;SET_DC;//写数据for(u8 i=0;i<8;i++){//发送命令,高位先发if(data & 0x80){SET_SDA;}else{RESET_SDA;}RESET_SCL;SET_SCL;//产生上升沿将数据发送出去data <<= 1;}SET_CS;//拉高选择线空闲状态
}//写16位颜色数据
static void vWriteU16Data(u16 data)
{vWriteData(data >> 8);vWriteData(data & 0xFF);
}//初始化参数设置
static void vTft18InitParameter(void)
{vWriteCmd(0x11);//退出睡眠模式//    vWriteCmd(0xB1);
//    vWriteData(0x05);
//    vWriteData(0x3C);
//    vWriteData(0x3C);
//    
//    vWriteCmd(0xB2);
//    vWriteData(0x05);
//    vWriteData(0x3C);
//    vWriteData(0x3C);
//    
//    vWriteCmd(0xB3);
//    vWriteData(0x05);
//    vWriteData(0x3C);
//    vWriteData(0x3C);
//    vWriteData(0x05);
//    vWriteData(0x3C);
//    vWriteData(0x3C);
//    
//    vWriteCmd(0xB4);
//    vWriteData(0x03);
//    
//    vWriteCmd(0xC0);
//    vWriteData(0x28);
//    vWriteData(0x08);
//    vWriteData(0x04);
//    
//    vWriteCmd(0xC1);
//    vWriteData(0xC0);
//    
//    vWriteCmd(0xC2);
//    vWriteData(0x0D);
//    vWriteData(0x00);
//    
//    vWriteCmd(0xC3);
//    vWriteData(0x8D);
//    vWriteData(0x2A);
//    
//    vWriteCmd(0xC4);
//    vWriteData(0x8D);
//    vWriteData(0xEE);
//    
//    vWriteCmd(0xC5);
//    vWriteData(0x1A);vWriteCmd(0x36);//显存控制vWriteData(0xC0);//设置显存指针自动移动的方向为从左到右,从上到下,颜色数据格式为RGB//    vWriteCmd(0xE0);
//    vWriteData(0x04);
//    vWriteData(0x22);
//    vWriteData(0x07);
//    vWriteData(0x0A);
//    vWriteData(0x2E);
//    vWriteData(0x30);
//    vWriteData(0x25);
//    vWriteData(0x2A);
//    vWriteData(0x28);
//    vWriteData(0x26);
//    vWriteData(0x2E);
//    vWriteData(0x3A);
//    vWriteData(0x00);
//    vWriteData(0x01);
//    vWriteData(0x03);
//    vWriteData(0x13);
//    
//    vWriteCmd(0xE1);
//    vWriteData(0x04);
//    vWriteData(0x16);
//    vWriteData(0x06);
//    vWriteData(0x0D);
//    vWriteData(0x2D);
//    vWriteData(0x26);
//    vWriteData(0x23);
//    vWriteData(0x27);
//    vWriteData(0x27);
//    vWriteData(0x25);
//    vWriteData(0x2D);
//    vWriteData(0x3B);
//    vWriteData(0x00);
//    vWriteData(0x01);
//    vWriteData(0x04);
//    vWriteData(0x13);vWriteCmd(0x3A);//设置颜色格式vWriteData(0x05);//设置颜色格式为16bitvWriteCmd(0x29);//开启显示
}//x:128
//y:160
//显示范围[xEnd-xStart,yEnd-yStart],[1-128,1,160]
static void vSetAddr(u8 xStart,u8 yStart,u8 xEnd,u8 yEnd)
{//设置显示RAM范围vWriteCmd(0x2A);//xMax:128,设置列显示的起始和结束地址vWriteData(0x00);//此位无效vWriteData(xStart+LCDXOFFSET);//此位有效vWriteData(0x00);//此位无效vWriteData(xEnd+LCDXOFFSET);//此位有效vWriteCmd(0x2B);//yMax:160,设置行显示的起始和结束地址vWriteData(0x00);//此位无效vWriteData(yStart+LCDYOFFSET);//此位有效vWriteData(0x00);//此位无效vWriteData(yEnd+LCDYOFFSET);//此位有效vWriteCmd(0x2C);//开始向设定的区域填充颜色
}void vTft18Init(void)
{vGpioInit();vTft18Reset();vTft18InitParameter();
}void vTft18Clear(void)
{vSetAddr(1,1,LCD_WIDTH,LCD_HEIGHT);//设置显示范围for(u8 col=0;col<LCD_WIDTH;col++){for(u8 row=0;row<LCD_HEIGHT;row++){vWriteU16Data(TFT_BLUE);}}
}void vTft18ShowStr(u8 row,u8 col,u16 bkColor,u16 color,const char *fmt,...)
{    char tempStr[STR_MAX_COUNT];memset(tempStr,0,sizeof(tempStr));//拼接不定参数va_list vaList;va_start(vaList,fmt);vsnprintf(tempStr,STR_MAX_COUNT,fmt,vaList);va_end(vaList);//进行显示int len = strlen(tempStr);vSetAddr(col,(row-1)*16+1,8*len+col-1,row*16);//显示点,从xStart-xEnd xStart+1-xEnd+1 ... xStart+yEnd-xEnd+yEndfor(int currRow= 0;currRow<16;currRow++){//当前行,16行for(int k=0;k<len;k++){int index = tempStr[k]-' ';for(int currCol=0;currCol<8;currCol++){//当前列,8列if((char8x16[index][currRow] << currCol) &0x80)vWriteU16Data(color);elsevWriteU16Data(bkColor);}}}
}void vTft18DrawPic(void)
{vSetAddr(1,1,LCD_WIDTH,LCD_HEIGHT);for(int index =0;index<LCD_WIDTH*LCD_HEIGHT*2;index+=2){vWriteU16Data((image[index] << 8) + image[index+1]);}
}

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

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

相关文章

openEuler 22.03 LTS 上源码安装 PostgreSQL 15

安装PostgreSQL 15 1 安装必要的依赖 #yum install -y readline-devel zlib-devel gcc2、下载源码 # wget https://ftp.postgresql.org/pub/source/v15.6/postgresql-15.6.tar.gz # tar -xzvf postgresql-15.6.tar.gz3 配置 # cd postgresql-15.6/ # ./configure4 编译安装…

mac东西拷不进硬盘怎么回事 mac东西拷不进硬盘怎么办 mac硬盘读不出来怎么解决 mac拷贝不了东西到u盘

有时候我们在使用mac的过程中&#xff0c;可能会遇到一些问题&#xff0c;比如mac东西拷不进硬盘。这是一种很常见的情况&#xff0c;但是会影响我们的工作和生活。那么&#xff0c;mac东西拷不进硬盘是怎么回事呢&#xff1f;mac东西拷不进硬盘又该怎么办呢&#xff1f;本文将…

Flutter 动画(显式动画、隐式动画、Hero动画、页面转场动画、交错动画)

前言 当前案例 Flutter SDK版本&#xff1a;3.13.2 显式动画 Tween({this.begin,this.end}) 两个构造参数&#xff0c;分别是 开始值 和 结束值&#xff0c;根据这两个值&#xff0c;提供了控制动画的方法&#xff0c;以下是常用的&#xff1b; controller.forward() : 向前…

自助点餐系统微信小程序,支持外卖、到店等

总体介绍 系统总共分为三个端&#xff1a;后端&#xff0c;后台管理系统、微信小程序。 基于当前流行技术组合的前后端分离商城系统&#xff1a; SpringBoot2MybatisPlusSpringSecurityjwtredisVue的前后端分离的商城系统&#xff0c; 包含分类、sku、积分、多门店等 预览图…

【动态规划专栏】专题一:斐波那契数列模型--------4.解码方法

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

深度学习基础——卷积神经网络(一)

卷积操作与自定义算子开发 卷积是卷积神经网络中的基本操作&#xff0c;对于图像的特征提取有着关键的作用&#xff0c;本文首先介绍卷积的基本原理与作用&#xff0c;然后通过编写程序实现卷积操作&#xff0c;并展示了均值、高斯与sobel等几种经典卷积核的卷积效果&#xff…

变分自编码器(VAE)PyTorch Lightning 实现

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

290. Word Pattern(单词规律)

题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 提示: 1 < pattern.length < 300 pa…

安装VMware+安装Linux

以上就是VMware在安装时的每一步操作&#xff0c;基本上就是点击 "下一步" 一直进行安装 安装Linux VMware虚拟机安装完毕之后&#xff0c;我们就可以打开VMware&#xff0c;并在上面来安装Linux操作系统。具体步骤如下&#xff1a; 1). 选择创建新的虚拟机 2). 选…

C. LR-remainders

思路&#xff1a;正着暴力会tle&#xff0c;所以我们可以逆着来。 代码&#xff1a; #include<bits/stdc.h> #define int long long #define x first #define y second #define endl \n #define pq priority_queue using namespace std; typedef pair<int,int> p…

如何确定分库还是 分表?

分库分表 分库分表使用的场景不一样&#xff1a; 分表因为数据量比较大&#xff0c;导致事务执行缓慢&#xff1b;分库是因为单库的性能无法满足要求。 分片策略 1、垂直拆分 水平拆分 3 范围分片&#xff08;range&#xff09; 垂直水平拆分 4 如何解决数据查询问题&a…

[计算机网络]---UDP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、端口号…

老师不能有副业吗为什么

当老师走进教室&#xff0c;他们的每一句话、每一个动作都可能影响着几十上百个孩子的未来。这样的责任&#xff0c;难道是可以轻易分担的吗&#xff1f; 或许有人会说&#xff0c;老师为什么不能有副业&#xff1f;他们也有自己的生活&#xff0c;也需要经济支持。确实&#…

鸿蒙-基于ArkTS声明式开发的简易备忘录,适合新人学习,可用于大作业

本文地址&#xff1a;https://blog.csdn.net/qq_40785165/article/details/136161182?spm1001.2014.3001.5502&#xff0c;转载请附上此链接 大家好&#xff0c;我是小黑&#xff0c;一个还没秃头的程序员~~~ 不知不觉已经有很长一段时间没有分享过自己写的东西了&#xff0…

使用Postman拦截浏览器请求

项目上线之后&#xff0c;难免会有BUG。在出现问题的时候&#xff0c;我们可能需要获取前端页面发送请求的数据&#xff0c;然后在测试环境发送相同的数据将问题复现。手动构建数据是挺麻烦的一件事&#xff0c;所以我们可以借助Postman在浏览器上的插件帮助拦截请求&#xff0…

基于微信小程序的校园跑腿系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

第一件事 什么是 Java 虚拟机 (JVM)

1、什么是虚拟机&#xff1f; - 这个其实是一个挺逗的事情&#xff0c;说白了&#xff0c;就是基于某个硬件架构&#xff0c;在这个硬件部署了一个操作系统&#xff0c;再构架一层虚拟的操作系统&#xff0c;这个新构架的操作系统就是虚拟机。 不知道的兄弟姐妹们&#xff0c;…

[word] 怎么把word表格里的字放在正中间? #职场发展#知识分享#知识分享

怎么把word表格里的字放在正中间&#xff1f; word表格中文字在中间的处理方式如下&#xff1a; 1、在表格中选择需要居中的文字的单元格&#xff0c;具体如下图。 2、全选后&#xff0c;鼠标在工具栏中找到&#xff1a;对齐方式&#xff0c;点击它后面的倒三角&#xff0c;如…

头部新势力新车型将全系标配!4D成像雷达元年真来了?

4D成像雷达赛道又热闹起来了。 自2023年2月&#xff0c;森思泰克2片级联4D成像雷达STA77-6全球首发量产车型——理想L7正式发布上市&#xff0c;立下了国产4D成像雷达产品在乘用车前装量产的重要里程碑事件&#xff0c;业界普遍认为2023年将迎来4D成像雷达规模化量产元年。 尽…

重复导航到当前位置引起的。Vue Router 提供了一种机制,阻止重复导航到相同的路由路径。

代码&#xff1a; <!-- 侧边栏 --><el-col :span"12" :style"{ width: 200px }"><el-menu default-active"first" class"el-menu-vertical-demo" select"handleMenuSelect"><el-menu-item index"…