初学stm32 --- IO口模拟8080驱动LCD屏

news/2025/1/2 10:20:54/

显示器分类

 LCD简介

Liquid Crystal Display,即液晶显示器,由:玻璃基板、背光、驱动IC等组成。全彩LCD,是一种全彩显示屏(RGB565RGB888),可以显示各种颜色

 

LCD接口分类 

 MCU屏接口由于自带SRAM,驱动简单,大部分单片机都能驱动!

ILI9341芯片

ILI9341芯片支持多种通信接口。MCU接口(8/9/16/18位)、3/4 线SPI接口、RGB接口(6/16/18位)。LCD模组接口由厂家设计的决定

 三基色原理

无法通过其他颜色混合得到的颜色,称之为:基本色通过三基色混合,可以得到自然界中绝大部分颜色!

电脑一般用32位来表示一个颜色(ARGB888):

 单片机一般用16/24位表示一个颜色(RGB565/RGB888):

        RGB565:

         RGB888:

 LCD驱动原理

LCD屏(MCU接口)驱动的核心是:驱动LCD驱动芯片

LCD驱动基本知识:

18080时序,LCD驱动芯片一般使用8080时序控制,实现数据写入/读取

2,初始化序列(数组),屏厂提供,用于初始化特定屏幕,不同屏幕厂家不完全相同

3,画点函数、读点函数(非必需),基于这两个函数可以实现各种绘图功能!

LCD驱动的一般过程

1. 8080底层操作函数:        写数据、写命令、读数据

2. 初始化LCD:        主要是发送初始化序列/数组

3. 实现画点函数:        有了画点函数,就可以实现各种操作函数了!

 4.实现读点函数:        用于读取屏幕颜色,一般上GUI了才用,可不用!

 8080时序简介

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

 

 8080写时序

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

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

 

 8080读写简化代码

写数据代码:

void lcd_wr_data(uint16_t data)
{LCD_RS(1);		/* 操作数据 */LCD_CS(0);		/* 选中 */LCD_DATA_OUT(data);	/* 数据 */LCD_WR(0);		/* WR低电平 */LCD_WR(1);		/* WR高电平 */LCD_CS(1);		/* 释放片选 */
}

读数据代码:

uint16_t  lcd_rd_data(void)
{uint16_t ram;  			/* 定义变量 */LCD_RS(1);              /* 操作数据 */LCD_CS(0);			    /* 选中 */LCD_RD(0);			    /* RD低电平 */ram = LCD_DATA_IN;    	/* 读取数据 */LCD_RD(1);			    /* RD高电平 */LCD_CS(1);			    /* 释放片选 */return ram;			/* 返回读数 */
}

LCD驱动芯片简介

用于控制LCD的各种显示功能和效果,整体功能较复杂。常见型号:ILI9341/ST7789

一般我们只需要:6条指令即可完成对LCD的基本使用(以9341为例)

 ID指令(0XD3

         读取LCD控制器型号,通过型号可以执行不同LCD初始化,以兼容不同LCD

 访问控制指令(0X36

实现GRAM读写方向控制,即:控制GRAM自增方向,从而控制显示方向

MX,MY,MV:共同控制GRAM自增方向(扫描方向)

BGR位:可以控制RGBBGR顺序

MXMYMV扫描方向控制关系

 X坐标设置指令(0X2A

列地址设置指令,一般用于设置X坐标

SC:起始坐标                        EC:结束坐标

设置关系:0SCEC239LCD像素宽度)

Y坐标设置指令(0X2B

页地址设置指令,一般用于设置Y坐标

 SP:起始坐标                EP:结束坐标

设置关系:0SPEP319LCD像素高度)

GRAM指令(0X2C

发送该指令后,数据线变成16位,可以开始写入GRAM数据,支持地址自增

每次写入1个像素点的颜色值(RGB565),地址自增方向由MX/MY/MV控制

无需重新设置坐标,可实现连续写入,大大提高写入速度。

GRAM指令(0X2E

发送该指令后,数据线变成16位,可以开始读取GRAM数据,支持地址自增

1个点的颜色,要读3

1,dummy        2,R1G1        3,B1R2

读颜色的简化代码:

uint16_t r, g, b;
r = lcd_rd_data();
g = lcd_rd_data();
b  = lcd_rd_data();
g = r & 0XFF;
return (((r >> 11) << 11) | ((g >> 2) << 5) | (b >> 11));

读点函数代码(精简)

uint16_t  lcd_rd_data(void)
{uint16_t ram;  		/* 定义变量 */DATA_IN_MODE();	/* 设置数据输入 */LCD_RS(1);              	/* 操作数据 */LCD_CS(0);			/* 选中 */LCD_RD(0);		/* RD低电平 */ram = LCD_DATA_IN;    	/* 读取数据 */LCD_RD(1);		/* RD高电平 */LCD_CS(1);			/* 释放片选 */DATA_OUT_MODE();	/* 设置数据输出 */return ram;		/* 返回读数 */
}
uint16_t  lcd_read_point (uint16_t x, uint16_t y)
{uint16_t r = 0, g = 0, b = 0;	/* 定义变量 */lcd_set_cursor(x, y);		/* 设置坐标 */lcd_wr_regno(0X2E);		/* 发读点命令 */r = lcd_rd_data();  		/* 假读 */r = lcd_rd_data();  		/* 读rg */b = lcd_rd_data(); 		/* 读b */g = r & 0XFF;       			/* 得到g值 */return (((r >> 11) << 11) | ((g >> 2) << 5) | (b >> 11));
}

LCD基本驱动实现

目标:用最简单代码,点亮开发板LCD屏,实现任意位置画点和读点

 1,确定IO连接关系

LCD模块原理图、开发板液晶接口原理图

2,初始化IO

初始化连接LCD的各个IO

3,初始化FSMC外设 

可选,某些芯片是没有FSMC外设,MINI板是没有的

4,编写读写接口函数

lcd_wr_datalcd_wr_regnolcd_write_reglcd_rd_data

 5,编写LCD初始化函数

编写lcd_init函数,完成初始化序列配置,点亮背光等

 6,编写LCD画和读点函数

编写lcd_draw_point函数,实现LCD任意位置画点

硬件IO连接关系

LCD控制结构体简介

/* 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;

ASCII字库制作(16*16

使用PCtoLCD2002.exe软件制作ASCII字库!

 


http://www.ppmy.cn/news/1559528.html

相关文章

第二章:算法练习题2

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

Linux高并发服务器开发 第六天(rwx 对于目录和文件的区别 gcc编译器 动态库静态库)

目录 1.rwx 对于目录和文件的区别 2.gcc 编译器 2.1编译过程 2.2gcc 的其他参数 3.动态库和静态库 3.1函数库 1.rwx 对于目录和文件的区别 r 文件的内容可以被查看。支持cat、more、head...vim &#xff1b;目录的内容可以被查看。ls、tree …

玛哈特矫平机助力其龙机械,引领汽摩配件制造技术升级

在智能制造的浪潮中&#xff0c;传统制造业正经历着转型升级的重要机遇。重庆其龙机械制造有限公司&#xff08;以下简称“其龙机械”&#xff09;紧跟时代步伐&#xff0c;通过引入玛哈特数控高精密矫平机&#xff0c;实现了汽摩配件矫平工艺的升级&#xff0c;展现了智能制造…

Flask 与 SocketIO 正确初始化及最佳实践调试

1、问题 我使用Flask和Flask-SocketIO 来做 Websocket 链接。前期正常使用&#xff0c;但是后期布置修改什么导致Websocket连接失败。排查需求&#xff0c;才发现初始化不正常导致。 SocketIO 和 Flask 应用的初始化顺序和引用循环的问题 2、环境 python-engineio4.11.1 py…

探索 Java 微服务的新趋势:现代工具与最佳实践

引言 随着企业级架构从单体应用逐渐向微服务迁移&#xff0c;Java 在这一领域依然保持了强大的竞争力。从经典框架 Spring Boot 到轻量级的新兴工具&#xff0c;Java 的生态系统不断推出新的方案&#xff0c;以应对微服务架构带来的挑战和复杂性。本文将围绕 Java 微服务的最新…

如何在 Ubuntu 22.04 上安装 Elasticsearch

简介 在本教程中&#xff0c;你将学习如何在 Ubuntu 22.04 服务器上安装 Elasticsearch。此外&#xff0c;你还将学习如何使用 Elasticsearch REST API 索引和操作数据。 Elasticsearch 是一个基于 Apache Lucene Library 的免费分布式搜索和分析引擎。它是一个快速且可扩展的…

扬声器阵列的波束成形相关的关键技术和国内外研究现状

1. 关键技术 扬声器阵列的波束成形技术旨在通过精确控制多个扬声器的输出信号&#xff08;包括延迟、增益和相位等&#xff09;&#xff0c;以实现声音波束的空间定向。这种技术通常应用于声音增强、噪声抑制、3D音频、声场控制等领域&#xff0c;尤其在复杂的声学环境中尤为重…

短视频平台的视频水印怎么去除?

当你看到某个短视频&#xff0c;觉得内容非常有价值&#xff0c;想要个人收藏以便日后学习或回顾&#xff0c;但发现短视频平台无法直接下载且带有水印时&#xff0c;以下提供的几种方法将帮助你轻松去除水印&#xff0c;获取高清无水印的视频内容。 方法一&#xff1a;使用第…