LED驱动原理办法解析:
(1)被迫矩阵LCD技能
高信息密度显现技能中首要商品化的是被迫矩阵显现技能,它得名于操控液晶单元的开和关的简略规划。被迫矩阵液晶显现的驱动办法是由笔直与水平方向的电极所构成的,且将独自的液晶单元夹在互相笔直的电极中心。因而,任何一组电极的驱动就会在特定的单元中引起电流经过。
被迫矩阵显现画面的原理是用输入的信号顺次去驱动每一排的电极,所以当某一排被选定的时分,列向上的电极将被触发用于翻开坐落排和列穿插上的那些像素。这种办法比较简略,并且对液晶屏幕本钱的添加也不多。不过其存在的缺陷是:假如有太大的电流经过某个单元,邻近的单元都会受到影响,会引起虚影;假如电流太小,单元的开和关就会变得缓慢,会下降对比度和丢掉移动画面的细节。
前期的被迫矩阵板依赖于改动向列的规划。其上层和基层的偏光板的偏振光方向呈90°,因而中心的液晶以90°进行改动。这样制作的液晶板对比度很低,呼应时刻也很慢。这种办法运用在低信息量显现时作用很好,但不合适计算机显现。
超改动向列(Super Twisted NemaTIc)办法是经过改动液晶资料的化学成分,使液晶分子发生不止一次的改动,使光线改动到达180°到270°,这样便可大大地改进画面的显现质量。20波纪80年代初期,STN技能一度十分盛行,至今它还在便携式电子设备如PDA、移动电话中运用。尽管STN技能提高了显现的对比度,但它会引起光线的颜色误差,尤其是在屏幕违背主轴的方位上。这便是为什么前期的笔记本计算机屏幕总是偏蓝和偏黄的原因。
双层超歪曲向列型显现技能(DSTN)具有两层改动方向相对的LCD层,第二层使得第一层留传的色偏问题得以处理。当然它的制作工艺比前两种办法要杂乱得多。
后来人们发现了比DSTN更简略易行的办法,便是在底层和顶层的外外表加上补偿膜,来改进STN技能中所发生的特定波段光线的散射和反射现象,这便是补偿膜超改动向列(Film-compensated STN,FSTN)显现技能。FSTN的显现作用和DSTN适当,但其价格和工艺难度都大大下降了,所以现在大多数被迫式LCD都选用了FSTN技能。
为了改进选用FSTN技能的LCD显现作用,在20世纪90年代初期提出了双扫描概念。所谓双扫描,便是将面板水平对等地分为两部分,对顶端和底端相对应的部分一起进行扫描,这就大大提高了扫描的频率。双扫描处理了小电流、长时刻运用的情况下常常发生的鬼影现象。和自动矩阵显现比较,它明显提高了对比度、画质,并缩短了呼应时刻,所以现在还广为低价位的笔记本计算机所选用。
(2)自动矩阵LCD技能
选用被迫矩阵LCD技能的最大问题是难以快速地操控独自的液晶单元,并以满足大的电流确保来获得好的对比度、满足的灰阶和较快的呼应时刻,然后影响了动态印象的显现作用。自动矩阵LCD经过独自地操控每个单元,有用地处理了上面的问题。
与被迫矩阵LCD相似,自动矩阵(AcTIveMatrix)LCD的上、下表层也纵横有序地摆放着用铟锡氧化物做成的通明电极。所不同的是在每个单元中都参加了很小的晶体管,由晶体管来操控每个单元回路的开和关。晶体管电极是运用薄膜技能做成的,薄膜晶体管LCD(TFT-LCD)也因而得名。
晶体管能够迅速地操控每个单元,由于单元之间的电搅扰很小,所以能够运用大电流,而不会有鬼影和拖尾现象,更大的电流会供给更好的对比度、更锋利的和更亮堂的图画。
单片机怎么依据LCD时序图来写底层驱动:
单片机怎么依据LCD时序图来写底层驱动
一般来说,LCD 模块的操控都是经过 MCU 对 LCD 模块的内部寄存器、显存进行操作来终究完结的;在此咱们规划了三个根本的时序操控程序,分别是:
(1)写寄存器函数(LCD_RegWrite)
(2)数据写函数(LCD_DataWrite)
(3) 数据读函数(LCD_DataRead)
这三个函数需求严厉的依照 LCD 所要求的时序来编写,下面能够看看 MzL02 模块时序图:
图 3.2 MzL02 模块的 6800 时序暗示
留意:上图是该模块的操控 %&&&&&% 资猜中的原版时序图,其实有些暗示不是太保险(少标出了RW 线信号的要求),或许说是不太谨慎,不过这些不作评论,请看剖析即可;而 EP 的有用触发沿在图中很有或许暗示有误,实测为上升沿。图中 CS1B(CS2)的信号即为片选 CS,RS 即为数据/寄存器的挑选端口 A0 信号,E 为 EP;当作写入寄存器数据操作时,首要要将 A0 置低,以告诉 LCD 模块行将进行的是对寄存器的操作;而 RW 线需求置低,以示行即将进行的是写入的操作;然后片选 CS 信号置低,装载数据至总线,然后在 EP 线上发生一个上升沿以触发 LCD 模块将总线上的数据终究载入;在前面的操作完结后一般都会将各个信号线的状况康复。而数据(显存)写入、数据读出的操作时序也比较相似,这儿就不多作介绍,直接参阅例程即可。
//=======================================================
// 函数: void LCD_RegWrite(unsigned char Command)
// 描绘: 写一个字节的数据至 LCD 中的操控寄存器傍边
// 参数: Command 写入的数据,低八位有用(byte)
// 回来: 无
//======================================================
void LCD_RegWrite(unsigned char Command)
{
LCD_A0 = 0; //A0 置低,暗示进行寄存器操作
LCD_RW = 0; //RW 置低,暗示进行写入操作
LCD_EP = 0; //EP 先置低,以便后边发生跳变沿
LCD_CS = 0; //片选 CS 置低
DAT_PORT = Command; //装载数据置总线
LCD_EP = 1; //发生有用的跳变沿
LCD_CS = 1; //片选置高
}
数据写入以及读出的函数源码如下:
//==========================================================
// 函数: void LCD_DataWrite(unsigned char Dat)
// 描绘: 写一个字节的显现数据至 LCD 中的显现缓冲 RAM 傍边
// 参数: Data 写入的数据
// 回来: 无
//==========================================================
void LCD_DataWrite(unsigned char Dat)
{
LCD_A0 = 1; //A0 置高,暗示进行显存数据操作
LCD_RW = 0; //RW 置低,暗示进行写入操作
LCD_EP = 0; //EP 先置低,以便后边发生跳变沿
LCD_CS = 0; //片选 CS 置低
DAT_PORT = Dat; //装载数据置总线
LCD_EP = 1; //发生有用的跳变沿
LCD_CS = 1; //片选置高
}
//=========================================================
// 函数: unsigned char LCD_DataRead(void)
// 描绘: 从 LCD 中的显现缓冲 RAM 傍边读一个字节的显现数据
// 参数: 无
// 回来: 读出的数据,
//==========================================================
unsigned char LCD_DataRead(void)
{
unsigned char Read_Data;
DAT_PORT = 0xff; //51 的端口想要输入前,要先给端口全置 1
LCD_A0 = 1; //A0 置高,暗示进行显存数据操作
LCD_RW = 1; //RW 置高,暗示进行读出操作
LCD_EP = 0; //EP 先置低,以便后边发生跳变沿
LCD_CS = 0; //片选 CS 置低
LCD_EP = 1; //发生有用的跳变沿
LCD_EP = 0;
Read_Data = DAT_PORT; //读出数据
LCD_CS = 1; //片选置高
return Read_Data; //回来读到的数据
}
以上便是要介绍的最根本的时序操作程序,它们几乎是整个 LCD 驱动程序傍边与底层硬件打交道的代码了,这样的话,当要改动驱动 LCD 的 MCU 端口时或许换用其他 MCU 来驱动 LCD 时,根本上只需求在这些代码里作一下修正即可。
关于读LCD状况
而在一般的 LCD 模块傍边,还有一个功用相同重要,便是读 LCD 状况;能够经过此操作获取当时 LCD 模块的忙状况以及一些相关的状况信息,当 LCD 模块正处于忙状况时,则不宜对它进行数据的写入或读出操作(有许多较旧式的 LCD 操控器规定在忙的状况下时不允许写入或读出数据)。
所以在许多 LCD 的驱动程序傍边,会在寄存器写入、数据写入/读出的操作前参加读取 LCD状况并判别忙状况的代码;这点能够参阅网上撒播的许多 LCD 驱动程序。不过,关于 MzL02这样的较新出的 LCD 操控器来说,现已对忙状况不是很在乎了,或许说影响现已很小乃至没有了;所以咱们在前面的代码傍边并没有参加这样的代码。至于有没有必要加读状况判忙的代码,要视详细的 LCD 操控器而定。
关于时序的时刻要求
时序的一个十分重要的数据便是相似上图中标出的tAS88之类的时刻长短要求,仅仅上图中并没有标出它们的详细最大最小值要求罢了;但在编写这类的时序接口程序时它们仍是十分重要的,当然还要看 MCU 的端口操作速度以及 MCU 的指令履行速度。打个比如,有的时序里就会有要求某些信号的电平坚持最小宽度,而假如 MCU 的指令履行速度以及端口操作速度十分快的话,就需求酌情在接连操作端口的代码之间参加适量的延时(通用用空操作来替代,详细多少个多少时长视详细的 MCU 以及 LCD 操控器而定)以确保该信号的脉冲宽度满足要求。
在本文的所列出的源代码傍边,并没有如前所述的为时序的要求而刺进空操作或延时处理,由于 MCU 的速度并不是十分快,何况现在的 LCD 操控器的总线速度都挺快的了,没有必要参加罢了。