概述

最近在学习正点原子潘多拉开发板,在此结合原子哥的代码,
对SPI驱动LCD做一个详细介绍。

TFTLCD 和 SPI

TFTLCD介绍

TFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD 与无源TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD 也被叫做真彩液晶显示器。

SPI介绍

SPI 是英语Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX 系列处理器上定义的。SPI 接口主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32L4 也有SPI 接口。

SPI驱动LCD代码详解

spi.h

void SPI3_Init(void);
void SPI3_SetSpeed(u8 SPI_BaudRatePrescaler);  // 设置波特率传输速度
u8 SPI3_ReadWriteByte(u8 TxData);              // 读写数据
u8 SPI3_WriteByte(u8 *TxData,u16 size);        // 写字节

spi.c

#include "spi3.h"
#include "delay.h"SPI_HandleTypeDef SPI3_Handler;  // 生成SPI3句柄
/*** 功能描述:SPI3初始化代码,配置成主机模式** 参数: void** 返回值:void*/
void SPI3_Init(void)
{SPI3_Handler.Instance=SPI3;                         //SPI3SPI3_Handler.Init.Mode=SPI_MODE_MASTER;             //设置SPI工作模式,设置为主模式SPI3_Handler.Init.Direction=SPI_DIRECTION_2LINES;   //设置SPI单向或者双向的数据模式:SPI设置为双线模式SPI3_Handler.Init.DataSize=SPI_DATASIZE_8BIT;       //设置SPI的数据大小:SPI发送接收8位帧结构SPI3_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH;    //串行同步时钟的空闲状态为高电平SPI3_Handler.Init.CLKPhase=SPI_PHASE_2EDGE;         //串行同步时钟的第二个跳变沿(上升或下降)数据被采样,偶数个跳变沿时被采样SPI3_Handler.Init.NSS=SPI_NSS_SOFT;                 //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI3_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2;//定义波特率预分频的值:波特率预分频值为256SPI3_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI3_Handler.Init.TIMode=SPI_TIMODE_DISABLE;        //关闭TI模式SPI3_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验SPI3_Handler.Init.CRCPolynomial=7;                  //CRC值计算的多项式HAL_SPI_Init(&SPI3_Handler);                        //初始化SPI3__HAL_SPI_ENABLE(&SPI3_Handler);                    //使能SPI3
}/*** @brief   SPI3底层驱动,时钟使能,引脚配置** @param   hspi   SPI句柄** @return  void*/
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOB_CLK_ENABLE();       //使能GPIOB时钟__HAL_RCC_SPI3_CLK_ENABLE();        //使能SPI3时钟//PB3.5GPIO_Initure.Pin=GPIO_PIN_3|GPIO_PIN_5;               // 先看复用配置,看到PB3,4,5为复用功能,然后3,5属于从主机输出到IO口,所以需要选用复用推挽输出GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;   //80Mhz           GPIO_Initure.Alternate=GPIO_AF6_SPI3;           //PB3.5复用为SPI3HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}/*** 功能描述:SPI3 读写一个字节** 参数:TxData    要写入的字节** 返回值:u8      读取到的字节*/
u8 SPI3_ReadWriteByte(u8 TxData)
{u8 Rxdata;HAL_SPI_TransmitReceive(&SPI3_Handler,&TxData,&Rxdata,1, 1000);       return Rxdata;                     //返回收到的数据
}/*** 功能描述:SPI3 写入一个字节** 参数:TxData    要写入的字节*       size  写入字节大小** 返回值:u8      0:写入成功,其他:写入失败*/
u8 SPI3_WriteByte(u8 *TxData,u16 size)
{return HAL_SPI_Transmit(&SPI3_Handler,TxData,size,1000);  // 发送数据,并等待1000us
}

lcd.h

#ifndef __LCD_H
#define __LCD_H
#include "sys.h"
extern u16  POINT_COLOR;        //默认画笔颜色
extern u16  BACK_COLOR;     //默认背景颜色//LCD的宽和高定义
#define LCD_Width   240
#define LCD_Height  240//画笔颜色
#define WHITE            0xFFFF
#define BLACK            0x0000
#define BLUE             0x001F
#define BRED             0XF81F
#define GRED             0XFFE0
#define GBLUE            0X07FF
#define RED              0xF800
#define MAGENTA          0xF81F
#define GREEN            0x07E0
#define CYAN             0x7FFF //青色
#define YELLOW           0xFFE0
#define BROWN            0XBC40 //棕色
#define BRRED            0XFC07 //棕红色
#define GRAY             0X8430 //灰色
//GUI颜色#define DARKBLUE          0X01CF //深蓝色
#define LIGHTBLUE        0X7D7C //浅蓝色
#define GRAYBLUE         0X5458 //灰蓝色
//以上三色为PANEL的颜色 #define LIGHTGREEN       0X841F //浅绿色
//#define LIGHTGRAY        0XEF5B //浅灰色(PANNEL)
#define LGRAY            0XC618 //浅灰色(PANNEL),窗体背景色#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)/*LCD_PWR:   PB7LCD_RST: PB6LCD_DC:      PB4LCD_CS:      PD7
*/
#define LCD_PWR(n)      (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET))    // 背光控制
#define LCD_RST(n)      (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET))   // 复位控制
#define LCD_DC(n)       (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET))   // 选择数据或命令
#define LCD_CS(n)       (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7,GPIO_PIN_RESET))  // 片选void LCD_Init(void);                                      //初始化
void LCD_DisplayOn(void);                                   //开显示
void LCD_DisplayOff(void);                                  //关显示
void LCD_Write_HalfWord(const u16 da);                      //写半个字节数据到LCD
void LCD_Address_Set(u16 x1, u16 y1, u16 x2, u16 y2);       //设置数据显示区域
void LCD_Clear(u16 color);                                  //清屏
void LCD_Fill(u16 x_start, u16 y_start, u16 x_end, u16 y_end, u16 color);               //填充单色
void LCD_Draw_Point(u16 x, u16 y);                          //画点
void LCD_Draw_ColorPoint(u16 x, u16 y,u16 color);           //画带颜色点
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);          //画线
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);     //画矩形
void LCD_Draw_Circle(u16 x0, u16 y0, u8 r);                 //画圆
void LCD_ShowChar(u16 x, u16 y, char chr, u8 size);         //显示一个字符
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);       //显示一个数字
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);  //显示数字
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,char *p);//显示字符串
void LCD_ShowChinese(u16 x, u16 y, const u8 *ch, u8 size, u8 n, u8 mode);      // 显示汉字
void LCD_Show_Image(u16 x, u16 y, u16 width, u16 height, const u8 *p);//显示图片#endif

由于lcd.c文件中内容过多,所以在此不显示,在lcd.c文件中,可以添加需要显示的内容,比如数字、字符串等等。

STM32L475 SPI驱动LCD ST7789V2详解相关推荐

  1. 9、Windows驱动开发技术详解笔记(5) 基本语法回顾

    5.在驱动中获取系统时间 1)获取启动毫秒数 在ring3 我们可以通过一个GetTickCount 函数来获得自系统启动开始的毫秒数,在ring0也有一个与之对应的KeQueryTickCount ...

  2. 15、Windows驱动开发技术详解笔记(11) 基本概念

    9.Windows驱动程序的入口函数规定为_DriverEntry@8,所以用C++编写时要用extern. 驱动程序中,不能使用编译器运行时函数,甚至C语言中的malloc,C++的new函数都不能 ...

  3. 《Windows驱动开发技术详解》学习笔记

    Abstract   如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...

  4. linux驱动之总线详解

    linux驱动 第一章 linux驱动之设备与驱动 第二章 linux驱动之设备树与GPIO子系统 linux驱动之总线详解 linux驱动 一.总线bus 1.bus在linux中文件结构 2.bu ...

  5. c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]

    Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...

  6. 激光二极管驱动电路图大全(六款激光二极管驱动电路设计原理图详解) - 全文

    激光二极管驱动电路图大全(六款激光二极管驱动电路设计原理图详解) - 全文 来源:网络整理 作者:2018年03月01日 14:36 1 分享 订阅 关键词:驱动电路激光二极管 激光二极管驱动电路图( ...

  7. 驱动开发函数详解之Wdm

    驱动开发函数详解之Wdm 前言 IRP(I/O Request Package) == 输入输出请求包 上层应用程序需要访问底层输入输出设备时,发出I/O请求,系统会把这些请求转化为IRP数据,不同的 ...

  8. 【dubbo源码解析】 --- dubbo spi 机制(@SPI、@Adaptive)详解

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 注意:dubbo 要求SPI扩展点的实现类必须要有一个无参构造,除了Wrapper实现类之外 文章目 ...

  9. linux小红帽系统装打印机驱动,Linux系统详解 第三篇:红帽RHEL的安装

    Linux系统详解 第二篇:红帽RHEL的安装 前言: 本系列文章取材广泛,有来自于互联网的,有来自教科书的,有来自自己的笔记的,也有来自自己对Linux的经验积累的.此系列的文章都是经过长时间的整理 ...

最新文章

  1. 收藏|490页阿里、腾讯、京东等公司的推荐算法最佳实践!pdf限时下载
  2. mysql存储过程详解[转]
  3. java是如何写入文件的
  4. 与时俱进:在JAX-RS API中采用OpenAPI v3.0.0
  5. Swing应用程序中的CDI事件可将UI与事件处理分离
  6. 不属于计算机完成科学特点的是,2020年9月网络教育统考计算机应用基础模拟题试卷4...
  7. 递归计算二叉树的高度_如何使用递归方法计算二叉树的高度
  8. sqlca.sqlcode!=0
  9. php的图像处理有哪些实际作用,PHP_一个经典实用的PHP图像处理类分享,本图像处理类可以完成对图片 - phpStudy...
  10. 数据库版本自带的mysql replication双机主从备份安装配置
  11. 资深渗透测试工程师的渗透技巧总结(67个Tips)
  12. 电机与拖动:异步交流电动机改变电压,转子电阻及频率的机械特性曲线(Matlab实现方法)
  13. C++计算四则表达式的模板
  14. 复合调味品崛起,海天还会是YYDS吗?
  15. 2019牛客多校第九场 H Cutting Bamboos (二分主席树)
  16. [misc]T型知识实践结构的力量
  17. Hadoop之电信日志数据处理(一)------业务简介
  18. NR Polar Code 四 译码1(SC: N=2,N=4)
  19. ASCII二进制一键转换
  20. TwinCAT3 控制器PLC之间EAP通讯1-主机给多个从机发送

热门文章

  1. 代码整洁之道 1-3阅读笔记
  2. 远程工具之一---rsync用法介绍
  3. 在D天内送达包裹的能力
  4. 拉里•埃里森和他的Oracle公司
  5. [论文阅读笔记14]Nested named entity recognition revisited
  6. matlab摩托车刹车问题,摩托车刹车系统的这些知识,你了解过吗?
  7. 高德地图如何取消订单_高德地图怎么取消订单
  8. 正睿OI DAY12 ks5
  9. python编写赛车_90%的人说Python程序慢,5大神招让你的代码像赛车一样跑起来
  10. [Python深度学习入门]实战一·Numpy梯度下降求最小值