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

这篇具有很好参考价值的文章主要介绍了STM32使用软件SPI协议操作TFT18彩屏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

时间记录:2024/2/20

一、SPI协议介绍

STM32使用软件SPI协议操作TFT18彩屏,STM32,stm32,嵌入式硬件,单片机,SPI协议
(1)SPI设备通过4根线进行通信,CS片选线,选择从设备,SCK时钟线,由主设备产生时钟,主机MOSI线连从机MISO线,由主机向从机发送信息,主机MISO线连接从机MOSI线,由从机向主机发送信息
(2)SPI分为4种通信方式
模式0:CPOL=0,CPHA=0,空闲时SCK时钟线为低电平,在奇数边沿进行数据采集,在偶数边沿时进行数据变换,数据采集在上升沿,数据变换在下降沿
STM32使用软件SPI协议操作TFT18彩屏,STM32,stm32,嵌入式硬件,单片机,SPI协议
模式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,在上升沿采集数据,下降沿更改数据
STM32使用软件SPI协议操作TFT18彩屏,STM32,stm32,嵌入式硬件,单片机,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   16

void vTft18Init(void);//显示屏初始化
void vTft18Clear(void);//清屏函数
void vTft18ShowStr(u8 row,u8 col,u16 bkColor,u16 color,const char *fmt,...);//显示字符串
void vTft18DrawPic(void);//绘制图片

#endif

(2)源文件文章来源地址https://www.toymoban.com/news/detail-832897.html

#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);//设置颜色格式为16bit
    
    vWriteCmd(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+yEnd
    for(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);
                else
                    vWriteU16Data(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]);
    }
}

到了这里,关于STM32使用软件SPI协议操作TFT18彩屏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32学习】——SPI通信协议&SPI时序&W25Q64存储芯片&软件SPI读写

    目录 前言 一、SPI通信协议 1.概述​ 2.硬件电路  3.移位示意图 二、SPI时序 1.时序基本单元 2.完整时序波形 三、W25Q64存储芯片 1.芯片简介  2.硬件电路引脚定义  3.芯片框图 4.Flash操作注意事项 四、软件SPI读写W25Q64 五、SPI通信外设 总结 声明:学习笔记来自江科大自化协B站教

    2024年02月09日
    浏览(52)
  • STM32使用SPI协议主从通信

    目录 前言 一、理论部分      SPI简介   SPI特征 SPI物理层 SPI协议层 SPI配置过程 SPI数据发送与接收过程 二、代码部分 主机代码 从机代码 这是一篇学习笔记,记录自己学习SPI通信。方便之后运用的时候回顾。参考《STM32中文参考手册》          SPI 协议是由摩托罗拉公

    2024年02月13日
    浏览(31)
  • STM32H5开发(6)----SPI驱动TFT-LCD屏

    在嵌入式领域,TFT-LCD屏是最常用的显示解决方案之一,因为它们提供了丰富的颜色和高分辨率的图像显示能力。STM32H5作为ST的高性能微控制器系列,具备了强大的处理能力和多种通信接口,非常适合于驱动TFT-LCD显示屏,该液晶屏st7796或者ILI9488驱动芯片,这两个屏幕都是兼容

    2024年02月05日
    浏览(37)
  • STM-32:SPI通信协议/W25Q64简介—软件SPI读写W25Q64

    SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚

    2024年02月16日
    浏览(36)
  • 【STM32CubeIDE】STM32F103硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕

    ✨虽然STM32CubeIDE也是基于HAL库,但是还是不能直接转Keil MDK工程,本驱动案例从GitHub下载来的,原始工程使用的是较老版本的STM32CubeIDE配置的,没法在继续在新版本上程序配置,工程只是做了初始化配置。程序并不能直接被点亮,重新配置了lcd初始化函数以及复位函数后,才

    2024年02月12日
    浏览(32)
  • STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕

    📌相关篇《【STM32CubeIDE】STM32F103硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕》 ✨驱动效果就不做演示了,和上面的相关篇一样,主要是为了方便使用MDK Keil开发的使用。所以花了点时间从上面的工程当中做了分离,重新使用STM32CubeMX配置一个方便二次开发移植使用和配置的工程。本

    2024年02月03日
    浏览(39)
  • STM32F103C8T6+2.4寸SPI TFT触摸屏代码+标准库 项目开发

    目录 模块清单: 模块介绍: 1:STM32F103C8T6 2:2.4寸SPI TFT触摸屏 项目结果展示 2.4寸 TFT SPI显示触摸屏 2.4寸 SPI TFT 显示触摸屏代码下载链接: https://download.csdn.net/download/weixin_49492286/88458377 清单 STM32F103C8T6 2.4寸SPI TFT触摸屏         STM32F103C8T6是意法半导体(STMicroelectronics)推

    2024年02月07日
    浏览(52)
  • stm32----SPI协议

    SPI(Serial Peripheral Interface,串行外围设备接口),是Motorola公司提出的一种同步串行接口技术,是一种高速、 全双工 、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,节约了芯片pin的数目,同时为PCB在布局上节省了空间。正是由于这种简单易用的特性,现在越

    2024年02月11日
    浏览(25)
  • 【【STM32-SPI通信协议】】

    STM32-SPI通信协议 •SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线 •四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select) •同步,全双工 •支持总线挂载多设备(一主多从) 既然是同步的,我们就会发

    2024年02月12日
    浏览(31)
  • stm32(SPI读写W25Q18)

    SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种 高速的,全双工,同步 的通信总 线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提 供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如 A

    2024年02月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包