常说的有LCD液晶和LED液晶
通常是背光源不同,LCD液晶的液晶面板是LCD的,背光源是荧光灯做的,LED液晶的面板也是LCD做的,背光源是LED灯做的。
看到的这个暗黄色的就是液晶面板,如果没有背光,显示效果就是这样
有背光是下面这种
背光面板就是一个发光源,它的发光把液晶面板上所显示的内容照亮。
LCD的发光体就是这个荧光管。通过背光板扩散均匀,照亮整个液晶面板。
而LED液晶的背光源就是LED灯组成的,由多个LED灯组成的背光源去照亮整个面板。LED显示器基本上已成为主流的了,如液晶电视,手机电脑等。
LCD的动态对比度等各种参数没有LED的做的好。
1602:横着可以显示16个字符(方格),竖着可以显示两行。
显示原理,每个方格里面有很多小格子(横着5个,竖着7个),通过编程让某些显示,某些不显示,来显示我们需要的内容。
1604液晶:横16个字符,竖4行
2004液晶:横20个字符,竖4行
这都不能显示汉字,因为点数不够。当然可以显示很简单的。
12232液晶:122*32个点组成的液晶,横着可以显示122个,竖着32个点
12864液晶:横128,竖64个点
学会了1602,这些基本都是没有什么差别的
这个也是12864,很少见了,实际只有1个硬币那么大。
这种是许多初学者都愿意学的彩屏的液晶。作为51单片机不建议使用,尤其是stc89c52,晶振11.0592MHz,如果要显示这么一张图片可能要接近一分钟的时间,因为图片信息量很大,分辨率也高,每一个像素格子又要由我们确定显示三原色的哪几种。
像增强型51单片机,如stc15,晶振主频是1t的,比我们传统的快12倍,显示这种图片仍然要几秒钟。
像这种液晶一般在嵌入式的32位用。
开始学习,这次不看ppt,直接看中文使用手册。
液晶内部有一个芯片,出来单片机发给它的数据,让液晶面板显示,芯片有一个工作电压要求4.5~5.5V。
一共16个脚
VL:液晶显示偏压信号,对比度调节端。
8个脚传输数据,叫做并行传输。
背光板里面有发光管,也是需要电源的。
外形尺寸就是在我们要设计产品时我们要确定1602的外形尺寸。显示液晶通常是漏在外壳外面的。
还有一个作用是在我们画PCB板是要用到。接上去后不能和旁边的区间冲突
例如第一个读状态,我们根据时序输入完后,然后1602就把1个字节数据发给数据接口,发回的是状态字,返回液晶现在的一个状态,单片机根据状态判断接下来要怎么操作。
我们看状态字,sta0-6返回当前地址指针的数值。
每个方格都有一个对应的地址。
sta7为读写操作使能,读这个液晶忙不忙,如果返回0,就不忙,如果是1,表示液晶正在处理数据,无法接受单片机发给他的数据。
RAM缓冲区意思是我们一共可以送80个字节的数据放在RAM显示区里,但实际能显示的只有00~0F,40~4F,这32个字节,其它的显示不了, 但也是存在RAM里。
但液晶提供了这么一种指令,例如左移显示或者右移显示,例如就把10的内容移到显示区域里显示。
设置了显示模式后,必须开显示,也就是D=1,才能显示。
这里不检测忙不忙,只是延时,然后不管忙不忙都开始写东西,等下我们可以不用这些延时,直接检测忙不忙,不忙才写程序忙就不写。
总线型就是串行,我们不看,我们用的并行的。
这里我们背光源的负极直接接地,没接10欧姆电阻。可以不接。
实际背光调节端我们可以接1.5K电阻接地,就已经很清晰了。设置电位器目的可能是不同厂家的1602,它的电路组成参数可能不一样。
液晶背面有画好的焊盘,没有焊接,厂家预留,为了以后升级或扩展功能用的。
其实这里根据我们使用的这个硬件,根本不用考虑这个时序参数,因为我们硬件处理一次,即一个机器周期的时间1.085us,如果要是使用32位的那些快的单片机就需要考虑了。
我们可以完全按照这个时序,但等下我们稍微精简了下。
每次读写前都先对液晶检测忙不忙,如果不忙才可以操作。
1 #include <reg52.h> 2 3 #define uchar unsigned char 4 #define uint unsigned int 5 6 sbit RS=P3^5; 7 sbit RW=P3^6; 8 sbit EN=P3^4; 9 10 //判断液晶忙不忙,如果忙则等待 11 void Read_Busy() 12 { 13 uchar busy; 14 P0=0xff;//1602都是从P0给我们输出数据的,所以为了接收数据的正确性,先把P0全部拉高。 15 RS=0; 16 RW=1; 17 do 18 { 19 EN=1; 20 busy=P0; 21 EN=0;//不使用的时候把使能端释放,为了接下来读写数据,因为都需要高脉冲。 22 }while(busy&0x80);//只判断最高位,如果为1,则忙,就继续判断,直到不忙 23 } 24 //写LCD1602命令,写一个字节 25 void Write_Cmd(uchar cmd) 26 { 27 Read_Busy();//判断忙不忙 28 RS=0; 29 RW=0; 30 P0=cmd; 31 EN=1; 32 EN=0; 33 } 34 //写一个字节数据 35 void Write_Dat(uchar dat) 36 { 37 Read_Busy(); 38 RS=1; 39 RW=0; 40 P0=dat; 41 EN=1; 42 EN=0; 43 } 44 void main() 45 { 46 Write_Cmd(0x38);//显示模式16*2 47 Write_Cmd(0x0c);//开显示D=1 48 Write_Cmd(0x06);//地址指针自动加一 49 Write_Cmd(0x01);//清屏 50 Write_Cmd(0x80);//设置数据地址指针 51 Write_Dat(0x48);//0x48:H,显示是以16进制asc码显示,1+'0':1 52 while(1); 53 }
这里1+'0',不能把'0'写成字符串,如:"0",这样会显示g,是一个错误的
如果N=0(地址指针自动减1),这里试了没用,因为清屏后指针效果消除了,所以要放在清屏后面
学习指针