2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6

news2024/11/24 2:00:31

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,失能JTAG

    GPIO_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);  //GPIOA
    GPIO_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);      //GPIOB
    GPIO_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 read
    lcddev.id = LCD_RD_DATA();          //读到0X00
    lcddev.id = LCD_RD_DATA();          //读取0X93
    lcddev.id <<= 8;
    lcddev.id |= LCD_RD_DATA();         //读取0X41

    printf(" 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);	 	//串口初始化为9600
	LED_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的配置基本就可以完成本次的移植操作了,后面就可以在此基础上显示各种内容了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1289217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【力扣】54. 螺旋矩阵

题解&#xff1a; 这里当然就不能只是通过双循环来解题了&#xff0c;因为会烦死。这道题的关键点在于左右边界的确定&#xff0c;参考官方解题法在这里写出我的解题思路。 首先看图&#xff0c;螺旋且顺时针&#xff0c;所以我们可以先遍历从左至右的&#xff0c;上边界加一…

[原创][2]探究C#多线程开发细节-“线程的无顺序性“

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delph…

【2023全网最全教程】web自动化测试入门

一、自动化测试基本介绍 1 自动化测试概述&#xff1a; 什么是自动化测试&#xff1f;一般说来所有能替代人工测试的方式都属于自动化测试&#xff0c;即通过工具和脚本来模拟人执行用例的过程。 2 自动化测试的作用 减少软件测试时间与成本改进软件质量通过扩大测试覆盖率…

大数据:sql,数据挖掘刷题

大数据&#xff1a;sql 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&…

Java 线程池到底是如何复用线程的

原理概述 其实 Java 线程池的实现原理很简单&#xff0c;说白了就是一个线程集合 workerSet 和一个阻塞队列 workQueue。 当用户向线程池提交一个任务时&#xff0c;线程池会先将任务放入 workQueue 中。workerSet 中的线程会不断的从 workQueue 中获取线程然后执行。当 work…

U3 词法分析

文章目录 一、定义1、任务2、构造3、输出形式 二、&#xff08;有穷状态&#xff09;自动机三、正则文法和状态图四、词法分析程序流程1、单词及内部表示2、词法分析程序需要引用的公共&#xff08;全局&#xff09;变量和过程 五、自动机1、DFA&#xff08;确定的有穷状态自动…

深耕中国成分,柳丝木打造茶小光IP赋能乡村振兴

随着全球可持续性发展理念的增强&#xff0c;越来越多品牌在行商业化道路之外&#xff0c;开始思考自身的社会责任&#xff0c;不断参与公益行动&#xff0c;践行ESG理念【Environmental&#xff08;环境&#xff09;、Social&#xff08;社会&#xff09;和 Governance &#…

HASH 哈希算法之MD5 算法

1. 哈希算法&#xff0c;用C 写的 #include <iostream> #include <iomanip> #include <cstring> #include <openssl/md5.h> #include <stdio.h>using namespace std;int main() {string str "hello world";unsigned char digest[MD5…

没有实权的PM如何做好项目管理?

在一些公司中&#xff0c;项目经理&#xff08;PM&#xff09;可能并没有实权&#xff0c;这种情况下如何做好项目管理呢&#xff1f;实际上&#xff0c;即使没有实权&#xff0c;PM仍然可以通过一些方法来确保项目的顺利进行。 首先&#xff0c;PM可以通过建立良好的沟通渠道来…

软著项目推荐 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

《opencv实用探索·十一》opencv之Prewitt算子边缘检测,Roberts算子边缘检测和Sobel算子边缘检测

1、前言 边缘检测&#xff1a; 图像边缘检测是指在图像中寻找灰度、颜色、纹理等变化比较剧烈的区域&#xff0c;它们可能代表着物体之间的边界或物体内部的特征。边缘检测是图像处理中的一项基本操作&#xff0c;可以用于人脸识别、物体识别、图像分割等多个领域。 边缘检测…

Streamlit框架的定制化

Streamlit框架的定制化 最近做了一个关于streamlit框架的项目&#xff0c;颇有感触&#xff0c;所以在这里记录一下。 什么是streamlit? Streamlit 是一个python的WEB UI库&#xff0c;它做了高度的封装以便于不懂后前端开发的人员也能轻松构建画面。你可以从官网进行详细的…

你真的掌握结构体了么?结构体习题(C语言)

前言 上一期博客我们学习了结构体的相关知识&#xff08;上期链接&#xff09;&#xff0c;但是学了不练也是不行的&#xff0c;我们今天讲给大家分享两道有点恶心的题目&#xff0c;让大家来加深对结构体的理解&#xff0c;那么话不多说我们现在开始吧&#xff01; 第一题 有…

zabbix 进阶

zabbix的字段发现机制&#xff1a; zabbix客户端主动和服务端联系&#xff0c;将自己的地址和端口发送服务端实现字段添加监控主机。 客户端是主动一方。 缺点&#xff1a;自定义网段中主机数量太多&#xff0c;登记耗时会很久&#xff0c;而且这个自动发现机制不是很稳定。…

Hadoop学习笔记(HDP)-Part.20 安装Flume

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

AIGC+医疗专题:生成式人工智能于医疗健康

今天分享的是AI系列深度研究报告&#xff1a;《AIGC医疗专题&#xff1a;生成式人工智能于医疗健康》。 &#xff08;报告出品方&#xff1a;AREFACT&#xff09; 报告共计&#xff1a;23页 医疗保健中生成性人工智能的崛起: 在承诺与控制之间导航 Generative Al已经历了大规…

Python-代码块缩进详解

python中&#xff0c;if后面没有&#xff08;&#xff09;&#xff0c;执行代码块也没有{} 而是以&#xff1a;为结尾 代码块以缩进的形式书写&#xff1a; a input("请输入一个整数&#xff1a;") if a 1:print(aaaa) print(bbbb)#此时这一行代码就与判断条件无关…

数据结构-02-链表

相比数组&#xff0c;链表是一种稍微复杂一点的数据结构。掌握起来也要比数组稍难一些。这两个非常基础、非常常用的数据结构。 1-链表结构 数组需要一块连续的内存空间来存储&#xff0c;对内存的要求比较高。如果我们申请一个20MB大小的数组&#xff0c;当内存中没有连续的、…

python打包exe,打包好后,启动exe报错找不到paddleocr

目录 1、安装pyinstaller 2、生成脚本文件的.spce文件 3、资源文件配置 4、生成exe文件 5、使用了paddleocr启动exe后报错 6、配置.spce文件 7、重新生成exe文件 8、关于图片找不到的问题 参考&#xff1a;PaddleOCR打包exe--Pyinstaller_paddleocr 打包exe_mjiansun的博…

智能监控/安防监控视频平台EasyCVR下级更新目录表出现离线情况的两种解决方案

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