初学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字库!

相关推荐
ACP广源盛1392462567314 小时前
GSV2231@ACP# 增强型 8K MST 多屏扩展芯片
大数据·人工智能·分布式·嵌入式硬件
国科安芯1 天前
航天器多路并联大功率电源系统设计与ASP4644均流特性分析
单片机·嵌入式硬件·fpga开发·安全性测试
茯苓gao1 天前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
梁朝辉1 天前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者1 天前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间1 天前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious1 天前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng2 天前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计2 天前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
kebidaixu2 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片详解
stm32