单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕

说明:此篇为学习记录。可能存在错误或者不足。如有问题请指出。

硬件环境

主控芯片:STM32F411CEU6
主控开发板:WeAct STM32F411CEU6最小系统板
TFT-LCD屏幕:合宙1.8寸TFT-LCD,驱动为ST7735s

软件环境

MDK版本:5,32
HAL库版本:1.27.1
STM32CubeMX版本:6.7.0

从手册了解一些必要信息

ST7735s支持8080并口,3线和4线串行接口,模块的驱动方式是4线串行驱动方式也就是四线类SPI通信方式。
手册内容很多,这里简单记录必要的信息。

读写模式以及时序

1、四线通信方式下,D/CX(DC,D/C)引脚拉低表示命令,拉高表示数据。
2、高位在前
3、片选(CS,CSX)拉低(下降沿)为选中

和SPI时序相同,不过数据线只有一条,必须接到MOSI上。

1、向模块读数据时,需要主机先发送指令,然后st7735向主机发送数据,需要拉高CS在其期间直到下个指令。
注:读数据很少用到。

显示缓存(frame memory)寻址

1、128x160分辨率下,行寻址范围为0-159,列寻址范围为0-127,超过这个范围模块不接受。
2、行列以及扫描顺序都可以镜像翻转,通过配置MADCTL的MY,MX,ML,MH实现。
3、颜色通道可配置为RGB或者BGR模式,通过MADCTL的RGB位可配置。
4、补充,st7735可选择12-bit、16-bit、18-bit即,2k(RGB444)、65K(RGB565)、262k(RGB666)颜色模式。

显示模式

写入显示缓存前需要指定显示窗口,通过xs,xe,ys,ye设置,完成窗口设置后将像素数据按照扫描方式写入缓存即可进行显示。


这几张图说明在控制器缓存和模块写方向都是从左到右、上到下的情况下,MX,MY,MV这几个不同值下的显示情况,如果发现屏幕显示不全或者(0,0)点不是期待的位置可按照这个图重新配置MX,MY,MV这几位的值。

一些指令的解释和初始化程序

这里不放手册的图了,太多了。


手册上的命令太多了,看麻了,以上几个是可能用到的,如果有需要看手册第十章即可。

void LCD_Init(void)
{#if USE_SIM_SPILCD_SIM_SPI_GPIO_Init();
#endifLCD_RES_0();//复位HAL_Delay(100);LCD_RES_1();HAL_Delay(100);LCD_BLK_1();//打开背光HAL_Delay(100);//************* Start Initial Sequence **********//LCD_SPI_Send_Cmd(0x11); //Sleep out HAL_Delay(120);              //Delay 120ms //------------------------------------ST7735S 帧率设置-----------------------------------------// LCD_SPI_Send_Cmd(0xB1); LCD_SPI_Send_Data_8(0x01); LCD_SPI_Send_Data_8(0x2C); LCD_SPI_Send_Data_8(0x2D); LCD_SPI_Send_Cmd(0xB2); LCD_SPI_Send_Data_8(0x01);LCD_SPI_Send_Data_8(0x2C); LCD_SPI_Send_Data_8(0x2D); LCD_SPI_Send_Cmd(0xB3); LCD_SPI_Send_Data_8(0x01); LCD_SPI_Send_Data_8(0x2C); LCD_SPI_Send_Data_8(0x2D); LCD_SPI_Send_Data_8(0x01); LCD_SPI_Send_Data_8(0x2C); LCD_SPI_Send_Data_8(0x2D); //------------------------------------End ST7735S Frame Rate---------------------------------// LCD_SPI_Send_Cmd(0xB4); //Dot inversion LCD_SPI_Send_Data_8(0x07); //------------------------------------ST7735S 功率设置---------------------------------// LCD_SPI_Send_Cmd(0xC0); LCD_SPI_Send_Data_8(0xA2); LCD_SPI_Send_Data_8(0x02); LCD_SPI_Send_Data_8(0x84); LCD_SPI_Send_Cmd(0xC1); LCD_SPI_Send_Data_8(0xC5); LCD_SPI_Send_Cmd(0xC2); LCD_SPI_Send_Data_8(0x0A); LCD_SPI_Send_Data_8(0x00); LCD_SPI_Send_Cmd(0xC3); LCD_SPI_Send_Data_8(0x8A); LCD_SPI_Send_Data_8(0x2A); LCD_SPI_Send_Cmd(0xC4); LCD_SPI_Send_Data_8(0x8A); LCD_SPI_Send_Data_8(0xEE); //---------------------------------End ST7735S Power Sequence-------------------------------------// LCD_SPI_Send_Cmd(0xC5); //VCOM LCD_SPI_Send_Data_8(0x0E); LCD_SPI_Send_Cmd(0x36);//0x00 0x80 0x40 0xc0 0x20 0xA0 0x60 0xE0; LCD_SPI_Send_Data_8(0x00);//------------------------------------ST7735S Gamma Sequence---------------------------------// LCD_SPI_Send_Cmd(0xE0); LCD_SPI_Send_Data_8(0x04); LCD_SPI_Send_Data_8(0x22); LCD_SPI_Send_Data_8(0x07); LCD_SPI_Send_Data_8(0x0A); LCD_SPI_Send_Data_8(0x2E); LCD_SPI_Send_Data_8(0x30); LCD_SPI_Send_Data_8(0x25); LCD_SPI_Send_Data_8(0x2A); LCD_SPI_Send_Data_8(0x28); LCD_SPI_Send_Data_8(0x26); LCD_SPI_Send_Data_8(0x2E); LCD_SPI_Send_Data_8(0x3A); LCD_SPI_Send_Data_8(0x00); LCD_SPI_Send_Data_8(0x01); LCD_SPI_Send_Data_8(0x03); LCD_SPI_Send_Data_8(0x13); LCD_SPI_Send_Cmd(0xE1); LCD_SPI_Send_Data_8(0x04); LCD_SPI_Send_Data_8(0x16); LCD_SPI_Send_Data_8(0x06); LCD_SPI_Send_Data_8(0x0D); LCD_SPI_Send_Data_8(0x2D); LCD_SPI_Send_Data_8(0x26); LCD_SPI_Send_Data_8(0x23); LCD_SPI_Send_Data_8(0x27); LCD_SPI_Send_Data_8(0x27); LCD_SPI_Send_Data_8(0x25); LCD_SPI_Send_Data_8(0x2D); LCD_SPI_Send_Data_8(0x3B); LCD_SPI_Send_Data_8(0x00); LCD_SPI_Send_Data_8(0x01); LCD_SPI_Send_Data_8(0x04); LCD_SPI_Send_Data_8(0x13); //------------------------------------End ST7735S Gamma Sequence-----------------------------// LCD_SPI_Send_Cmd(0x3A); //65k mode LCD_SPI_Send_Data_8(0x05); LCD_SPI_Send_Cmd(0x29); //Display on
}

帧率和功率,伽马设置无需理解。

CubeMX配置以及SPI通信部分源码

时钟不要太高,不要超过14M,硬件SPI情况下有可能会初始化不成功,加一些延时即可。

#if USE_SIM_SPI
void LCD_SIM_SPI_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pins : PBPin PBPin PBPin */GPIO_InitStruct.Pin = SPI_SIM_SDA_PIN|SPI_SIM_SCL_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}void LCD_Writ_Bus(unsigned char dat)
{unsigned char i;LCD_CS_0();for(i=0;i<8;i++){           LCD_SCLK_0();if(dat&0x80){LCD_MOSI_1();}else{LCD_MOSI_0();}LCD_SCLK_1();dat<<=1;}  LCD_CS_1();
}void LCD_WR_DATA(unsigned char dat)
{LCD_Writ_Bus(dat>>8);LCD_Writ_Bus(dat);
}void LCD_WR_DATA8(unsigned char dat)
{LCD_Writ_Bus(dat);
}void LCD_WR_REG(unsigned char dat)
{LCD_DC_0();//写命令LCD_Writ_Bus(dat);LCD_DC_1();//写数据
}void LCD_SPI_Send_Cmd(unsigned char CMD)
{LCD_WR_REG(CMD);
}void LCD_SPI_Send_Data_8(unsigned char data)
{LCD_WR_DATA8(data);
}void LCD_SPI_Send_Data_816(unsigned int data)
{LCD_WR_DATA(data);
}
#else
/********************************************
@Function name;             void LCD_SPI_Send_Cmd(unsigned char CMD)
@Function description;      LCD发送指令
@Function input;
@Function output;
@Date;
*********************************************/
/**********FUNTCTION NOTICE**********************************/
void LCD_SPI_Send_Cmd(unsigned char CMD)
{   LCD_CS_0();LCD_DC_0();  HAL_SPI_Transmit(&hspi2, &CMD, 1, 0xffff);LCD_CS_1();  // HAL_Delay(1);
}/********************************************
@Function name;            void LCD_SPI_Send_Data_8(unsigned char data)
@Function description; 发送八位数据
@Function input;
@Function output;
@Date;
*********************************************/
/**********FUNTCTION NOTICE**********************************/
void LCD_SPI_Send_Data_8(unsigned char data)
{LCD_CS_0();LCD_DC_1();HAL_SPI_Transmit(&hspi2, &data, 1, 0xffff);LCD_CS_1();// HAL_Delay(1);
}/********************************************
@Function name;           void LCD_SPI_Send_Data_16(unsigned int data)
@Function description; 发送十六位数据
@Function input;
@Function output;
@Date;         特别注意很少需要直接发送十六位数据,RGB565模式下发送像素数据需要。
*********************************************/
/**********FUNTCTION NOTICE**********************************/
void LCD_SPI_Send_Data_16(unsigned int data)
{LCD_SPI_Send_Data_8(data >> 8);LCD_SPI_Send_Data_8(data);
}
#endif

附件:参考手册以及例程(来自合宙Lua社区,其实就是中景园的例程)

Lua社区:https://doc.openluat.com/wiki/21?wiki_page_id=2650
例程下载:https://cdn.openluat-luatcommunity.openluat.com/attachment/20211112203446851_ST7735_1.8LCD%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81_%E5%90%88%E5%AE%99.zip
或者去合宙淘宝店找下也可以。

单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕相关推荐

  1. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  2. 简单的记录一下使用HAL库的SPI外挂W25Q32

    简单的记录一下使用HAL库的SPI外挂W25Q32 抽筋了,想记录一下. cubeMX配置SPI CS脚 spi.h 里添加 #define FLASH_ID 0XEF14//指令表#define W ...

  3. 华大HC32F460 SPI 驱动 ST7735S LCD显示器

    华大HC32F460 SPI 驱动 ST7735S LCD显示器 前言: STM32改HC32F460 换芯片后发现SPI硬件驱动不了屏了,这个小问题搞了很久,最后用逻辑分析仪,分析时序,然后解决了, ...

  4. STM32单片机基础17——使用硬件SPI驱动TFT-LCD(ST7789)

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与ST7789通信,驱动16bit TFT-LCD 屏幕. 0. 前言 学习 SPI 外设驱动LCD屏幕没有 ...

  5. 温湿度传感器驱动SHT85 单片机STM32 HAL库

    功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...

  6. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  7. STM32 HAL库 STM32CubeMX -- SPI

    文章目录 一.SPI 协议简介 SPI 物理层 SPI 协议层 二.SPI 的架构 三.通讯过程 四.STM32Cube MX配置 五.SPI HAL库函数 一.SPI 协议简介 SPI (Seria ...

  8. STM32F030 HAL库硬件SPI操作W25Q16存储芯片(二)

    上篇文章介绍了W25Q16芯片的一些基本信息,这篇主要介绍编程操作. /*封装读写操作 SPI 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 */ uint8_t SPI_R ...

  9. STM32F4 HAL库开发 -- SPI Flash

    一.驱动 bsp_spi_flash.c #include "THC_Board_include_h.h"/* Private define ------------------- ...

最新文章

  1. Linux运维中如何进行网页加密?
  2. 一个美国女警的工作记录(转载)
  3. 重装windows2003遇到的老问题:0X0000007B和显卡驱动安装不上。
  4. big endian and little endian
  5. ae中心点重置工具_AE脚本:锚点中心点移动对齐脚本 Move Anchor Point 3
  6. Asianux Server 3.0安装截图
  7. Atitit.mybatis的测试  以及spring与mybatis在本项目中的集成配置说明
  8. PHP网站开启gzip压缩,php中开启gzip压缩的2种方法代码
  9. js倒计时,距离某个时间的倒计时。
  10. [渝粤教育] 西南科技大学 国际贸易理论与实务 在线考试复习资料2021版(2)
  11. JZOJ 6290. 倾斜的线
  12. 最便宜的那款特斯拉,刚刚喜提“最安全汽车”称号(然后被打脸)
  13. [导入]SQL Server存储过程编程经验技巧
  14. Protobuf3 序列化
  15. eclipse关联KEmulator模拟器开发J2ME游戏
  16. 量子化学计算机理,量子化学(理论化学的分支学科)_百度百科
  17. SPSS 检验后显著性识别
  18. 【python爬虫专项(27)】拉勾网数据采集(关键词网址不发生变化)
  19. 有一部电影用计算机回到未来,《复联4》调侃《回到未来》,1985年的这部穿越片,到底讲了什么...
  20. html桌面壁纸教程,Photoshop设计简易版的电脑桌面壁纸教程

热门文章

  1. Win10开机自动登录的方法
  2. Foundation起步
  3. 离开你,才知道如此的痛
  4. CV第四次上机 利用双目图像计算深度图
  5. 2023年人工智能GPT-4时代,最新13个ChatGPT商业市场AIGC应用正在掀起革命性变革!
  6. 从手工测试转型web自动化测试继而转型成专门做自动化测试的学习路线
  7. 如何搭建一个Spring框架超详细
  8. Python: 字符串与字节流的两种转换方式
  9. 老板的企业管理-五项管理
  10. python库能画什么东西_Python turtle库能画出什么好玩的东西?