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

显示器分类

LCD****简介

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

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驱动基本知识:

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

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

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

LCD****驱动的一般过程

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

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

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

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

8080****时序简介

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

8080****写时序

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

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

8080****读写简化代码

写数据代码:

cpp 复制代码
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);		/* 释放片选 */
}

读数据代码:

cpp 复制代码
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位:可以控制RGB、BGR顺序

MX、MY、MV扫描方向控制关系

X****坐标设置指令(0X2A

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

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

**设置关系:**0≤SC≤EC≤239(LCD像素宽度)

Y****坐标设置指令(0X2B

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

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

**设置关系:**0≤SP≤EP≤319(LCD像素高度)

GRAM指令(0X2C

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

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

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

GRAM指令(0X2E

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

读1个点的颜色,要读3次

1,dummy 2,R1G1 3,B1R2

读颜色的简化代码:

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

读点函数代码**(精简)**

cpp 复制代码
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;		/* 返回读数 */
}
cpp 复制代码
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_data、lcd_wr_regno、lcd_write_reg、lcd_rd_data

5,编写LCD初始化函数

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

6,编写LCD画和读点函数

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

硬件IO连接****关系

LCD****控制结构体简介

cpp 复制代码
/* 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字库!

相关推荐
淘晶驰AK7 小时前
电机控制选 STM32 还是 DSP?技术选型背后的现实博弈
stm32·单片机·嵌入式硬件
Fxrain9 小时前
[嵌入式实验]实验二:LED控制
stm32·单片机·嵌入式硬件
~夕上林~9 小时前
单片机——keil5
单片机·嵌入式硬件
电子科技圈11 小时前
XMOS以全新智能音频及边缘AI技术亮相广州国际专业灯光音响展
人工智能·嵌入式硬件·mcu·物联网·自然语言处理·音视频·边缘计算
promising-w11 小时前
【stm32开发板】原理图设计(电源部分)附:设计PCB流程
stm32·单片机·嵌入式硬件
XINVRY-FPGA12 小时前
XCVP1902-2MSEVSVA6865 Xilinx FPGA Versal Premium SoC/ASIC
嵌入式硬件·安全·阿里云·ai·fpga开发·云计算·fpga
文弱书生65614 小时前
ElectronBot复刻-电路测试篇
嵌入式硬件
似是燕归来15 小时前
STM32 HAL库函数学习 GPIO篇
stm32·单片机·学习
学渣6765617 小时前
vscode调试stm32,Cortex Debug的配置文件lanuch.json如何写,日志
vscode·stm32·json
平凡灵感码头17 小时前
STM32 启动文件详解:理解单片机启动的“引导者”
stm32·单片机·嵌入式硬件