当前位置: 首页 > news >正文

2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6

2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6


文章目录

  • 2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6
  • 前言
  • 第1章 LCD简介
    • 1.1 LCD硬件接口介绍
  • 第2章 LCD指令介绍
  • 第3章 LCD 8080驱动方式
    • 3.1 8080写时序
    • 3.2 8080读时序
  • 第4章 LCD 驱动代码部分
    • 4.1 修改代码部分
    • 4.2 代码工程下载
  • 第5章 LCD 实验现象
  • 总结


前言

最近在做一个显示小实验,需要用STM32F103C8来驱动正点原子的2.8寸 TFTLCD屏进行功能显示,综合考虑了下该C8T6核心板的引脚资源是足够的,只要显示功能就基本够用了。该屏分辨率是 320×240 ,使用8080并口时序进行驱动,本文只用了LCD的显示功能部分,虽然这个屏是支持触摸功能,但是本文章没有使用到,节省了几个单片机IO口,注意使用的屏幕IC是ILI9341

下面的内容均是摘抄于正点原子开发板的开发指南和PPT等资料内容。


第1章 LCD简介

液晶显示器,即Liquid Crystal Display,其原理是利用了液晶导电后透光性可变的特性,配合显示器光源、彩色滤光片和电压控制等工艺,最终可以在液晶阵列上显示彩色的图像。简单理解就是由玻璃基板、背光、驱动IC等组成全彩LCD,是一种全彩显示屏,支持RGB565、RGB888显示颜色模式,所以该显示屏可以显示各种颜色。
目前液晶显示技术以 TN、STN、TFT 三种技术为主,TFTLCD 即采用了 TFT(Thin Film Transistor)薄膜晶体管技术的液晶显示器,也叫薄膜晶体管液晶显示器。
TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同的是,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。
2.8 寸的 TFTLCD 模块支持 65K 色显示,显示分辨率为 320×240,接口为 16 位的 8080 并口,自带触摸功能(本文没用到)。

1.1 LCD硬件接口介绍

LCD的引脚原理图如下图:

在这里插入图片描述

LCD屏幕对应板子引脚接线如下图:

2.8’ TFTLCD(显示部分引脚)STM32F103C8T6 MCU
CSPA3
BLPA4
RSTPA5
RDPA6
WRPA7
RSPA8
D0~D15PB0~PB15

LCD引脚功能介绍如下表:

在这里插入图片描述

第2章 LCD指令介绍

一般了解熟悉下表6条指令即可完成对 ILI9341 TFTLCD的基本显示功能了。

在这里插入图片描述
详细的指令用法描述,可以参考屏幕手册即可,这里就不详细展开了。

第3章 LCD 8080驱动方式

并口总线时序,常用于MCU屏驱动IC的访问,由Intel提出,也叫英特尔总线。

3.1 8080写时序

数据(RS=1)/命令(RS=0)在WR的上升沿,写入LCD驱动IC,RD保持高电平。

在这里插入图片描述

3.2 8080读时序

数据(RS=1)/命令(RS=0)在RD的上升沿,读取到MCU,WR保持高电平。

在这里插入图片描述

注意:上面的引脚名字是原子官方自定义的一个用于易记的名字,屏幕手册的名字对应如下表:
LCD 8080时序信号引脚说明如下表:

在这里插入图片描述

LCD 8080时序信号说明如下表:

在这里插入图片描述

第4章 LCD 驱动代码部分

拷贝STM32F103RCT6开发板的工程实验 TFTLCD实验HARDWARE下的LCD文件夹进行修改即可,大部分都不要修改,基本就改下引脚就可以了。

例程默认是做了很多款屏幕的兼容处理的,所以看起来比较复杂,代码量比较庞大,如果把没有相关屏幕的驱动删除就可以使工程代码比较简洁了,当然不处理也不影响功能的使用。

4.1 修改代码部分

lcd.h LCD引脚定义代码如下(部分示例):

//-----------------------LCD端口定义----------------------//
#define LCD_LED     PAout(4)            //LCD背光       PA4
#define LCD_RST     PAout(5)            //LCD复位       PA5#define LCD_CS_SET  GPIOA->BSRR=1<<3    //片选端口      PA3
#define LCD_RS_SET  GPIOA->BSRR=1<<8    //数据/命令     PA8
#define LCD_WR_SET  GPIOA->BSRR=1<<7    //写数据        PA7
#define LCD_RD_SET  GPIOA->BSRR=1<<6    //读数据        PA6#define LCD_CS_CLR  GPIOA->BRR=1<<3     //片选端口      PA3
#define LCD_RS_CLR  GPIOA->BRR=1<<8     //数据/命令     PA8
#define LCD_WR_CLR  GPIOA->BRR=1<<7     //写数据        PA7
#define LCD_RD_CLR  GPIOA->BRR=1<<6     //读数据        PA6//PB0~15,作为数据线
#define DATAOUT(x)  GPIOB->ODR=x;       //数据输出
#define DATAIN      GPIOB->IDR;         //数据输入这里使用了寄存器的方式操作引脚,目的是为了提升屏幕的刷新速度,如果对这个速度要求不高的话,可以使用库函数的方式实现,影响不大。

lcd.c LCD引脚定义代码如下(部分示例):

void LCD_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); //使能PORTA,B时钟和AFIO时钟GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);       //开启SWD,失能JTAGGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;  //PORTA3~8复用推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);  //GPIOAGPIO_SetBits(GPIOA,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //PORTB推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);      //GPIOBGPIO_SetBits(GPIOB,GPIO_Pin_All);//如果接了屏幕不能显示要把复位引脚接到一个IO上LCD_RST=0;delay_ms(120);LCD_RST=1;delay_ms(50); // delay 50 ms LCD_WriteReg(0x0000,0x0001);delay_ms(50); // delay 50 ms //尝试9341 ID的读取LCD_WR_REG(0XD3);lcddev.id = LCD_RD_DATA();          //dummy readlcddev.id = LCD_RD_DATA();          //读到0X00lcddev.id = LCD_RD_DATA();          //读取0X93lcddev.id <<= 8;lcddev.id |= LCD_RD_DATA();         //读取0X41printf(" LCD ID:%x\r\n", lcddev.id); //打印LCD ID//ILI9341初始化序列......
}

main.c 代码如下:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"int main(void){ u8 x=0;u8 lcd_id[12];			//存放LCD ID字符串	delay_init();	    	 //延时函数初始化	  uart_init(9600);	 	//串口初始化为9600LED_Init();		  		//初始化与LED连接的硬件接口LCD_Init();POINT_COLOR=RED; sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。				 	while(1) {		 switch(x){case 0:LCD_Clear(WHITE);break;case 1:LCD_Clear(BLACK);break;case 2:LCD_Clear(BLUE);break;case 3:LCD_Clear(RED);break;case 4:LCD_Clear(MAGENTA);break;case 5:LCD_Clear(GREEN);break;case 6:LCD_Clear(CYAN);break;case 7:LCD_Clear(YELLOW);break;case 8:LCD_Clear(BRRED);break;case 9:LCD_Clear(GRAY);break;case 10:LCD_Clear(LGRAY);break;case 11:LCD_Clear(BROWN);break;}POINT_COLOR=RED;	  LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^");	LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,lcd_id);		//显示LCD ID	      					 LCD_ShowString(30,130,200,12,12,"2014/3/7");	      					 x++;if(x==12)x=0;LED0=!LED0;	 delay_ms(1000);	} 
}

4.2 代码工程下载

可以直接下载mini开发板的TFTLCD工程代码,修改比较简单,没有涉及太复杂的代码。

第5章 LCD 实验现象

实验现象(略)

和官方的代码现象效果一致的。


总结

这个移植过程步骤还是比较简单的,只要基本懂得LCD的驱动原理,GPIO的配置基本就可以完成本次的移植操作了,后面就可以在此基础上显示各种内容了。

相关文章:

2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6

2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6 文章目录 2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6前言第1章 LCD简介1.1 LCD硬件接口介绍 第2章 LCD指令介绍第3章 LCD 8080驱动方式3.1 8080写时序3.2 8080读时序 第4章 LCD 驱动代码部分4.1 修改代码部分4.2 代码工程下载…...

Java利用TCP实现简单的双人聊天

一、创建新项目 首先创建一个新的项目&#xff0c;并命名为聊天。然后创建包&#xff0c;创建两个类&#xff0c;客户端&#xff08;SocketClient&#xff09;和服务器端&#xff08;SocketServer&#xff09; 二、实现代码 客户端代码&#xff1a; package 聊天; import ja…...

软件压力测试的重要性与用途

在当今数字化的时代&#xff0c;软件已经成为几乎所有行业不可或缺的一部分。随着软件应用规模的增加和用户数量的上升&#xff0c;软件的性能变得尤为关键。为了确保软件在面对高并发和大负载时仍然能够保持稳定性和可靠性&#xff0c;软件压力测试变得至关重要。下面是软件压…...

【数据挖掘】国科大苏桂平老师数据库新技术课程作业 —— 第二次作业

1 设 F { A B → C , B → D , C D → E , C E → G H , G → A } F\{AB\rightarrow C,B\rightarrow D, CD\rightarrow E, CE\rightarrow GH, G\rightarrow A \} F{AB→C,B→D,CD→E,CE→GH,G→A}&#xff0c;用推理的方法证明 F ∣ A B → G F\;|AB\rightarrow G F∣AB→…...

Qt + MySQL(简单的增删改查)

Qt编译MySql插件教程 帮助&#xff1a; SQL Programming QSqlDatabase 静态函数 1.drivers()&#xff0c;得到可以使用的数据库驱动名字的集合 [static] QStringList QSqlDatabase::drivers();2.addDatabase()&#xff0c;添加一个数据库实例 [static] QSqlDatabase QSql…...

postgresql设置免密登录

您提供的步骤描述了在 PostgreSQL 数据库环境中配置服务器间的 SSH 无密码登录和数据库用户认证的过程。这些步骤主要用于设置一个高可用性、负载平衡的数据库集群环境。让我们逐一解释这些步骤的目的和应用场景&#xff1a; 1. 启动 PostgreSQL 服务 systemctl start postgr…...

视频汇聚/音视频流媒体视频平台/视频监控EasyCVR分享页面无法播放,该如何解决?

国标GB28181安防视频监控/视频集中存储/云存储EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统…...

机器学习-逻辑回归

一、引言 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛应用于分类问题的监督学习算法。尽管名字中含有“回归”二字&#xff0c;但这并不意味着它用于解决回归问题。相反&#xff0c;逻辑回归专注于解决二元或多元分类问题&#xff0c;如邮件是垃圾邮件还是…...

Edge调用Aria2下载

一、准备工作 1、Edge浏览器&#xff1a;Windows系统自带或点击下载&#xff1b;   2、Aria2 gui&#xff1a;点击github下载或自行搜索下载其他版本&#xff1b; 二、启动Aria2 gui 解压下载的Aria2 gui到任意目录&#xff0c;点击“Aria2c启动器”或“AriaNg启动器”皆可。…...

解密QQ号——C语言

题目&#xff1a; 有一串已加密的数字“6 3 1 7 5 8 9 2 4”解密规则&#xff1a;首先将第1个数字删除&#xff0c;紧接着将第2个数字放到这串数字的末尾&#xff0c;再将第3个数字删除并将第4个数字放到这串数字的末尾&#xff0c;再将第5个数删除 代码实现&#xff1a; #inc…...

三、jvm中的对象及引用

一、对象在jvm的创建过程 检查加载-->分配内存-->内存空间初始化-->设置-->对象初始化 1) 检查加载 首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查类是否已经被加载、解析和初始化过。 虚拟机遇到一条 new 指令时&#xf…...

Docker网络架构介绍

本文主要介绍了Docker容器的单机网络架构与集群网络架构&#xff0c;辅以演示&#xff0c;并简单介绍了网络管理中的命令。 前文&#xff1a; Docker的安装与简单操作命令-CSDN博客 docker网络原理介绍 与ovs类似&#xff0c;docker容器采用veth-pair linux bridge (虚拟交…...

Android studio新版本aar包导入项目中配置

目录 1、so、aar导入在项目build.gradle中配置 2、新版本迁移到setting.grade配置 1、so、aar导入在项目build.gradle中配置 repositories {flatDir {dirs libs} }2、新版本迁移到setting.grade配置 flatDir {dirs libs } 如下图所示 pluginManagement {repositories {gra…...

HBase-架构与设计

HBase架构与设计 一、背景二、HBase概述1.设计特点2.适用场景2.1 海量数据2.2 稀疏数据2.3 多版本数据2.4 半结构或者非结构化数据 三、数据模型1.表逻辑结构2.RowKey3.Column Family4.TimeStamp5.存储结构 四、HBase架构图1.Client2.Zookeeper3.HMaster4.HRegionServer5.HRegi…...

SpringBoot基础系列:工具类使用

断言 Assert // 要求参数 object 必须为非空&#xff08;Not Null&#xff09;&#xff0c;否则抛出异常&#xff0c;不予放行 // 参数 message 参数用于定制异常信息。 void notNull(Object object, String message) // 要求参数必须空&#xff08;Null&#xff09;&#xff…...

使用 nohup java - jar 不输出日志

要在使用nohup java -jar命令时不输出日志&#xff0c;可以将标准输出和标准错误输出重定向到特殊设备文件/dev/null。这样做将会丢弃所有的输出。 以下是在Linux中使用nohup java -jar命令并禁止输出日志的示例&#xff1a; 复制代码 nohup java -jar your-application.jar …...

前端开发学习 (五) 生命周期函数、Ajax请求

关于vue实例的声明周期&#xff0c;从Vue实例创建、运行、到销毁期间&#xff0c;总是伴随着各种各样的事件&#xff0c;这些事件&#xff0c;统称为生命周期 &#xff08;https://cn.vuejs.org/v2/guide/instance.html#实例生命周期 &#xff09; 而声明周期勾子就是生命周期…...

TypeScript中的单件设计模式

基本概念 &#xff08;1&#xff09; 了解设计模式 设计模式通俗的讲&#xff0c;就是一种更好的编写代码方案&#xff0c;打个比喻&#xff1a;从上海到武汉&#xff0c;你可以选择做飞机&#xff0c;做轮船&#xff0c;开车&#xff0c;骑摩托车多种方式&#xff0c;把出行…...

【无标题】安装环境

这里写目录标题 清华镜像加速 安装cuda11.3 PyTorch 1.10.1https://pytorch.org/get-started/previous-versions/[如果没有可以点Previous pyTorch Versions&#xff0c;这里面有更多的更早的版本](https://pytorch.org/get-started/locally/) 复制非空文件夹cp: -r not specif…...

一. 初识数据结构和算法

数据结构与算法是一个达到高级程序员的敲门砖。当你脱离了语言的应用层面&#xff0c;去思考他的设计层面时&#xff0c;你就依旧已经开始初识数据结构与算法了 数据结构 什么是数据结构 对于数据结构的定义官方并没有统一的解释&#xff0c;在各个百科以及算法的书中&#xf…...

Anaconda 虚拟环境创建后,切换Python 版本

Anaconda 虚拟环境创建后&#xff0c;Python 版本可以更换&#xff01;完全不用删除重建环境&#xff0c;一行命令就能直接修改 / 切换 Python 版本&#xff0c;非常方便。一、切换 Python 版本的命令先激活你的虚拟环境&#xff0c;再执行升级 / 降级命令&#xff1a;1. 先激活…...

用VNA实测滤波器群时延:手把手教你避开IQ信号失真的坑(附校准技巧)

射频滤波器群时延实战&#xff1a;VNA测量技巧与IQ信号保真解决方案 在无线通信系统设计中&#xff0c;滤波器的群时延特性往往是被忽视的关键参数。许多工程师在评估滤波器性能时&#xff0c;主要关注插入损耗、带外抑制等传统指标&#xff0c;却忽略了群时延波动可能导致的信…...

OpenClaw健康助手:Qwen3-32B分析智能穿戴数据生成周报

OpenClaw健康助手&#xff1a;Qwen3-32B分析智能穿戴数据生成周报 1. 为什么需要本地化健康数据分析 去年我开始使用智能手环监测睡眠和运动数据&#xff0c;但很快发现一个问题&#xff1a;所有数据都要上传到厂商云端才能生成报告。作为医疗行业从业者&#xff0c;我深知健…...

不用示波器也能看波形!Keil软件仿真Logic Analyzer的隐藏技巧大公开

不用示波器也能看波形&#xff01;Keil软件仿真Logic Analyzer的隐藏技巧大公开 在嵌入式开发中&#xff0c;调试GPIO波形是每个工程师都会遇到的场景。传统方式需要依赖示波器或逻辑分析仪&#xff0c;但硬件设备不仅成本高昂&#xff0c;还受限于使用环境。Keil MDK内置的Log…...

嵌入式工程师的中年危机与转型策略

1. 嵌入式工程师的中年危机&#xff1a;一个行业的缩影44岁的梧桐&#xff0c;一位拥有21年嵌入式开发经验的资深架构师&#xff0c;在2023年的寒冬里收到了人生第一封解约通知书。这个场景让我想起公司上周的招聘会——38岁的候选人简历被默默放进了"待定"文件夹&am…...

学术研究加速器:OpenClaw+千问3.5-27B自动整理参考文献

学术研究加速器&#xff1a;OpenClaw千问3.5-27B自动整理参考文献 1. 为什么需要自动化文献管理 作为一名经常需要阅读大量论文的研究者&#xff0c;我过去每周要花至少3小时手动整理参考文献。从下载PDF、提取元数据到生成BibTeX条目&#xff0c;这些重复性工作不仅枯燥&…...

AVR单片机Vcc电压精确测量库MCUVoltage

1. 项目概述MCUVoltage 是一款专为嵌入式系统设计的轻量级电压监测库&#xff0c;其核心目标是在不增加任何外部硬件的前提下&#xff0c;精确测量微控制器供电电压&#xff08;Vcc&#xff09;。该库并非依赖外部分压电阻或专用ADC芯片&#xff0c;而是深度挖掘AVR系列MCU内部…...

2026届学术党必备的降重复率平台推荐榜单

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 正在逐渐发生改变的是学术写作模式&#xff0c;借助的是人工智能论文工具&#xff0c;它的核…...

解决Python SocketIO客户端连接问题

引言 在构建一个IT自动化系统时,管理多个电脑的需求日益增强。为了实现这一目标,我采用了以下技术栈: 前端:React 后端****中间层:NodeJS 终端代理:Python 然而,在使用Python实现SocketIO客户端时,我遇到了一个问题:Python客户端无法正常打印连接成功的消息。本文将详…...

保姆级教程:用AutoDL租4090显卡,在PyCharm里远程复现具身智能论文PAI0(附完整避坑清单)

零基础实战&#xff1a;AutoDLPyCharm复现PAI0具身智能论文全流程指南 第一次接触云端GPU服务器和远程开发&#xff1f;别担心&#xff0c;这篇教程会手把手带你用AutoDL租用4090显卡&#xff0c;并通过PyCharm实现无缝远程开发&#xff0c;完整复现具身智能领域的前沿论文PAI0…...