本帖最后由 KA_IX 于 2021-4-15 15:44 编辑

一.首先介绍液晶显示器的特点
具有省电,体积小的特点,共分为三种类型:字段型,字符型,点阵图形型
1.字段型:是以长条状组成的字符显示,主要用于数字显示,也可以用于显示细纹字母或者某些字符。,广泛应用于电子表,计算机,电子仪表中。
2.字符型:用于显示字母,数字,字符。在单片机系统中广泛应用。
3.点阵图形型:广泛应用于图片显示,比如笔记本电脑,彩色电视,游戏机等。

二,LCD1602液晶显示模块介绍

1.字符型液晶显示模块LCD1602的特性与引脚
目前市场上的字符型LCD1602模块常用的有16字*1行,16字*2行,20字*2行,20字*4行等模块。,市场上常用的型号有***1602,***/1604,***2002等。其中***为商标名,16代表液晶显示器每行可以显示16个字符,02表示显示2行。LCD1602内部具有字符库ROM,能显示出192个字符。

2.LCD1602外形特征
448e425fbb4b43c79a574ef239c2bb8f?from=pc.jpg
1602外形

①显示
LCD1602是显示模块,主要作用当然是显示了。既然是显示,我们可以想一想,无非就是两个内容:
第一点:你打算让它在哪里显示(显示位置)
第二点:你要显示什么内容 (显示内容)
很明显,这两点都是来自于单片机的控制,单片机让它显示什么它就显示什么,单片机让它在哪里显示它就在哪里显示。这一句话也可以换个说法,比如单片机'告诉'LCD1602模块:请你在第1行的第4个位置,显示字符‘A'. 所谓'告诉',也即是单片机与LCD1602模块进行'沟通'。类比一下我们平时的"沟通",比如打电话,是不是一上来就开始谈论主题了。当然不是,先要发出一信号,比如"喂",打个招呼,确定对方能收到信号后才开始谈论主题。当然也有些人会嘘寒问暖几句才开始正题谈话。
总之,在'沟通'之前要有个'打招呼'的过程。对于单片机与LCD1602的'沟通'也一样,同样需要先'打个招呼',只不过我们这里换了个说法叫做"初始化"。
这样整个思路就出来了:
第一步:初始化 (单片机先跟1602打个招呼)
第二步:确定显示位置 (单片机告诉1602在哪里显示)
第三部:确定显示内容 (单片机告诉1602显示什么内容)

②确定显示位置
如何确定显示位置呢?前面说了显示位置就是2行,每一行16个空格,这样一共是32个空格。那么单片机如何告诉LCD1602在哪个空格显示呢?注意到单片机和LCD1602都是机器,既然是机器之间的沟通当然要使用机器语言了。既然是机器语言无非就是0和1组成的语言。那么现在的问题就是如何通过0和1来确定显示位置。这个就比较容易了,比如我只使用一个位的话,那么就只能确定两个位置,用0来表示第一行的第一个空格显示,用1来表示第一行的第2个空格显示。前面说了,1602有32个空格,很明显一个位肯定不够用。同样的道理,采用两个位的话就是4种组合,也就是可以确定4个空格,三个位的话就是8个空格,仍然不够用。那么就继续增加位数,五个位就够了。比如当单片机发送00000这个信息给1602时就表示要它在第1行的第1个空格显示,00001表示在第1行的第2个空格显示,依此类推。但是通常机器之间的沟通是以字节(8位)为最小单位的,这样我们就能通过8位0和1的组合确定显示位置。至于具体的组合方式对应着什么位置就要查看厂家提供的说明书了。
0d03ebf531fe4aff888489542bb024e6?from=pc.jpg

③显示内容

下的一个问题就是如何确定显示内容。同样显示什么内容也是通过8位的0和1的组合来完成的,这8位不同的组合形式就对应着不同的显示内容,具体如下图所示
852ea9cf770e406e9df1f4a56d4623a4?from=pc.jpg

3.1602工作形态
094e7041990141d99862968af978847d?from=pc.jpg
1.工作电路
图 1 是字符型模块的电路框图,它由 KS0066、KS0065及几个电阻电容组 成。KS0065 是扩展显示字符用的 (例如:16 个字符× 1 行模块就可不用 KS0065, 16 个字符× 2 行模块就要用 1 片 KS0065)。
d75ba61313994376bd919ebb63dff372?from=pc.jpg
图1

接口方面,有 8 条数据,三条控线。可与微处理器或微控制相连 ,通过送入 数据和指令,就可使模块正常工作,图 2 是模块和微处理器相连的例子。
38bc38a4e54641178b928e2d91110ef2?from=pc.jpg
图2

工作电压在4.5-5.5v一般工作电压是5v,工作电流是2MA分为标准的14引脚与16引脚两种。引脚功能表如下:
b0f054051f584644a3f1eb6d79a562b3?from=pc.jpg
3c33f3b745304464b3c0261626bb07b8?from=pc.jpg
2.电参数
03a4b357213b46e795089b4a11b251b7?from=pc.jpg

三,实践项目——数字钟用1602显示
1.要求
基本要求:用定时/计数器完成简单时钟功能,并利用数码管显示时间,起始时间建议设置为23:59:55,方便观察到零点时显示时间的跳变。
提高部分:可在此基础上,利用独立按键K1-K4实现闹钟、调时等功能。(大家可以试试)
2.设计思路
显示部分仍然可借鉴前面讲过的数码管动态显示子函数。
基本1秒的时间可通过定时计数器(如T0)产生50ms,循环20次,到达1秒;以此类推。设计思路、主函数及中断函数部分可借鉴 中断的使用
3.电路图
f15412d9913745c4a1526183ec0f08bb?from=pc.jpg
4.源代码(数码管显示)
#include <reg51.h>                                 
  • #define uchar unsigned char                                         
  • #define uint unsigned int                                         
  • sbit DUAN=P2^6;
  • sbit WEI=P2^7;
  • sbit K1=P3^4;
  • sbit K2=P3^5;
  • sbit K3=P3^6;
  • sbit K4=P3^7;
  • uchar h,m,s,j=0;
  • uchar data led[]=
  • {2,3,5,9,5,5};
  • uchar data ledwei[6]=
  • {0xdf,0xef,0xf7,0xfb,0xfd,0xfe,};
  • uchar data displaytab[17]=
  • {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  • void delay()
  • {        uchar x,y;
  •         for(x=2; x>0; x--)
  •         for(y=250; y>0; y--);               
  • }
  • void display()
  • {
  •         uchar i;
  •                 for (i=0;i<6;i++)
  •                         {        
  •                                 P0=displaytab[led[i]];
  •                                 DUAN=1;
  •                                 DUAN=0;               
  •                
  •                                 P0=ledwei[i];
  •                                 WEI = 1;
  •                                 WEI = 0;                        
  •                
  •                                 delay();
  •                          P0=0xff;
  •                          WEI = 1;
  •                                 WEI = 0;
  •                                 P0=0x00;
  •                                 DUAN = 1;
  •                                 DUAN = 0;
  •                         }        
  •          }
  • void main()
  • {
  • TMOD=0x01;
  • TH0=(65536-50000)/256;
  • TL0= (65536-50000)%256;
  • EA=1;
  • ET0=1;
  • TR0=1;
  • h=23;
  • m=59;
  • s=55;
  • while(1)
  • {
  • display();
  •          }
  • }
  • void T0_int() interrupt 1
  • {
  • j++;
  • if(j==20)
  • {
  • j=0;
  • s++;
  • if(s==60)
  • {
  • s=0;
  •         m++;
  •         }
  •         if(m==60)
  •         {
  •          m=0;
  •          h++;
  •         }
  •         if(h==24)
  • {
  •         h=0;
  •         }
  • }
  • led[5]=h/10;
  • led[4]=h%10;
  • led[3]=m/10;
  • led[2]=m%10;
  • led[1]=s/10;
  • led[0]=s%10;
  • TH0=(65536-50000)/256;
  • TL0=(65536-50000)%256;
  • }
  • 复制代码
    5.仿真结果展示
    。。。

    6.源代码(1602显示)
    #include<reg51.h>
  • #include<lcd1602.h>
  • #define uchar unsigned char
  • #define         uint unsigned int
  • uchar int_time;
  • uchar second;
  • uchar minute;
  • uchar hour;
  • uchar code date[]=" CHINA ";
  • uchar code time[]=" TIME 23:59:55 ";
  • uchar second=55,minute=59,hour=23;
  • void clock_init()
  • {
  • uchar i,j;
  • for(i=0;i<16;i++)
  • {
  • write_data(date[i]);
  •          }
  • write_com(0x80+0x40);
  • for(j=0;j<16;j++)
  • {
  • write_data(time[j] );
  • }
  • }
  • void write_sfm(uchar wei,uchar date1)
  • {uchar shi,ge;
  • shi=date1/10;
  • ge=date1%10;
  • write_com(0x80+wei);
  • write_data(0x30+shi);
  • write_data(0x30+ge);
  • }
  • void clock_write(uint s,uint m,uint h)
  • {
  • write_sfm(0x47,h);
  • write_sfm(0x4a,m);
  • write_sfm(0x4d,s);
  • }
  • void main()
  • {
  • init1602();
  • clock_init();
  • TMOD=0x01;
  • EA=1;
  • ET0=1;
  • TH0=(65536-46080)/256;
  • TL0=        (65536-46080)%256;
  • TR0=1;
  • int_time=0;
  • second=55;
  • minute=59;
  • hour=23;
  • while(1)
  • {
  • clock_write(second,minute,hour);
  •         }
  • }
  • void T0_interserve(void) interrupt 1 using 1
  • { int_time++;
  • if(int_time==20)
  • {         
  • int_time=0;
  • second ++;
  • }
  • if(second==60)
  • {
  • second=0;
  • minute ++;
  • }
  • if(minute==60)
  • {
  • minute=0;
  • hour ++;
  • }
  • if(hour==24)
  • {
  • hour=0;
  • }
  • TH0=(65536-46080)/256;
  • TL0=        (65536-46080)%256;
  • }
  • 复制代码
    f85f663d3ef043dd97aa76d1e16a2496?from=pc.jpg
    来源:ying悦1SD