显示器分类
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读写简化代码
写数据代码:
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位:可以控制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
读颜色的简化代码:
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_data、lcd_wr_regno、lcd_write_reg、lcd_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字库!