第 27 章 LCD—液晶显示

27.1 显示器简介

1.1 液晶显示器
1.2 LED 和 OLED 显示器
1.3 显示器的基本参数

(1) 像素

像素是组成图像的最基本单元要素,显示器的像素指它成像最小的点,即前面讲解液晶原理中提到的一个显示单元。

(2) 分辨率

一些嵌入式设备的显示器常常以“行像素值 x 列像素值”表示屏幕的分辨率。如分辨率 800x480 表示该显示器的每一行有 800 个像素点,每一列有 480 个像素点,也可理解为有 800 列,480 行。

(3) 色彩深度

色彩深度指显示器的每个像素点能表示多少种颜色,一般用“位”(bit) 来表示。如单色屏的每个像素点能表示亮或灭两种状态 (即实际上能显示 2 种颜色),用 1 个数据位就可以表示像素点的所有状态,所以它的色彩深度为 1bit,其它常见的显示屏色深为16bit、24bit。

(4) 显示器尺寸

显示器的大小一般以英寸表示,如 5 英寸、21 英寸、24 英寸等,这个长度是指屏幕对角线的长度,通过显示器的对角线长度及长宽比可确定显示器的实际长宽尺寸。

(5) 点距

点距指两个相邻像素点之间的距离,它会影响画质的细腻度及观看距离,相同尺寸的屏幕,若分辨率越高,则点距越小,画质越细腻。如现在有些手机的屏幕分辨率比电脑显示器的还大,这是手机屏幕点距小的原因;LED 点阵显示屏的点距一般都比较大,所以适合远距离观看。

27.2 液晶控制原理

2.1 液晶面板的控制信号

(1) RGB 信号线

RGB 信号线各有 8 根,分别用于表示液晶屏一个像素点的红、绿、蓝颜色分量。使用红绿蓝颜色分量来表示颜色是一种通用的做法,打开 Windows 系统自带的画板调色工具,可看到颜色的红绿蓝分量值,见图颜色表示法 。常见的颜色表示会在“RGB”后面附带各个颜色分量值的数据位数,如 RGB565 表示红绿蓝的数据线数分别为 5、6、5 根,一共为 16 个数据位,可表示 2^16 种颜色;而这个液晶屏的种颜色分量的数据线都有 8 根,所以它支持 RGB888 格式,一共 24 位数据线,可表示的颜色为 2:sup:24种。

(2) 同步时钟信号 CLK

液晶屏与外部使用同步通讯方式,以 CLK 信号作为同步时钟,在同步时钟的驱动下,每个时钟传输一个像素点数据。

(3) 水平同步信号 HSYNC

水平同步信号 HSYNC(Horizontal Sync) 用于表示液晶屏一行像素数据的传输结束,每传输完成液晶屏的一行像素数据时,HSYNC 会发生电平跳变,如分辨率为 800x480的显示屏 (800 列,480 行),传输一帧的图像 HSYNC 的电平会跳变 480 次。

(4) 垂直同步信号 VSYNC

垂直同步信号 VSYNC(Vertical Sync) 用于表示液晶屏一帧像素数据的传输结束,每传输完成一帧像素数据时,VSYNC 会发生电平跳变。其中“帧”是图像的单位,一幅图像称为一帧,在液晶屏中,一帧指一个完整屏液晶像素点。人们常常用“帧/秒”来表示液晶屏的刷新特性,即液晶屏每秒可以显示多少帧图像,如液晶屏以 60 帧/秒的速率运行时,VSYNC 每秒钟电平会跳变 60 次。

(5) 数据使能信号 DE

数据使能信号 DE(Data Enable) 用于表示数据的有效性,当 DE 信号线为高电平时,RGB 信号线表示的数据有效。

2.2 液晶数据传输时序
2.3 显存

27.3 野火 3.2 寸液晶屏简介

3.1 寸电阻触摸屏实物
3.2 ILI9341 液晶控制器简介
3.3 液晶屏的信号线及 8080 时序

27.4 使用 STM32 的 FSMC 模拟 8080 接口时序

4.1 FSMC 简介
4.1.1 通讯引脚
4.1.2 存储器控制器
4.1.3 时钟控制逻辑

27.5 FSMC 的地址映射

27.6 FSMC 控制异步 NOR FLASH 的时序

27.7 用 FSMC 模拟 8080 时序

27.8 NOR FLASH 时序结构体

(1) FSMC_AddressSetupTime

本成员设置地址建立时间,即 FSMC 读写时序图 FSMC 写 NOR_FLASH 的时序图 中的ADDSET 值,它可以被设置为 0-0xF 个 HCLK 周期数,按 STM32 标准库的默认配置,HCLK 的时钟频率为 72MHz,即一个 HCLK 周期为 1/72 微秒。

(2) FSMC_DataSetupTime

本成员设置数据建立时间,即 FSMC 读写时序图 FSMC 写 NOR_FLASH 的时序图 中的DATAST 值,它可以被设置为 0-0xF 个 HCLK 周期数。

(3) FSMC_DataSetupTime

本成员设置数据建立时间,即 FSMC 读写时序图 FSMC 写 NOR_FLASH 的时序图 中的DATAST 值,它可以被设置为 0-0xF 个 HCLK 周期数。

(4) FSMC_BusTurnAroundDuration

本成员设置总线转换周期,在 NOR FLASH 存储器中,地址线与数据线可以分时复用,总线转换周期就是指总线在这两种状态间切换需要的延时,防止冲突。控制其它存储器时这个参数无效,配置为 0 即可。

(5) FSMC_CLKDivision

本成员用于设置时钟分频,它以 HCLK 时钟作为输入,经过FSMC_CLKDivision 分频后输出到 FSMC_CLK 引脚作为通讯使用的同步时钟。控制其它异步通讯的存储器时这个参数无效,配置为 0 即可。

(6) FSMC_DataLatency

本成员设置数据保持时间,它表示在读取第一个数据之前要等待的周期数,该周期指同步时钟的周期,本参数仅用于同步 NOR FLASH 类型的存储器,控制其它类型的存储器时,本参数无效。

(7) FSMC_AccessMode …

本成员设置存储器访问模式,不同的模式下 FSMC 访问存储器地址时引脚输出的时序不一样,可选 FSMC_AccessMode_A/B/C/D 模式。控制异步 NOR FLASH 时使用 B模式。

这个 FSMC_NORSRAMTimingInitTypeDef 时序结构体配置的延时参数,将作为下一节的 FSMCNOR FLASH 初始化结构体的一个成员。

27.9 FSMC 初始化结构体

(1) FSMC_Bank

本成员用于选择 FSMC 映射的存储区域,它的可选参数以及相应的内核地址映射范围见表可以选择的存储器区域及区域对应的地址范围

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R1vthAPR-1657013283135)(assets/image-20220703160016-uob50fk.png)]

(2) FSMC_DataAddressMux

本成员用于设置地址总线与数据总线是否复(FSMC_DataAddressMux_Enable /Disable),在控制 NOR FLASH 时,可以地址总线与数据总线可以分时复用,以减少使用STM32 信号线的数量。

(3) FSMC_MemoryType

本成员用于设置要控制的存储器类型,它支持控制的存储器类型SRAM、PSRAM以及 NOR FLASH (FSMC_MemoryType_SRAM/PSRAM/NOR)。

(4) FSMC_MemoryDataWidth

本 成 员 用 于 设 置 要 控 制 的 存 储 器 的 数 据 宽 度, 可 选 择 设 置 成 8 或 16 位(FSMC_MemoryDataWidth_8b /16b)。

(5) FSMC_BurstAccessMode

本成员用于设置是否使用突发访问模式 (FSMC_BurstAccessMode_Enable/Disable),突发访问模式是指发送一个地址后连续访问多个数据,非突发模式下每访问一个数据都需要输入一个地址,仅在控制同步类型的存储器时才能使用突发模式。

(6) FSMC_AsynchronousWait

本 成 员 用 于 设 置 是 否 使 能 在 同 步 传 输 时 使 用 的 等 待 信 号(FSMC_AsynchronousWait_Enable/Disable), 在 控 制 同 步 类 型 的 NOR 或 PSRAM时,存储器可以使用 FSMC_NWAIT 引脚通知 STM32 需要等待。

(7) FSMC_WaitSignalPolarity

本成员用于设置等待信号的有效极性,即要求等待时,使用高电平还是低电平(FSMC_WaitSignalPolarity_High/Low)。

(8) FSMC_WrapMode

本成员用于设置是否支持把非对齐的 AHB 突发操作分割成 2 次线性操作(FSMC_WrapMode_Enable/Disable),该配置仅在突发模式下有效。

(9) FSMC_WaitSignalActive

本 成 员 用 于 配 置 在 突 发 传 输 模 式 时, 决 定 存 储 器 是 在 等 待状 态 之 前 的 一 个 数 据 周 期 有 效 还 是 在 等 待 状 态 期 间 有 效(FSMC_WaitSignalActive_BeforeWaitState/DuringWaitState)。

(10) FSMC_WriteOperation

这个成员用于设置是否写使能 (FSMC_WriteOperation_ Enable /Disable),禁止写使能的话 FSMC 只能从存储器中读取数据,不能写入。

(11) FSMC_WaitSignal

本成员用于设置当存储器处于突发传输模式时,是否允许通过 NWAIT 信号插入等待状态 (FSMC_WaitSignal_Enable/Disable)。

(12) FSMC_ExtendedMode

本成员用于设置是否使用扩展模式 (FSMC_ExtendedMode_Enable/Disable),在非扩展模式下,对存储器读写的时序都只使用 FSMC_BCR 寄存器中的配置,即下面的FSMC_ReadWriteTimingStruct 结构体成员;在扩展模式下,对存储器的读写时序可以分开配置,读时序使用FSMC_BCR 寄存器,写时序使用 FSMC_BWTR 寄存器的配置,即后面的 FSMC_WriteTimingStruct 结构体成员。

(13) FSMC_ReadWriteTimingStruct

本 成 员 是 一 个 指 针, 赋 值 时 使 用 上 一 小 节 中 讲 解 的 时 序 结 构 体FSMC_NORSRAMInitTypeDef 设置,当不使用扩展模式时,读写时序都使用本成员的参数配置。

(14) FSMC_WriteTimingStruct

同样地,本成员也是一个时序结构体的指针,只有当使用扩展模式时,本配置才有效,它是写操作使用的时序。对本结构体赋值完成后,调用FSMC_NORSRAMInit 库函数即可把配置参数写入到 FSMC_BCR及 FSMC_BTR/BWTR 寄存器中。

27.10 FSMC—液晶显示实验

10.1 硬件设计
10.2 软件设计
10.2.1 编程要点

(1) 初始化通讯使用的目标引脚及端口时钟;

(2) 使能 FSMC 外设的时钟;

(3) 配置 FSMC 为异步 NOR FLASH 模式以仿真 8080 时序;

(4) 建立机制使用 FSMC 向液晶屏发送命令及数据;

(5) 发送控制命令初始化液晶屏;

(6) 编写液晶屏的绘制像素点函数;

(7) 利用描点函数制作各种不同的液晶显示应用。

10.2.2 代码分析

(1)液晶 LCD 硬件相关宏定义

(2)初始化 FSMC 的 GPIO

(3)配置 FSMC 的模式

(4)向液晶屏写入初始化配置

(5)设置液晶显示窗口

(6)发送像素数据

(7)绘制单个像素点

(8)绘制矩形

(9)设置液晶的扫描方向

(10)液晶屏全局初始化

10.2.3 基本液晶显示例程的 main 函数
 /**
  ******************************************************************************
  * @file    main.c
  * @author  fire
  * @version V1.0
  * @date    2013-xx-xx
  * @brief   LCD显示实验
  ******************************************************************************
  * @attention
  *
  * 实验平台:秉火 F103-指南者 STM32 开发板 
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :http://firestm32.taobao.com
  *
  ******************************************************************************
  */ 
#include "stm32f10x.h"
#include "./usart/bsp_usart.h"
#include "./led/bsp_led.h"
#include "./lcd/bsp_ili9341_lcd.h"


//#define ILI9341_CMD_ADDR  		( uint16_t*)(0x60000000)
//#define ILI9341_DATA_ADDR  	( uint16_t*)(0x60020000)

extern uint16_t Read_Pixel_Format(void);

/*
 * 函数名:main
 * 描述  :主函数
 * 输入  :无
 * 输出  :无
 */
int main(void)
{ 	
	
//	uint32_t temp = 0x6C000000;
//	uint16_t lcd_read_temp;
	
	ILI9341_Init();
	
	LED_GPIO_Config();
	LED_BLUE;
	
	/* 配置串口为:115200 8-N-1 */
	USART_Config();
	printf("\r\n 这是一个LCD实验 \r\n");
	
	
	printf("\r\n0x0C命令返回值测试:0x%x",Read_Pixel_Format());
	ILI9341_Draw_Rec();
	
//	//向LCD发送命令
//	*ILI9341_CMD_ADDR = 0xABCD;
//	*( uint16_t*)(0x60000000) = 0xABCD;
//	
//	//向LCD发送数据
//	*ILI9341_DATA_ADDR = 0x1234;
//	*( uint16_t*)(0x60020000) = 0xABCD;
//	
//	//从液晶屏读取数据
//	lcd_read_temp = *ILI9341_DATA_ADDR;
//	lcd_read_temp = *( uint16_t*)(0x60020000);
//	
//	
//	
//	temp =temp | (1<<(23+1));	
//	
//	printf("\r\nA23为高电平,地址=0x%x",temp);
//	
//	temp = 0x6C000000;
//	
//	temp &=  ~(1<<(23+1));
//	
//	printf("\r\nA23为低电平,地址=0x%x",temp);

	while(1);  
}


void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}
/*********************************************END OF FILE**********************/

10.2.4 液晶坐标方向演示的 main 函数
#include "bsp_ili9341_lcd.h"
#include "usart.h"
void LCD_Direction_Show(void);
void LCD_Test(void);
void Delay(__IO uint32_t nCount);	 //简单的延时函数
/**
* @brief 主函数
* @param 无 
* @retval 无
*/
int main ( void ) 
{ 
 ILI9341_Init (); //LCD 初始化

 USART_Config();

 printf("\r\n ********** 液晶屏显示方向说明程序 *********** \r\n");
 printf("\r\n 本程序不支持中文,显示中文的程序请学习下一章 \r\n");

 while ( 1 ) {
 //展示 LCD 的八种方向模式
 LCD_Direction_Show();
 }
 }


 /* 用于展示 LCD 的八种方向模式 */
 void LCD_Direction_Show(void)
 {

 uint8_t i = 0;
 char dispBuff[100];

 //轮流展示各个方向模式
 for (i=0; i<8; i++) {
 LCD_SetFont(&Font16x24);
 LCD_SetColors(RED,BLACK);

 ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH); /* 清屏,显示全黑 */
 //其中 0、3、5、6 模式适合从左至右显示文字,
 //不推荐使用其它模式显示文字 其它模式显示文字会有镜像效果
 //其中 6 模式为大部分液晶例程的默认显示方向
 ILI9341_GramScan ( i );

 sprintf(dispBuff,"o%d. X --->",i);
 ILI9341_DispStringLine_EN(LINE(0),dispBuff);//沿 X 方向显示文字

 sprintf(dispBuff,"o%d.Y|V",i);
 ILI9341_DispString_EN_YDir(0,0,dispBuff);//沿 Y 方向显示文字

 Delay(0xFFFFFF);

 //显示测试
 // * !!!其中 0、3、5、6 模式适合从左至右显示文字,不推荐使用其它模式显示文字
 //其它模式显示文字会有镜像效果
 LCD_Test();
 }
 }
 
/*用于测试各种液晶的函数*/
void LCD_Test(void)
{
	/*演示显示变量*/
	static uint8_t testCNT = 0;	
	char dispBuff[100];
	
	testCNT++;	
	
	LCD_SetFont(&Font8x16);
	LCD_SetColors(RED,BLACK);

  ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);	/* 清屏,显示全黑 */
	/********显示字符串示例*******/
  ILI9341_DispStringLine_EN(LINE(0),"BH 3.2 inch LCD para:");
  ILI9341_DispStringLine_EN(LINE(1),"Image resolution:240x320 px");
  ILI9341_DispStringLine_EN(LINE(2),"ILI9341 LCD driver");
  ILI9341_DispStringLine_EN(LINE(3),"XPT2046 Touch Pad driver");
  
	/********显示变量示例*******/
	LCD_SetFont(&Font16x24);
	LCD_SetTextColor(GREEN);

	/*使用c标准库把变量转化成字符串*/
	sprintf(dispBuff,"Count : %d ",testCNT);
  LCD_ClearLine(LINE(4));	/* 清除单行文字 */
	
	/*然后显示该字符串即可,其它变量也是这样处理*/
	ILI9341_DispStringLine_EN(LINE(4),dispBuff);

	/*******显示图形示例******/
	LCD_SetFont(&Font24x32);
  /* 画直线 */
  
  LCD_ClearLine(LINE(4));/* 清除单行文字 */
	LCD_SetTextColor(BLUE);

  ILI9341_DispStringLine_EN(LINE(4),"Draw line:");
  
	LCD_SetTextColor(RED);
  ILI9341_DrawLine(50,170,210,230);  
  ILI9341_DrawLine(50,200,210,240);
  
	LCD_SetTextColor(GREEN);
  ILI9341_DrawLine(100,170,200,230);  
  ILI9341_DrawLine(200,200,220,240);
	
	LCD_SetTextColor(BLUE);
  ILI9341_DrawLine(110,170,110,230);  
  ILI9341_DrawLine(130,200,220,240);
  
  Delay(0xFFFFFF);
  
  ILI9341_Clear(0,16*8,LCD_X_LENGTH,LCD_Y_LENGTH-16*8);	/* 清屏,显示全黑 */
  
  
  /*画矩形*/

  LCD_ClearLine(LINE(4));	/* 清除单行文字 */
	LCD_SetTextColor(BLUE);

  ILI9341_DispStringLine_EN(LINE(4),"Draw Rect:");

	LCD_SetTextColor(RED);
  ILI9341_DrawRectangle(50,200,100,30,1);
	
	LCD_SetTextColor(GREEN);
  ILI9341_DrawRectangle(160,200,20,40,0);
	
	LCD_SetTextColor(BLUE);
  ILI9341_DrawRectangle(170,200,50,20,1);
  
  
  Delay(0xFFFFFF);
	
	ILI9341_Clear(0,16*8,LCD_X_LENGTH,LCD_Y_LENGTH-16*8);	/* 清屏,显示全黑 */

  /* 画圆 */
  LCD_ClearLine(LINE(4));	/* 清除单行文字 */
	LCD_SetTextColor(BLUE);
	
  ILI9341_DispStringLine_EN(LINE(4),"Draw Cir:");

	LCD_SetTextColor(RED);
  ILI9341_DrawCircle(100,200,20,0);
	
	LCD_SetTextColor(GREEN);
  ILI9341_DrawCircle(100,200,10,1);
	
	LCD_SetTextColor(BLUE);
	ILI9341_DrawCircle(140,200,20,0);

  Delay(0xFFFFFF);
  
  ILI9341_Clear(0,16*8,LCD_X_LENGTH,LCD_Y_LENGTH-16*8);	/* 清屏,显示全黑 */

}


void Delay(__IO uint32_t nCount)	 //简单的延时函数
{
	for(; nCount != 0; nCount--);
}

其他参数配置:在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

入世浮尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值