基于STM32F429的TFT0.96屏幕驱动
1.介绍TFT


2.Cube配置
该屏幕是用SPI通信的,但没有MISO引脚,意思是说该屏幕只能接收数据,但无法读取里面的数据,理论上说四线就能启动,但我弄不出,只能用六线。
在Cube上只要开启六个GPIO口作为通信引脚就行了。

3.驱动程序
如果都是用ST7735芯片驱动的,不管屏幕是多少寸的,都能驱动
lcd.c
#include "lcd.h" #include "stm32f4xx.h"
//默认为竖屏
//_lcd_dev lcddev;
//SPI_HandleTypedef hSPIx;
//画笔颜色,背景颜色
uint16_t POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF; _lcd_dev lcddev_2; SPI_HandleTypedef hSPIx; void vSPI_LCD_Handle_Init(void)
{
//引脚 Pin: hSPIx.pSCK_Port = SPI_SCK_GPIO_Port; //SCK
hSPIx.uSCK_Pin = SPI_SCK_Pin; hSPIx.pMOSI_Port = SPI_SDA_GPIO_Port; //MOSI
hSPIx.uMOSI_Pin = SPI_SDA_Pin;
} //STM32_模拟SPI写一个字节数据底层函数
void SPIv_WriteData(uint8_t Data)
{
unsigned char i=;
for ( i = ; i > ; i --)
{
LCD_SCL_CLR;
if ( Data & 0x80)
{ LCD_SDA_SET; }
//输出数据
else
{
LCD_SDA_CLR;
}
LCD_SCL_SET;
Data <<= ;
} }
//向液晶屏总线写入写8位数据
void TFT_WR_DATA(uint8_t data)
{
LCD_CS_CLR; //软件控制片选信号
LCD_RS_SET;
SPIv_WriteData(data);
LCD_CS_SET; //软件控制片选信号
}
// 向液晶屏总线写入写16位指令
void TFT_WR_REG(uint16_t data)
{
LCD_CS_CLR; //软件控制片选信号
LCD_RS_CLR;
SPIv_WriteData(data);
LCD_CS_SET; //软件控制片选信号
}
//写寄存器数据
void TFT_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue)
{
TFT_WR_REG(LCD_Reg);
TFT_WR_DATA(LCD_RegValue);
}
//开始写GRAM 在给液晶屏传送RGB数据前,应该发送写GRAM指令
void TFT_WriteRAM_Prepare(void)
{
TFT_WR_REG(lcddev_2.wramcmd);
} void TFT_RESET(void) //液晶屏复位
{ LCD_RST_SET;
TFT_WR_REG(0x01);
HAL_Delay();
}
//设置LCD参数
//方便进行横竖屏模式切换
void TFT_SetParam(void)
{
lcddev_2.wramcmd=0x2C; lcddev_2.dir=;//竖屏
lcddev_2.width=;
lcddev_2.height=;
lcddev_2.setxcmd=0x2A;
lcddev_2.setycmd=0x2B;
TFT_WriteReg(0x36,0xC8); } void TFT_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
{ TFT_WR_REG(lcddev_2.setxcmd);
TFT_WR_DATA(xStar>>);
TFT_WR_DATA(0x00FF&xStar+);
TFT_WR_DATA(xEnd>>);
TFT_WR_DATA(0x00FF&xEnd+); TFT_WR_REG(lcddev_2.setycmd);
TFT_WR_DATA(yStar>>);
TFT_WR_DATA(0x00FF&yStar+);
TFT_WR_DATA(yEnd>>);
TFT_WR_DATA(0x00FF&yEnd+); TFT_WriteRAM_Prepare(); //开始写入GRAM
}
// 8位总线下如何写入一个16位数据
void TFT_WR_DATA_16Bit(uint16_t data)
{
LCD_CS_CLR;
LCD_RS_SET; SPIv_WriteData(data>>);
SPIv_WriteData(data); LCD_CS_SET;
}
// LCD全屏填充清屏函数
void TFT_Clear(uint16_t Color)
{
uint16_t i,j;
TFT_SetWindows(, , lcddev_2.width-, lcddev_2.height-); for (i = ; i < lcddev_2.width; i ++)
{
for (j = ; j < lcddev_2.height; j ++)
TFT_WR_DATA_16Bit(Color); //写入数据
}
}
void TFT_Init(void)
{ TFT_RESET(); //液晶屏复位 //************* Start Initial Sequence **********//
//开始初始化液晶屏
TFT_WR_REG(0x11);//Sleep exit
HAL_Delay();
//ST7735R Frame Rate
TFT_WR_REG(0xB1);
TFT_WR_DATA(0x01);
TFT_WR_DATA(0x2C);
TFT_WR_DATA(0x2D); TFT_WR_REG(0xB2);
TFT_WR_DATA(0x01);
TFT_WR_DATA(0x2C);
TFT_WR_DATA(0x2D); TFT_WR_REG(0xB3);
TFT_WR_DATA(0x01);
TFT_WR_DATA(0x2C);
TFT_WR_DATA(0x2D);
TFT_WR_DATA(0x01);
TFT_WR_DATA(0x2C);
TFT_WR_DATA(0x2D); TFT_WR_REG(0xB4); //Column inversion
TFT_WR_DATA(0x07); //ST7735R Power Sequence
TFT_WR_REG(0xC0);
TFT_WR_DATA(0xA2);
TFT_WR_DATA(0x02);
TFT_WR_DATA(0x84);
TFT_WR_REG(0xC1);
TFT_WR_DATA(0xC5); TFT_WR_REG(0xC2);
TFT_WR_DATA(0x0A);
TFT_WR_DATA(0x00); TFT_WR_REG(0xC3);
TFT_WR_DATA(0x8A);
TFT_WR_DATA(0x2A);
TFT_WR_REG(0xC4);
TFT_WR_DATA(0x8A);
TFT_WR_DATA(0xEE); TFT_WR_REG(0xC5); //VCOM
TFT_WR_DATA(0x0E); TFT_WR_REG(0x36); //MX, MY, RGB mode
TFT_WR_DATA(0xC8); //ST7735R Gamma Sequence
TFT_WR_REG(0xe0);
TFT_WR_DATA(0x0f);
TFT_WR_DATA(0x1a);
TFT_WR_DATA(0x0f);
TFT_WR_DATA(0x18);
TFT_WR_DATA(0x2f);
TFT_WR_DATA(0x28);
TFT_WR_DATA(0x20);
TFT_WR_DATA(0x22);
TFT_WR_DATA(0x1f);
TFT_WR_DATA(0x1b);
TFT_WR_DATA(0x23);
TFT_WR_DATA(0x37);
TFT_WR_DATA(0x00);
TFT_WR_DATA(0x07);
TFT_WR_DATA(0x02);
TFT_WR_DATA(0x10); TFT_WR_REG(0xe1);
TFT_WR_DATA(0x0f);
TFT_WR_DATA(0x1b);
TFT_WR_DATA(0x0f);
TFT_WR_DATA(0x17);
TFT_WR_DATA(0x33);
TFT_WR_DATA(0x2c);
TFT_WR_DATA(0x29);
TFT_WR_DATA(0x2e);
TFT_WR_DATA(0x30);
TFT_WR_DATA(0x30);
TFT_WR_DATA(0x39);
TFT_WR_DATA(0x3f);
TFT_WR_DATA(0x00);
TFT_WR_DATA(0x07);
TFT_WR_DATA(0x03);
TFT_WR_DATA(0x10); TFT_WR_REG(0x2a);
TFT_WR_DATA(0x00);
TFT_WR_DATA(0x00);
TFT_WR_DATA(0x00);
TFT_WR_DATA(0x7f); TFT_WR_REG(0x2b);
TFT_WR_DATA(0x00);
TFT_WR_DATA(0x00);
TFT_WR_DATA(0x00);
TFT_WR_DATA(0x9f); TFT_WR_REG(0xF0); //Enable test command
TFT_WR_DATA(0x01);
TFT_WR_REG(0xF6); //Disable ram power save mode
TFT_WR_DATA(0x00); TFT_WR_REG(0x3A); //65k mode
TFT_WR_DATA(0x05);
TFT_WR_REG(0x29);//Display on TFT_SetParam();//设置LCD参数
LCD_LED_SET;//点亮背光
//LCD_Clear(WHITE);
}
lcd,h
#ifndef __LCD_H
#define __LCD_H
#include "stm32f4xx.h"
#include "MAIN.h"
//支持横竖屏快速定义切换,支持8/16位模式切换 #define USE_HORIZONTAL 0 //定义是否使用横屏 0,不使用.1,使用. //LCD重要参数集
typedef struct
{
uint16_t width; //LCD 宽度
uint16_t height; //LCD 高度
uint16_t id; //LCD ID
uint8_t dir; //横屏还是竖屏控制:0,竖屏;1,横屏。
uint16_t wramcmd; //开始写gram指令
uint16_t setxcmd; //设置x坐标指令
uint16_t setycmd; //设置y坐标指令
}_lcd_dev; #define LCD_CTRL GPIOB //定义TFT数据端口 #define LCD_LED GPIO_PIN_9 //
#define LCD_RS GPIO_PIN_3 //
#define LCD_CS GPIO_PIN_4 //
#define LCD_SCL GPIO_PIN_7 //6
#define LCD_SDA GPIO_PIN_8 //
#define LCD_RST GPIO_PIN_13 // #define LCD_SDA_SET ( SPI_SDA_GPIO_Port->BSRR = SPI_SDA_Pin);
#define LCD_SDA_CLR ( SPI_SDA_GPIO_Port->BSRR = SPI_SDA_Pin<<16U); #define LCD_SCL_SET ( SPI_SCK_GPIO_Port->BSRR = SPI_SCK_Pin);
#define LCD_SCL_CLR ( SPI_SCK_GPIO_Port->BSRR = SPI_SCK_Pin<<16U); #define LCD_CS_SET ( LCD_CS_GPIO_Port->BSRR = LCD_CS_Pin);
#define LCD_CS_CLR ( LCD_CS_GPIO_Port->BSRR = LCD_CS_Pin<<16U); #define LCD_RS_SET ( LCD_RS_GPIO_Port->BSRR = LCD_RS_Pin);
#define LCD_RS_CLR ( LCD_RS_GPIO_Port->BSRR = LCD_RS_Pin<<16U); #define LCD_RST_SET ( LCD_RSE_GPIO_Port->BSRR = LCD_RSE_Pin);
#define LCD_RST_CLR ( LCD_RSE_GPIO_Port->BSRR = LCD_RSE_Pin<<16U); #define LCD_LED_SET ( LCD_LED_GPIO_Port->BSRR = LCD_LED_Pin);
#define LCD_LED_CLR ( LCD_LED_GPIO_Port->BSRR = LCD_LED_Pin<<16U); /*********************************************************/
//LCD GPIO结构体
typedef struct LCD
{
//配置SPI引脚 GPIO_TypeDef * pLCD_RS_Port; //MOSI 主机发送到从机
uint16_t uLCD_RS_Pin; GPIO_TypeDef * pLCD_CS_Port; //MISO 从机发送到主机
uint16_t uLCD_CS_Pin; GPIO_TypeDef * pLCD_LED_Port; //MISO 从机发送到主机
uint16_t uLCD_LED_Pin; GPIO_TypeDef * pLCD_RSE_Port; //MISO 从机发送到主机
uint16_t uLCD_RSE_Pin;
}LCD_HandleTypedef; #define LCD_RS_1(_HANDLE_) ( (_HANDLE_)->pLCD_RS_Port->BSRR = (_HANDLE_)->uLCD_RS_Pin)
#define LCD_RS_0(_HANDLE_) ( (_HANDLE_)->pLCD_RS_Port->BSRR = (uint32_t)(_HANDLE_)->uLCD_RS_Pin<<16U) #define LCD_CS_1(_HANDLE_) ( (_HANDLE_)->pLCD_CS_Port->BSRR = (_HANDLE_)->uLCD_CS_Pin)
#define LCD_CS_0(_HANDLE_) ( (_HANDLE_)->pLCD_CS_Port->BSRR = (uint32_t)(_HANDLE_)->uLCD_CS_Pin<<16U) #define LCD_LED_1(_HANDLE_) ( (_HANDLE_)->pLCD_LED_Port->BSRR = (_HANDLE_)->uLCD_LED_Pin)
#define LCD_LED_0(_HANDLE_) ( (_HANDLE_)->pLCD_LED_Port->BSRR = (uint32_t)(_HANDLE_)->uLCD_LED_Pin<<16U) #define LCD_RSE_1(_HANDLE_) ( (_HANDLE_)->pLCD_RSE_Port->BSRR = (_HANDLE_)->uLCD_RSE_Pin)
#define LCD_RSE_0(_HANDLE_) ( (_HANDLE_)->pLCD_RSE_Port->BSRR = (uint32_t)(_HANDLE_)->uLCD_RSE_Pin<<16U)
/*********************************************************/
/*********************************************************/
typedef struct spi
{
//配置SPI引脚 GPIO_TypeDef * pCSN_Port; //CSN 片选信号
uint16_t uCSN_Pin; GPIO_TypeDef * pSCK_Port; //SCK 时序
uint16_t uSCK_Pin; GPIO_TypeDef * pMOSI_Port; //MOSI 主机发送到从机
uint16_t uMOSI_Pin; GPIO_TypeDef * pMISO_Port; //MISO 从机发送到主机
uint16_t uMISO_Pin; }SPI_HandleTypedef; //----------------------------------------------
//
// define
//
//---------------------------------------------- //#define SPI_SCK_1(_HANDLE_) ( SPI_SCK_GPIO_Port->BSRR = SPI_SCK_Pin);
//#define SPI_SCK_0(_HANDLE_) ( SPI_SCK_GPIO_Port->BSRR = SPI_SCK_Pin<<16U); //#define SPI_MOSI_1(_HANDLE_) ( SPI_SDA_GPIO_Port->BSRR = SPI_SDA_Pin);
//#define SPI_MOSI_0(_HANDLE_) ( SPI_SDA_GPIO_Port->BSRR = SPI_SDA_Pin<<16U); #define SPI_SCK_1(_HANDLE_) ( (_HANDLE_)->pSCK_Port->BSRR = (_HANDLE_)->uSCK_Pin)
#define SPI_SCK_0(_HANDLE_) ( (_HANDLE_)->pSCK_Port->BSRR = (uint32_t)(_HANDLE_)->uSCK_Pin<<16U) #define SPI_MOSI_1(_HANDLE_) ( (_HANDLE_)->pMOSI_Port->BSRR = (_HANDLE_)->uMOSI_Pin)
#define SPI_MOSI_0(_HANDLE_) ( (_HANDLE_)->pMOSI_Port->BSRR = (uint32_t)(_HANDLE_)->uMOSI_Pin<<16U) void vSPI_LCD_Handle_Init(void);
void SPIv_WriteData(uint8_t Data);
void TFT_Init(void);
void TFT_WR_DATA(uint8_t data);
void TFT_Clear(uint16_t Color);
void TFT_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void vSPI_LCD_Handle_Init(void);
void showimage(const unsigned char *p); //画笔颜色 #define RED 0xf800
#define GREEN 0x07e0
#define BLUE 0x001f
#define WHITE 0xffff
#define BLACK 0x0000
#define YELLOW 0xFFE0
#define GRAY0 0xEF7D
#define GRAY1 0x8410
#define GRAY2 0x4208 extern unsigned char gImage_qq[]; #endif
这只是我的初始化的函数,还有GUI的函数可以看网上的例程
基于STM32F429的TFT0.96屏幕驱动的更多相关文章
- 基于STM32F1的时钟芯片DS1302驱动
目录 DS1302.h源代码 DS1302.c源代码 DS1302.h源代码 /** ********************************************************* ...
- 基于STM32F429和Cube的主从定时器多通道输出固定个数的PWM波形
主从定时器的原理已在上篇博文: 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序 讲解了,这篇重点就讲如何实现多通道的PWM级联输出. 1.软件环境 Keil5 ...
- 基于335X平台Linux交换芯片驱动开发
基于335X平台Linux交换芯片驱动开发 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.Kernel版本:4.4.12,采用FDT 3.交换芯片MARVEL ...
- 基于Minifilter框架的文件过滤驱动理解
概述 Minifilter即File System Minifilter Drivers,是Windows为了简化第三方开发人员开发文件过滤驱动而提供的一套框架,这个框架依赖于一个称之为Filter ...
- 基于STM32F1的语音合成芯片SYN6288驱动
目录 说明 SYN6288.h SYN6288.c 说明 基于USART2制作,封装了各种通信协议 SYN6288.h #ifndef _SYN6288_H_ #define _SYN6288_H_ ...
- windows10 下使用Pycharm2016 基于Anaconda3 Python3.6 安装Mysql驱动总结
本文记录:在PyCharm2016.3.3 中基于Anaconda3 Python3.6版本安装Python for Mysql驱动.尝试了安装Mysql-Connector成功,但是连接数据库时驱动 ...
- 基于设备树的TQ2440触摸屏驱动移植
平台 开发板:tq2440 内核:Linux-4.9 u-boot:u-boot-2015.04 概述 之前移植了LCD驱动,下面继续移植触摸屏驱动,然后将tslib也移植上去. 正文 一.移植触 ...
- 基于Linux的v4l2视频架构驱动编写(转载)
转自:http://www.linuxidc.com/Linux/2011-03/33022.htm 其实,我刚开始一直都不知道怎么写驱动,什么都不懂的,只知道我需要在做项目的过程中学习,所以,我就自 ...
- 基于Linux的v4l2视频架构驱动编写
其实,我刚开始一直都不知道怎么写驱动,什么都不懂的,只知道我需要在做项目的过程中学习,所以,我就自己找了一个关于编写Linux下的视频采集监控项目做,然后上学期刚开学的时候听师兄说,跟院长做项目,没做 ...
随机推荐
- 洛谷P1510 题解
前言: 其实这道题挺水的,但我居然把ta想成了 贪心 啪啪打脸 好了,废话不多说. 思路: step 1:先翻译以下题意,其实就是求出最多消耗多少体力能把东海填满,如果不能填满,就输出"Im ...
- bat 搜索进程名并kill
@echo off set/p "target=进程名(默认nginx): "if not defined target (set "target=nginx" ...
- 原生js实现图片懒加载+加入节流
这两天在学习图片的懒加载实现,看了很多大佬的博客,终于有了点成果.现在用了其中一位大佬的文章中的代码实现了图片懒加载并且在其基础上加入了节流函数. 原理就不多讲了,有需要的可以去大佬的文章看看.大佬文 ...
- Spring Cloud下基于OAUTH2+ZUUL认证授权的实现
Spring Cloud下基于OAUTH2认证授权的实现 在Spring Cloud需要使用OAUTH2来实现多个微服务的统一认证授权,通过向OAUTH服务发送某个类型的grant type进行集中认 ...
- java并发编程(二十五)----(JUC集合)LinkedBlockingDeque和ConcurrentLinkedDeque介绍
Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque.这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂. LinkedBlockingDeque 我们 ...
- 算法与数据结构基础 - 二叉查找树(Binary Search Tree)
二叉查找树基础 二叉查找树(BST)满足这样的性质,或是一颗空树:或左子树节点值小于根节点值.右子树节点值大于根节点值,左右子树也分别满足这个性质. 利用这个性质,可以迭代(iterative)或递归 ...
- 测试自动化:java+selenium3 UI自动化(1) - 环境搭建
1.前言 我大概是在2012年第一次正式接触到自动化测试,那个时候跟随我的团队一起,就当时项目的UI自动化尝试做出了探索. 在我离开那家公司的时候,我们的自动化测试体系仍然难言完美,但是也已经达到了非 ...
- Rootkit与后门隐藏技术
目录 简介 linux虚拟文件系统VFS rootkit的功能 隐藏文件 基本方法 高级方法 系统调用流程 hook sys_getdents sys_getdents的调用树 最底层的方法 隐藏进程 ...
- DRF (Django REST framework) 中的Request 与 Response
DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...
- Day 05--最终修改(一)
1.今天大家集中交流了自己的的课程设计雏形,我们感到收获颇丰.在感慨别的同学设计的别出心裁的同时,我们也反思了自己的模型.通过与老师的讨论我们决定修改已有的首页格式,以及丰富用户的身份:即小程序不仅面 ...