51单片机学习笔记(清翔版)(25)——LCD1602和指针

常说的有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),这里试了没用,因为清屏后指针效果消除了,所以要放在清屏后面

 

 


学习指针

 

posted @ 2019-05-12 22:35  裂缘冰释  阅读(1055)  评论(0编辑  收藏  举报