一、概述
LCD即Liquid Crystal Display 的首字母缩写,意为“液态晶体显示器”,即液晶显示器。我们在日常的教学活动中,或者企业的开发当中,对于lcd屏幕的需求是很多的,因为无论利用stm32还是应用stmp157a系统级芯片,都需要输出设备,而lcd就是首选之一。本文将介绍lcd的方方面面,希望能给读者一些有意义的知识和体验。
二、LCD液晶显示器是如何构造的?
LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。LCD已经替代CRT成为主流,价格也已经下降了很多,并已充分普及。
LCD屏幕包括一层薄薄的液晶材料,夹在玻璃基板上的两个电极之间,每侧有两个偏振器。偏振片是一种滤光片,它让特定偏振的光波通过,同时阻挡其他偏振的光波。电极需要透明,因此最受欢迎的材料是ITO(氧化铟锡)。
由于LCD本身不能发光,因此通常将背光放置在LCD屏幕后面,以便在黑暗环境中看到。背光源可以是LED(发光二极管)或CCFL(冷阴极荧光灯)。LED背光最受欢迎。当然,如果你喜欢有彩色显示器,一层滤色片可以做成一个LCD单元。滤色器由 RGB 颜色组成。您还可以在 LCD 前面添加触摸面板。
三、LCD的工作原理是什么
第一个大规模生产的LCD面板技术称为TN(扭曲向列)。LCD背后的原理是,当液晶分子不施加电场时,分子在LCD单元中扭曲90度。当来自环境光或背光的光通过第一偏振器时,光被偏振并被液晶分子层扭曲。当它到达第二个偏振片时,它被阻挡了。查看者看到显示为黑色。
当对液晶分子施加电场时,它们是未扭曲的。当偏振光到达液晶分子层时,光直接穿过而不会被扭曲。当它到达第二个偏振器时,它也会通过,观看者看到显示器是明亮的。由于LCD技术使用电场而不是电流(电子通过),因此功耗低。
四、液晶显示器的基础知识
上面介绍的最基本的LCD称为无源矩阵LCD,主要可以在低端或简单的设备中找到,如计算器,公用事业仪表,早期数字手表,闹钟等。 无源矩阵LCD有很多局限性,例如视角窄,响应速度慢,昏暗,但功耗很大。为了改善缺点,科学家和工程师开发了有源矩阵LCD技术。应用最广泛的是TFT(薄膜晶体管)LCD技术。基于TFT LCD,开发了更现代的LCD技术。最著名的是IPS(平面切换)LCD。它具有超宽视角,卓越的图像图像质量,快速响应,对比度高,老化缺陷少等。IPS液晶显示器广泛应用于液晶显示器,液晶电视,iPhone,平板电脑等。三星甚至彻底改变了LED背光,成为QLED(量子点),以在不需要光线产生更深的黑色的地方关闭LED。
五、不同类型的液晶显示器
扭曲向列显示:TN(扭曲向列)LCD的生产可以最频繁地进行,并在整个行业中使用不同类型的显示器。这些显示器最常被游戏玩家使用,因为与其他显示器相比,它们便宜且响应时间快。这些显示器的主要缺点是它们的质量以及部分对比度,视角和色彩再现。但是,这些设备足以满足日常操作。
平面内切换显示器:IPS显示器被认为是最好的LCD,因为它们提供良好的图像质量,更高的视角,鲜艳的色彩精度和差异。这些显示器主要由平面设计师使用,在其他一些应用中,LCD需要最大的潜在标准来再现图像和颜色。
垂直对齐面板:垂直对齐 (VA) 面板位于扭曲向列和平面内切换面板技术中的中心任何位置。与TN型显示器相比,这些面板具有最佳的视角以及具有更高质量功能的色彩再现。这些面板的响应时间很短。但是,这些更合理,更适合日常使用。
与扭曲的向列显示相比,该面板的结构可生成更深的黑色以及更好的颜色。与TN型显示器相比,几种晶体排列可以提供更好的视角。这些显示器需要权衡,因为与其他显示器相比,它们很昂贵。而且它们的响应时间慢,刷新率低。
高级条纹场切换 (AFFS):与IPS显示器相比,AFFS LCD提供最佳性能和广泛的色彩再现。AFFS的应用非常先进,因为它们可以在不影响宽视角的情况下减少色彩失真。通常,这种显示器用于高度先进和专业的环境中,例如飞机驾驶舱。
无源和有源矩阵显示:无源矩阵型LCD与简单的网格一起工作,因此可以将电荷提供给LCD上的特定像素。一层玻璃层提供列,而另一层玻璃层提供使用透明导电材料(如铟锡氧化物)设计的行。无源矩阵系统具有主要缺点,特别是响应时间慢且电压控制不准确。显示器的响应时间主要是指显示器刷新显示图像的能力。
有源矩阵型LCD主要依赖于TFT(薄膜晶体管)。这些晶体管是小型开关晶体管以及放置在玻璃基板上的矩阵内的电容器。当正确的行被激活时,电荷可以沿着确切的列传输,以便可以寻址特定的像素,因为列相交的所有其他行都被关闭,只需指定像素旁边的电容器获得电荷。
六、与其他显示器相比的优势
LCD技术具有轻,薄,低功耗的巨大优势,使壁挂式电视,笔记本电脑,智能手机,垫子成为可能。在进步的道路上,它消灭了许多显示技术的竞争。我们的办公桌上看不到CRT显示器,家里的等离子显示器电视也不再了。LCD技术现在主导着显示器市场。但任何技术都有局限性。
LCD技术的响应时间较慢,特别是在低温下,视角有限,需要背光。针对LCD的缺点,开发了OLED(有机发光二极管)技术。一些高端电视和手机开始使用AMOLED(有源矩阵有机发光二极管)显示器。与LCD技术相比,这项尖端技术提供了更好的色彩再现,清晰的图像质量,更好的色域,更低的功耗。请注意,OLED显示器包括AMOLED和PMOLED(无源矩阵有机发光二极管)。
七如何用stm32驱动LCD屏幕?
7.1接口:
7.2使用流程图
7.3例题程序
//配置FSMC
void LCD_FSMC_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
FSMC_NORSRAMTimingInitTypeDef writeTiming;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PF10 推挽输出,控制背光
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化PF10
GPIO_InitStructure.GPIO_Pin = (3<<0)|(3<<4)|(7<<8)|(3<<14);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化
GPIO_InitStructure.GPIO_Pin = (0X1FF<<7); //PE7~15,AF OUT
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PG2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PG12
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化
GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC);
readWriteTiming.FSMC_AddressSetupTime = 0XF; //地址建立时间(ADDSET) 16个HCLK 1/168M=6ns*16=96ns
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)
readWriteTiming.FSMC_DataSetupTime = 60; //数据保存时间 60个HCLK= 6*60=360ns
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKpision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;
writeTiming.FSMC_AddressSetupTime =8; //地址建立时间(ADDSET)9个HCLK =54ns
writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间
writeTiming.FSMC_DataSetupTime = 7; //数据保存时间 6ns*9个HCLK=54ns
writeTiming.FSMC_BusTurnAroundDuration = 0x00;
writeTiming.FSMC_CLKpision = 0x00;
writeTiming.FSMC_DataLatency = 0x00;
writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //数据宽度为16bit
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //写使能
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; //读写使用不同的时序
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); //使能Bank1
delay_ms(50);
}