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

相关推荐
jjddzyh27 分钟前
单片机串口控制
单片机·嵌入式硬件
heater40427 分钟前
【STM32】I2C为什么要开漏输出和上拉电阻
stm32·单片机·嵌入式硬件
沐欣工作室_lvyiyi1 小时前
数字PWM直流调速系统设计(论文+源码)
stm32·单片机·嵌入式硬件·物联网·毕业设计
嵌入式小杨2 小时前
阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)
单片机·嵌入式硬件·物联网·学习·面试·硬件工程
小鱼做毕设3 小时前
单片机实物成品-010 智能宠物喂食系统(代码+硬件+论文)
单片机·嵌入式硬件·宠物
逝灮5 小时前
Keil5报错:Error: L6218E: Undefined symbol __initial_sp (referred from entry2.o).
stm32·单片机·嵌入式硬件·keil5·keil5报错
xwz小王子5 小时前
Science Advances:一种多功能软变形和触觉显示器
计算机外设
黑果果的思考5 小时前
STM32 NOR FLASH(SPI FLASH)驱动移植(2)
stm32·嵌入式硬件
Asa3196 小时前
无刷直流电机偏移角度
stm32·单片机·嵌入式硬件
gantengsheng7 小时前
基于51单片机(STC32G12K128)和8X8彩色点阵屏(WS2812B驱动)的小游戏《贪吃蛇》
嵌入式硬件·游戏·51单片机·贪吃蛇·独立按键·8x8彩色点阵屏·矩阵按键